From 1d4295431368fb47087188ad199091b67e280579 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 9 Jan 2022 13:08:03 +0800 Subject: [PATCH 001/242] Batch publish events from outbox to the event bus --- .../PostgreSqlDbContextEventOutbox.cs | 2 +- .../DistributedEvents/DbContextEventOutbox.cs | 11 + .../Azure/AzureDistributedEventBus.cs | 9 +- .../Kafka/KafkaDistributedEventBus.cs | 9 +- .../RabbitMq/RabbitMqDistributedEventBus.cs | 509 ++++++++++-------- .../Rebus/RebusDistributedEventBus.cs | 9 +- .../Distributed/DistributedEventBusBase.cs | 236 ++++---- .../Abp/EventBus/Distributed/IEventOutbox.cs | 2 + .../Distributed/ISupportsEventBoxes.cs | 6 + .../EventBus/Distributed/InboxProcessor.cs | 4 +- .../Abp/EventBus/Distributed/OutboxSender.cs | 21 +- .../MultipleOutgoingEventPublishResult.cs | 14 + .../MongoDbContextEventOutbox.cs | 14 + 13 files changed, 488 insertions(+), 358 deletions(-) create mode 100644 framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventOutbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventOutbox.cs index e5f2e0c4b6..7c5ef12fa7 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventOutbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventOutbox.cs @@ -13,7 +13,7 @@ public class PostgreSqlDbContextEventOutbox : DbContextEventOutbox : IDbContextEventOutbox ids) + { + var dbContext = (IHasEventOutbox)await DbContextProvider.GetDbContextAsync(); + var outgoingEvents = await dbContext.OutgoingEvents.Where(x => ids.Contains(x.Id)).ToListAsync(); + if (outgoingEvents.Any()) + { + dbContext.RemoveRange(outgoingEvents); + } + } } diff --git a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs index 49add5df84..b253164161 100644 --- a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs @@ -85,12 +85,17 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen await TriggerHandlersAsync(eventType, eventData); } - public override async Task PublishFromOutboxAsync(OutgoingEventInfo outgoingEvent, OutboxConfig outboxConfig) + public async override Task PublishFromOutboxAsync(OutgoingEventInfo outgoingEvent, OutboxConfig outboxConfig) { await PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData); } - public override async Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig) + public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + { + throw new NotImplementedException(); + } + + public async override Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig) { var eventType = _eventTypes.GetOrDefault(incomingEvent.EventName); if (eventType == null) diff --git a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs index ec1901161a..23ae188170 100644 --- a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs @@ -162,7 +162,7 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Clear()); } - protected override async Task PublishToEventBusAsync(Type eventType, object eventData) + protected async override Task PublishToEventBusAsync(Type eventType, object eventData) { await PublishAsync( eventType, @@ -196,7 +196,12 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen ); } - public override async Task ProcessFromInboxAsync( + public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + { + throw new NotImplementedException(); + } + + public async override Task ProcessFromInboxAsync( IncomingEventInfo incomingEvent, InboxConfig inboxConfig) { diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index 1564cfd213..c65e9a60d1 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -16,225 +16,290 @@ using Volo.Abp.Threading; using Volo.Abp.Timing; using Volo.Abp.Uow; -namespace Volo.Abp.EventBus.RabbitMq; - -/* TODO: How to handle unsubscribe to unbind on RabbitMq (may not be possible for) - */ -[Dependency(ReplaceServices = true)] -[ExposeServices(typeof(IDistributedEventBus), typeof(RabbitMqDistributedEventBus))] -public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDependency +namespace Volo.Abp.EventBus.RabbitMq { - protected AbpRabbitMqEventBusOptions AbpRabbitMqEventBusOptions { get; } - protected IConnectionPool ConnectionPool { get; } - protected IRabbitMqSerializer Serializer { get; } - - //TODO: Accessing to the List may not be thread-safe! - protected ConcurrentDictionary> HandlerFactories { get; } - protected ConcurrentDictionary EventTypes { get; } - protected IRabbitMqMessageConsumerFactory MessageConsumerFactory { get; } - protected IRabbitMqMessageConsumer Consumer { get; private set; } - - public RabbitMqDistributedEventBus( - IOptions options, - IConnectionPool connectionPool, - IRabbitMqSerializer serializer, - IServiceScopeFactory serviceScopeFactory, - IOptions distributedEventBusOptions, - IRabbitMqMessageConsumerFactory messageConsumerFactory, - ICurrentTenant currentTenant, - IUnitOfWorkManager unitOfWorkManager, - IGuidGenerator guidGenerator, - IClock clock) - : base( - serviceScopeFactory, - currentTenant, - unitOfWorkManager, - distributedEventBusOptions, - guidGenerator, - clock) + /* TODO: How to handle unsubscribe to unbind on RabbitMq (may not be possible for) + */ + [Dependency(ReplaceServices = true)] + [ExposeServices(typeof(IDistributedEventBus), typeof(RabbitMqDistributedEventBus))] + public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDependency { - ConnectionPool = connectionPool; - Serializer = serializer; - MessageConsumerFactory = messageConsumerFactory; - AbpRabbitMqEventBusOptions = options.Value; - - HandlerFactories = new ConcurrentDictionary>(); - EventTypes = new ConcurrentDictionary(); - } + protected AbpRabbitMqEventBusOptions AbpRabbitMqEventBusOptions { get; } + protected IConnectionPool ConnectionPool { get; } + protected IRabbitMqSerializer Serializer { get; } + + //TODO: Accessing to the List may not be thread-safe! + protected ConcurrentDictionary> HandlerFactories { get; } + protected ConcurrentDictionary EventTypes { get; } + protected IRabbitMqMessageConsumerFactory MessageConsumerFactory { get; } + protected IRabbitMqMessageConsumer Consumer { get; private set; } + + public RabbitMqDistributedEventBus( + IOptions options, + IConnectionPool connectionPool, + IRabbitMqSerializer serializer, + IServiceScopeFactory serviceScopeFactory, + IOptions distributedEventBusOptions, + IRabbitMqMessageConsumerFactory messageConsumerFactory, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IGuidGenerator guidGenerator, + IClock clock) + : base( + serviceScopeFactory, + currentTenant, + unitOfWorkManager, + distributedEventBusOptions, + guidGenerator, + clock) + { + ConnectionPool = connectionPool; + Serializer = serializer; + MessageConsumerFactory = messageConsumerFactory; + AbpRabbitMqEventBusOptions = options.Value; - public void Initialize() - { - Consumer = MessageConsumerFactory.Create( - new ExchangeDeclareConfiguration( - AbpRabbitMqEventBusOptions.ExchangeName, - type: "direct", - durable: true - ), - new QueueDeclareConfiguration( - AbpRabbitMqEventBusOptions.ClientName, - durable: true, - exclusive: false, - autoDelete: false - ), - AbpRabbitMqEventBusOptions.ConnectionName - ); - - Consumer.OnMessageReceived(ProcessEventAsync); - - SubscribeHandlers(AbpDistributedEventBusOptions.Handlers); - } + HandlerFactories = new ConcurrentDictionary>(); + EventTypes = new ConcurrentDictionary(); + } - private async Task ProcessEventAsync(IModel channel, BasicDeliverEventArgs ea) - { - var eventName = ea.RoutingKey; - var eventType = EventTypes.GetOrDefault(eventName); - if (eventType == null) + public void Initialize() { - return; + Consumer = MessageConsumerFactory.Create( + new ExchangeDeclareConfiguration( + AbpRabbitMqEventBusOptions.ExchangeName, + type: "direct", + durable: true + ), + new QueueDeclareConfiguration( + AbpRabbitMqEventBusOptions.ClientName, + durable: true, + exclusive: false, + autoDelete: false + ), + AbpRabbitMqEventBusOptions.ConnectionName + ); + + Consumer.OnMessageReceived(ProcessEventAsync); + + SubscribeHandlers(AbpDistributedEventBusOptions.Handlers); } - var eventBytes = ea.Body.ToArray(); + private async Task ProcessEventAsync(IModel channel, BasicDeliverEventArgs ea) + { + var eventName = ea.RoutingKey; + var eventType = EventTypes.GetOrDefault(eventName); + if (eventType == null) + { + return; + } + + var eventBytes = ea.Body.ToArray(); + + if (await AddToInboxAsync(ea.BasicProperties.MessageId, eventName, eventType, eventBytes)) + { + return; + } + + var eventData = Serializer.Deserialize(eventBytes, eventType); + + await TriggerHandlersAsync(eventType, eventData); + } - if (await AddToInboxAsync(ea.BasicProperties.MessageId, eventName, eventType, eventBytes)) + public override IDisposable Subscribe(Type eventType, IEventHandlerFactory factory) { - return; + var handlerFactories = GetOrCreateHandlerFactories(eventType); + + if (factory.IsInFactories(handlerFactories)) + { + return NullDisposable.Instance; + } + + handlerFactories.Add(factory); + + if (handlerFactories.Count == 1) //TODO: Multi-threading! + { + Consumer.BindAsync(EventNameAttribute.GetNameOrDefault(eventType)); + } + + return new EventHandlerFactoryUnregistrar(this, eventType, factory); } - var eventData = Serializer.Deserialize(eventBytes, eventType); + /// + public override void Unsubscribe(Func action) + { + Check.NotNull(action, nameof(action)); - await TriggerHandlersAsync(eventType, eventData); - } + GetOrCreateHandlerFactories(typeof(TEvent)) + .Locking(factories => + { + factories.RemoveAll( + factory => + { + var singleInstanceFactory = factory as SingleInstanceHandlerFactory; + if (singleInstanceFactory == null) + { + return false; + } + + var actionHandler = singleInstanceFactory.HandlerInstance as ActionEventHandler; + if (actionHandler == null) + { + return false; + } + + return actionHandler.Action == action; + }); + }); + } - public override IDisposable Subscribe(Type eventType, IEventHandlerFactory factory) - { - var handlerFactories = GetOrCreateHandlerFactories(eventType); + /// + public override void Unsubscribe(Type eventType, IEventHandler handler) + { + GetOrCreateHandlerFactories(eventType) + .Locking(factories => + { + factories.RemoveAll( + factory => + factory is SingleInstanceHandlerFactory && + (factory as SingleInstanceHandlerFactory).HandlerInstance == handler + ); + }); + } - if (factory.IsInFactories(handlerFactories)) + /// + public override void Unsubscribe(Type eventType, IEventHandlerFactory factory) { - return NullDisposable.Instance; + GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Remove(factory)); } - handlerFactories.Add(factory); + /// + public override void UnsubscribeAll(Type eventType) + { + GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Clear()); + } - if (handlerFactories.Count == 1) //TODO: Multi-threading! + protected async override Task PublishToEventBusAsync(Type eventType, object eventData) { - Consumer.BindAsync(EventNameAttribute.GetNameOrDefault(eventType)); + await PublishAsync(eventType, eventData, null); } - return new EventHandlerFactoryUnregistrar(this, eventType, factory); - } + protected override void AddToUnitOfWork(IUnitOfWork unitOfWork, UnitOfWorkEventRecord eventRecord) + { + unitOfWork.AddOrReplaceDistributedEvent(eventRecord); + } - /// - public override void Unsubscribe(Func action) - { - Check.NotNull(action, nameof(action)); + public override Task PublishFromOutboxAsync( + OutgoingEventInfo outgoingEvent, + OutboxConfig outboxConfig) + { + return PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData, null, eventId: outgoingEvent.Id); + } - GetOrCreateHandlerFactories(typeof(TEvent)) - .Locking(factories => + public async override Task PublishManyFromOutboxAsync( + IEnumerable outgoingEvents, + OutboxConfig outboxConfig) + { + using (var channel = ConnectionPool.Get(AbpRabbitMqEventBusOptions.ConnectionName).CreateModel()) { - factories.RemoveAll( - factory => + var outgoingEventArray = outgoingEvents.ToArray(); + channel.ConfirmSelect(); + + var pendingConfirms = new ConcurrentDictionary(); + var failures = new ConcurrentBag(); + + void CleanPendingConfirms(ulong sequenceNumber, bool multiple, bool ack) + { + if (multiple) { - var singleInstanceFactory = factory as SingleInstanceHandlerFactory; - if (singleInstanceFactory == null) + var confirmed = pendingConfirms.Where(x => x.Key <= sequenceNumber); + foreach (var entry in confirmed) { - return false; + pendingConfirms.TryRemove(entry.Key, out var eventId); + + if (!ack) + { + failures.Add(eventId); + } } + } + else + { + pendingConfirms.TryRemove(sequenceNumber, out var eventId); - var actionHandler = singleInstanceFactory.HandlerInstance as ActionEventHandler; - if (actionHandler == null) + if (!ack) { - return false; + failures.Add(eventId); } + } + } - return actionHandler.Action == action; - }); - }); - } + foreach (var outgoingEvent in outgoingEventArray) + { + pendingConfirms.TryAdd(channel.NextPublishSeqNo, outgoingEvent.Id); + await PublishInternalAsync(channel, outgoingEvent.EventName, outgoingEvent.EventData, null, eventId: outgoingEvent.Id); + } - /// - public override void Unsubscribe(Type eventType, IEventHandler handler) - { - GetOrCreateHandlerFactories(eventType) - .Locking(factories => - { - factories.RemoveAll( - factory => - factory is SingleInstanceHandlerFactory && - (factory as SingleInstanceHandlerFactory).HandlerInstance == handler - ); - }); - } + channel.BasicAcks += (_, ea) => CleanPendingConfirms(ea.DeliveryTag, ea.Multiple, true); + channel.BasicNacks += (_, ea) => CleanPendingConfirms(ea.DeliveryTag, ea.Multiple, false); - /// - public override void Unsubscribe(Type eventType, IEventHandlerFactory factory) - { - GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Remove(factory)); - } - - /// - public override void UnsubscribeAll(Type eventType) - { - GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Clear()); - } + channel.WaitForConfirms(); - protected override async Task PublishToEventBusAsync(Type eventType, object eventData) - { - await PublishAsync(eventType, eventData, null); - } - - protected override void AddToUnitOfWork(IUnitOfWork unitOfWork, UnitOfWorkEventRecord eventRecord) - { - unitOfWork.AddOrReplaceDistributedEvent(eventRecord); - } - - public override Task PublishFromOutboxAsync( - OutgoingEventInfo outgoingEvent, - OutboxConfig outboxConfig) - { - return PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData, null, eventId: outgoingEvent.Id); - } + return new MultipleOutgoingEventPublishResult(outgoingEventArray.Where(x => !failures.Contains(x.Id)).ToList()); + } + } - public override async Task ProcessFromInboxAsync( - IncomingEventInfo incomingEvent, - InboxConfig inboxConfig) - { - var eventType = EventTypes.GetOrDefault(incomingEvent.EventName); - if (eventType == null) + public async override Task ProcessFromInboxAsync( + IncomingEventInfo incomingEvent, + InboxConfig inboxConfig) { - return; + var eventType = EventTypes.GetOrDefault(incomingEvent.EventName); + if (eventType == null) + { + return; + } + + var eventData = Serializer.Deserialize(incomingEvent.EventData, eventType); + var exceptions = new List(); + await TriggerHandlersAsync(eventType, eventData, exceptions, inboxConfig); + if (exceptions.Any()) + { + ThrowOriginalExceptions(eventType, exceptions); + } } - var eventData = Serializer.Deserialize(incomingEvent.EventData, eventType); - var exceptions = new List(); - await TriggerHandlersAsync(eventType, eventData, exceptions, inboxConfig); - if (exceptions.Any()) + protected override byte[] Serialize(object eventData) { - ThrowOriginalExceptions(eventType, exceptions); + return Serializer.Serialize(eventData); } - } - protected override byte[] Serialize(object eventData) - { - return Serializer.Serialize(eventData); - } + public virtual Task PublishAsync(Type eventType, object eventData, IBasicProperties properties, Dictionary headersArguments = null) + { + var eventName = EventNameAttribute.GetNameOrDefault(eventType); + var body = Serializer.Serialize(eventData); - public Task PublishAsync(Type eventType, object eventData, IBasicProperties properties, Dictionary headersArguments = null) - { - var eventName = EventNameAttribute.GetNameOrDefault(eventType); - var body = Serializer.Serialize(eventData); + return PublishAsync(eventName, body, properties, headersArguments); + } - return PublishAsync(eventName, body, properties, headersArguments); - } + protected virtual Task PublishAsync( + string eventName, + byte[] body, + IBasicProperties properties, + Dictionary headersArguments = null, + Guid? eventId = null) + { + using (var channel = ConnectionPool.Get(AbpRabbitMqEventBusOptions.ConnectionName).CreateModel()) + { + return PublishInternalAsync(channel, eventName, body, properties, headersArguments, eventId); + } + } - protected Task PublishAsync( - string eventName, - byte[] body, - IBasicProperties properties, - Dictionary headersArguments = null, - Guid? eventId = null) - { - using (var channel = ConnectionPool.Get(AbpRabbitMqEventBusOptions.ConnectionName).CreateModel()) + protected virtual Task PublishInternalAsync( + IModel channel, + string eventName, + byte[] body, + IBasicProperties properties, + Dictionary headersArguments = null, + Guid? eventId = null) { channel.ExchangeDeclare( AbpRabbitMqEventBusOptions.ExchangeName, @@ -262,68 +327,68 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe basicProperties: properties, body: body ); - } - return Task.CompletedTask; - } - - private void SetEventMessageHeaders(IBasicProperties properties, Dictionary headersArguments) - { - if (headersArguments == null) - { - return; + return Task.CompletedTask; } - properties.Headers ??= new Dictionary(); - - foreach (var header in headersArguments) + private void SetEventMessageHeaders(IBasicProperties properties, Dictionary headersArguments) { - properties.Headers[header.Key] = header.Value; - } - } - - private List GetOrCreateHandlerFactories(Type eventType) - { - return HandlerFactories.GetOrAdd( - eventType, - type => + if (headersArguments == null) { - var eventName = EventNameAttribute.GetNameOrDefault(type); - EventTypes[eventName] = type; - return new List(); + return; } - ); - } - protected override IEnumerable GetHandlerFactories(Type eventType) - { - var handlerFactoryList = new List(); + properties.Headers ??= new Dictionary(); - foreach (var handlerFactory in - HandlerFactories.Where(hf => ShouldTriggerEventForHandler(eventType, hf.Key))) - { - handlerFactoryList.Add( - new EventTypeWithEventHandlerFactories(handlerFactory.Key, handlerFactory.Value)); + foreach (var header in headersArguments) + { + properties.Headers[header.Key] = header.Value; + } } - return handlerFactoryList.ToArray(); - } - - private static bool ShouldTriggerEventForHandler(Type targetEventType, Type handlerEventType) - { - //Should trigger same type - if (handlerEventType == targetEventType) + private List GetOrCreateHandlerFactories(Type eventType) { - return true; + return HandlerFactories.GetOrAdd( + eventType, + type => + { + var eventName = EventNameAttribute.GetNameOrDefault(type); + EventTypes[eventName] = type; + return new List(); + } + ); } - //TODO: Support inheritance? But it does not support on subscription to RabbitMq! - //Should trigger for inherited types - if (handlerEventType.IsAssignableFrom(targetEventType)) + protected override IEnumerable GetHandlerFactories(Type eventType) { - return true; + var handlerFactoryList = new List(); + + foreach (var handlerFactory in + HandlerFactories.Where(hf => ShouldTriggerEventForHandler(eventType, hf.Key))) + { + handlerFactoryList.Add( + new EventTypeWithEventHandlerFactories(handlerFactory.Key, handlerFactory.Value)); + } + + return handlerFactoryList.ToArray(); } - return false; + private static bool ShouldTriggerEventForHandler(Type targetEventType, Type handlerEventType) + { + //Should trigger same type + if (handlerEventType == targetEventType) + { + return true; + } + + //TODO: Support inheritance? But it does not support on subscription to RabbitMq! + //Should trigger for inherited types + if (handlerEventType.IsAssignableFrom(targetEventType)) + { + return true; + } + + return false; + } } } diff --git a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs index 0542a705eb..aad844a4d7 100644 --- a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs @@ -146,7 +146,7 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen await TriggerHandlersAsync(eventType, eventData); } - protected override async Task PublishToEventBusAsync(Type eventType, object eventData) + protected async override Task PublishToEventBusAsync(Type eventType, object eventData) { await AbpRebusEventBusOptions.Publish(Rebus, eventType, eventData); } @@ -210,7 +210,12 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen return PublishToEventBusAsync(eventType, eventData); } - public override async Task ProcessFromInboxAsync( + public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + { + throw new NotImplementedException(); + } + + public async override Task ProcessFromInboxAsync( IncomingEventInfo incomingEvent, InboxConfig inboxConfig) { diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs index dee9d1f7d3..178dea1340 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs @@ -8,156 +8,162 @@ using Volo.Abp.MultiTenancy; using Volo.Abp.Timing; using Volo.Abp.Uow; -namespace Volo.Abp.EventBus.Distributed; - -public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventBus, ISupportsEventBoxes +namespace Volo.Abp.EventBus.Distributed { - protected IGuidGenerator GuidGenerator { get; } - protected IClock Clock { get; } - protected AbpDistributedEventBusOptions AbpDistributedEventBusOptions { get; } - - protected DistributedEventBusBase( - IServiceScopeFactory serviceScopeFactory, - ICurrentTenant currentTenant, - IUnitOfWorkManager unitOfWorkManager, - IOptions abpDistributedEventBusOptions, - IGuidGenerator guidGenerator, - IClock clock - ) : base( - serviceScopeFactory, - currentTenant, - unitOfWorkManager) - { - GuidGenerator = guidGenerator; - Clock = clock; - AbpDistributedEventBusOptions = abpDistributedEventBusOptions.Value; - } - - public IDisposable Subscribe(IDistributedEventHandler handler) where TEvent : class + public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventBus, ISupportsEventBoxes { - return Subscribe(typeof(TEvent), handler); - } + protected IGuidGenerator GuidGenerator { get; } + protected IClock Clock { get; } + protected AbpDistributedEventBusOptions AbpDistributedEventBusOptions { get; } + + protected DistributedEventBusBase( + IServiceScopeFactory serviceScopeFactory, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IOptions abpDistributedEventBusOptions, + IGuidGenerator guidGenerator, + IClock clock + ) : base( + serviceScopeFactory, + currentTenant, + unitOfWorkManager) + { + GuidGenerator = guidGenerator; + Clock = clock; + AbpDistributedEventBusOptions = abpDistributedEventBusOptions.Value; + } - public override Task PublishAsync(Type eventType, object eventData, bool onUnitOfWorkComplete = true) - { - return PublishAsync(eventType, eventData, onUnitOfWorkComplete, useOutbox: true); - } + public IDisposable Subscribe(IDistributedEventHandler handler) where TEvent : class + { + return Subscribe(typeof(TEvent), handler); + } - public Task PublishAsync( - TEvent eventData, - bool onUnitOfWorkComplete = true, - bool useOutbox = true) - where TEvent : class - { - return PublishAsync(typeof(TEvent), eventData, onUnitOfWorkComplete, useOutbox); - } + public override Task PublishAsync(Type eventType, object eventData, bool onUnitOfWorkComplete = true) + { + return PublishAsync(eventType, eventData, onUnitOfWorkComplete, useOutbox: true); + } - public async Task PublishAsync( - Type eventType, - object eventData, - bool onUnitOfWorkComplete = true, - bool useOutbox = true) - { - if (onUnitOfWorkComplete && UnitOfWorkManager.Current != null) + public Task PublishAsync( + TEvent eventData, + bool onUnitOfWorkComplete = true, + bool useOutbox = true) + where TEvent : class { - AddToUnitOfWork( - UnitOfWorkManager.Current, - new UnitOfWorkEventRecord(eventType, eventData, EventOrderGenerator.GetNext(), useOutbox) - ); - return; + return PublishAsync(typeof(TEvent), eventData, onUnitOfWorkComplete, useOutbox); } - if (useOutbox) + public async Task PublishAsync( + Type eventType, + object eventData, + bool onUnitOfWorkComplete = true, + bool useOutbox = true) { - if (await AddToOutboxAsync(eventType, eventData)) + if (onUnitOfWorkComplete && UnitOfWorkManager.Current != null) { + AddToUnitOfWork( + UnitOfWorkManager.Current, + new UnitOfWorkEventRecord(eventType, eventData, EventOrderGenerator.GetNext(), useOutbox) + ); return; } - } - await PublishToEventBusAsync(eventType, eventData); - } + if (useOutbox) + { + if (await AddToOutboxAsync(eventType, eventData)) + { + return; + } + } - public abstract Task PublishFromOutboxAsync( - OutgoingEventInfo outgoingEvent, - OutboxConfig outboxConfig - ); + await PublishToEventBusAsync(eventType, eventData); + } - public abstract Task ProcessFromInboxAsync( - IncomingEventInfo incomingEvent, - InboxConfig inboxConfig); + public abstract Task PublishFromOutboxAsync( + OutgoingEventInfo outgoingEvent, + OutboxConfig outboxConfig + ); - private async Task AddToOutboxAsync(Type eventType, object eventData) - { - var unitOfWork = UnitOfWorkManager.Current; - if (unitOfWork == null) - { - return false; - } + public abstract Task PublishManyFromOutboxAsync( + IEnumerable outgoingEvents, + OutboxConfig outboxConfig + ); + + public abstract Task ProcessFromInboxAsync( + IncomingEventInfo incomingEvent, + InboxConfig inboxConfig); - foreach (var outboxConfig in AbpDistributedEventBusOptions.Outboxes.Values) + private async Task AddToOutboxAsync(Type eventType, object eventData) { - if (outboxConfig.Selector == null || outboxConfig.Selector(eventType)) + var unitOfWork = UnitOfWorkManager.Current; + if (unitOfWork == null) { - var eventOutbox = (IEventOutbox)unitOfWork.ServiceProvider.GetRequiredService(outboxConfig.ImplementationType); - var eventName = EventNameAttribute.GetNameOrDefault(eventType); - await eventOutbox.EnqueueAsync( - new OutgoingEventInfo( - GuidGenerator.Create(), - eventName, - Serialize(eventData), - Clock.Now - ) - ); - return true; + return false; } - } - return false; - } + foreach (var outboxConfig in AbpDistributedEventBusOptions.Outboxes.Values) + { + if (outboxConfig.Selector == null || outboxConfig.Selector(eventType)) + { + var eventOutbox = (IEventOutbox)unitOfWork.ServiceProvider.GetRequiredService(outboxConfig.ImplementationType); + var eventName = EventNameAttribute.GetNameOrDefault(eventType); + await eventOutbox.EnqueueAsync( + new OutgoingEventInfo( + GuidGenerator.Create(), + eventName, + Serialize(eventData), + Clock.Now + ) + ); + return true; + } + } - protected async Task AddToInboxAsync( - string messageId, - string eventName, - Type eventType, - byte[] eventBytes) - { - if (AbpDistributedEventBusOptions.Inboxes.Count <= 0) - { return false; } - using (var scope = ServiceScopeFactory.CreateScope()) + protected async Task AddToInboxAsync( + string messageId, + string eventName, + Type eventType, + byte[] eventBytes) { - foreach (var inboxConfig in AbpDistributedEventBusOptions.Inboxes.Values) + if (AbpDistributedEventBusOptions.Inboxes.Count <= 0) { - if (inboxConfig.EventSelector == null || inboxConfig.EventSelector(eventType)) - { - var eventInbox = (IEventInbox)scope.ServiceProvider.GetRequiredService(inboxConfig.ImplementationType); + return false; + } - if (!messageId.IsNullOrEmpty()) + using (var scope = ServiceScopeFactory.CreateScope()) + { + foreach (var inboxConfig in AbpDistributedEventBusOptions.Inboxes.Values) + { + if (inboxConfig.EventSelector == null || inboxConfig.EventSelector(eventType)) { - if (await eventInbox.ExistsByMessageIdAsync(messageId)) + var eventInbox = (IEventInbox) scope.ServiceProvider.GetRequiredService(inboxConfig.ImplementationType); + + if (!messageId.IsNullOrEmpty()) { - continue; + if (await eventInbox.ExistsByMessageIdAsync(messageId)) + { + continue; + } } - } - await eventInbox.EnqueueAsync( - new IncomingEventInfo( - GuidGenerator.Create(), - messageId, - eventName, - eventBytes, - Clock.Now - ) - ); + await eventInbox.EnqueueAsync( + new IncomingEventInfo( + GuidGenerator.Create(), + messageId, + eventName, + eventBytes, + Clock.Now + ) + ); + } } } + + return true; } - return true; + protected abstract byte[] Serialize(object eventData); } - - protected abstract byte[] Serialize(object eventData); } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IEventOutbox.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IEventOutbox.cs index 6ecefcf002..018747945c 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IEventOutbox.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IEventOutbox.cs @@ -12,4 +12,6 @@ public interface IEventOutbox Task> GetWaitingEventsAsync(int maxCount, CancellationToken cancellationToken = default); Task DeleteAsync(Guid id); + + Task DeleteManyAsync(IEnumerable ids); } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs index 37405fb58a..7c23be5ecd 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Threading.Tasks; namespace Volo.Abp.EventBus.Distributed; @@ -9,6 +10,11 @@ public interface ISupportsEventBoxes OutboxConfig outboxConfig ); + Task PublishManyFromOutboxAsync( + IEnumerable outgoingEvents, + OutboxConfig outboxConfig + ); + Task ProcessFromInboxAsync( IncomingEventInfo incomingEvent, InboxConfig inboxConfig diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs index 50c1a4e009..0d22245d13 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs @@ -98,7 +98,7 @@ public class InboxProcessor : IInboxProcessor, ITransientDependency break; } - Logger.LogInformation($"Found {waitingEvents.Count} events in the inbox."); + //Logger.LogInformation($"Found {waitingEvents.Count} events in the inbox."); foreach (var waitingEvent in waitingEvents) { @@ -113,7 +113,7 @@ public class InboxProcessor : IInboxProcessor, ITransientDependency await uow.CompleteAsync(); } - Logger.LogInformation($"Processed the incoming event with id = {waitingEvent.Id:N}"); + //Logger.LogInformation($"Processed the incoming event with id = {waitingEvent.Id:N}"); } } } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs index 6ed60ba34c..d42110e4ea 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs @@ -1,4 +1,6 @@ using System; +using System.Diagnostics; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -76,25 +78,20 @@ public class OutboxSender : IOutboxSender, ITransientDependency while (true) { var waitingEvents = await Outbox.GetWaitingEventsAsync(EventBusBoxesOptions.OutboxWaitingEventMaxCount, StoppingToken); - if (waitingEvents.Count <= 0) + if (waitingEvents.Count < 1000) { break; } Logger.LogInformation($"Found {waitingEvents.Count} events in the outbox."); - foreach (var waitingEvent in waitingEvents) - { - await DistributedEventBus - .AsSupportsEventBoxes() - .PublishFromOutboxAsync( - waitingEvent, - OutboxConfig - ); + var result = await DistributedEventBus + .AsSupportsEventBoxes() + .PublishManyFromOutboxAsync(waitingEvents, OutboxConfig); - await Outbox.DeleteAsync(waitingEvent.Id); - Logger.LogInformation($"Sent the event to the message broker with id = {waitingEvent.Id:N}"); - } + await Outbox.DeleteManyAsync(result.PublishedOutgoingEvents.Select(x => x.Id).ToArray()); + + Logger.LogInformation($"Sent {result.PublishedOutgoingEvents.Count} events to message broker"); } } else diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs new file mode 100644 index 0000000000..515dec1ae6 --- /dev/null +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Volo.Abp.EventBus.Distributed; + +namespace Volo.Abp.EventBus; + +public class MultipleOutgoingEventPublishResult +{ + public IReadOnlyList PublishedOutgoingEvents { get; } + + public MultipleOutgoingEventPublishResult(IReadOnlyList outgoingEvents) + { + PublishedOutgoingEvents = outgoingEvents; + } +} diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs index 1f3ae999b0..fae0709953 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs @@ -68,4 +68,18 @@ public class MongoDbContextEventOutbox : IMongoDbContextEventOu await dbContext.OutgoingEvents.DeleteOneAsync(x => x.Id.Equals(id)); } } + + [UnitOfWork] + public async Task DeleteManyAsync(IEnumerable ids) + { + var dbContext = (IHasEventOutbox)await MongoDbContextProvider.GetDbContextAsync(); + if (dbContext.SessionHandle != null) + { + await dbContext.OutgoingEvents.DeleteManyAsync(dbContext.SessionHandle, x => ids.Contains(x.Id)); + } + else + { + await dbContext.OutgoingEvents.DeleteManyAsync(x => ids.Contains(x.Id)); + } + } } From 5ee59194637c187ecfee34aab7163c801e182044 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 9 Jan 2022 20:24:39 +0800 Subject: [PATCH 002/242] Batch publish events from outbox to the kafka event bus --- .../Kafka/KafkaDistributedEventBus.cs | 44 ++++++++++++++----- .../Abp/EventBus/Kafka/MessageExtensions.cs | 18 ++++++++ .../EventBus/Distributed/InboxProcessor.cs | 4 +- .../Abp/EventBus/Distributed/OutboxSender.cs | 2 +- 4 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/MessageExtensions.cs diff --git a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs index 23ae188170..aef7662095 100644 --- a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs @@ -77,12 +77,7 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen return; } - string messageId = null; - - if (message.Headers.TryGetLastBytes("messageId", out var messageIdBytes)) - { - messageId = System.Text.Encoding.UTF8.GetString(messageIdBytes); - } + var messageId = message.GetMessageId(); if (await AddToInboxAsync(messageId, eventName, eventType, message.Value)) { @@ -196,9 +191,38 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen ); } - public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) { - throw new NotImplementedException(); + var pendingConfirms = new ConcurrentDictionary(); + var outgoingEventArray = outgoingEvents.ToArray(); + + var tasks = new List(); + foreach (var outgoingEvent in outgoingEventArray) + { + var messageId = outgoingEvent.Id.ToString("N"); + pendingConfirms.TryAdd(messageId, outgoingEvent.Id); + + var task = PublishAsync( + AbpKafkaEventBusOptions.TopicName, + outgoingEvent.EventName, + outgoingEvent.EventData, + new Headers { { "messageId", System.Text.Encoding.UTF8.GetBytes(messageId)} }, + null + ); + + tasks.Add(task.ContinueWith(t => + { + if (!t.IsFaulted) + { + var message = t.Result.Message; + pendingConfirms.TryRemove(message.GetMessageId(), out _); + } + })); + } + + await Task.WhenAll(tasks); + + return new MultipleOutgoingEventPublishResult(outgoingEventArray.Where(x => !pendingConfirms.Select(p => p.Value).Contains(x.Id)).ToList()); } public async override Task ProcessFromInboxAsync( @@ -244,13 +268,13 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen return PublishAsync(topicName, eventName, body, headers, headersArguments); } - private async Task PublishAsync(string topicName, string eventName, byte[] body, Headers headers, Dictionary headersArguments) + private Task> PublishAsync(string topicName, string eventName, byte[] body, Headers headers, Dictionary headersArguments) { var producer = ProducerPool.Get(AbpKafkaEventBusOptions.ConnectionName); SetEventMessageHeaders(headers, headersArguments); - await producer.ProduceAsync( + return producer.ProduceAsync( topicName, new Message { diff --git a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/MessageExtensions.cs b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/MessageExtensions.cs new file mode 100644 index 0000000000..17a80ec87c --- /dev/null +++ b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/MessageExtensions.cs @@ -0,0 +1,18 @@ +using Confluent.Kafka; + +namespace Volo.Abp.EventBus.Kafka; + +public static class MessageExtensions +{ + public static string GetMessageId(this Message message) + { + string messageId = null; + + if (message.Headers.TryGetLastBytes("messageId", out var messageIdBytes)) + { + messageId = System.Text.Encoding.UTF8.GetString(messageIdBytes); + } + + return messageId; + } +} diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs index 0d22245d13..50c1a4e009 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs @@ -98,7 +98,7 @@ public class InboxProcessor : IInboxProcessor, ITransientDependency break; } - //Logger.LogInformation($"Found {waitingEvents.Count} events in the inbox."); + Logger.LogInformation($"Found {waitingEvents.Count} events in the inbox."); foreach (var waitingEvent in waitingEvents) { @@ -113,7 +113,7 @@ public class InboxProcessor : IInboxProcessor, ITransientDependency await uow.CompleteAsync(); } - //Logger.LogInformation($"Processed the incoming event with id = {waitingEvent.Id:N}"); + Logger.LogInformation($"Processed the incoming event with id = {waitingEvent.Id:N}"); } } } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs index d42110e4ea..17dec0a810 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs @@ -78,7 +78,7 @@ public class OutboxSender : IOutboxSender, ITransientDependency while (true) { var waitingEvents = await Outbox.GetWaitingEventsAsync(EventBusBoxesOptions.OutboxWaitingEventMaxCount, StoppingToken); - if (waitingEvents.Count < 1000) + if (waitingEvents.Count <= 0) { break; } From f36c44fc78203c4f520cfce62d99fce82ecb24c4 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 9 Jan 2022 20:50:17 +0800 Subject: [PATCH 003/242] Batch publish events from outbox to the azure event bus --- .../Azure/AzureDistributedEventBus.cs | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs index b253164161..a253a8ba96 100644 --- a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs @@ -90,9 +90,38 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen await PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData); } - public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) { - throw new NotImplementedException(); + var outgoingEventArray = outgoingEvents.ToArray(); + var failures = new List(); + + var publisher = await _publisherPool.GetAsync( + _options.TopicName, + _options.ConnectionName); + + using var messageBatch = await publisher.CreateMessageBatchAsync(); + + var failed = false; + foreach (var outgoingEvent in outgoingEventArray) + { + if (failed) + { + failures.Add(outgoingEvent.Id); + continue; + } + + var body = _serializer.Serialize(outgoingEvent.EventData); + + if (!messageBatch.TryAddMessage(new ServiceBusMessage(body) { Subject = outgoingEvent.EventName })) + { + failed = true; + failures.Add(outgoingEvent.Id); + } + } + + await publisher.SendMessagesAsync(messageBatch); + + return new MultipleOutgoingEventPublishResult(outgoingEventArray.Where(x => !failures.Contains(x.Id)).ToList()); } public async override Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig) @@ -183,7 +212,7 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen .Locking(factories => factories.Clear()); } - protected override async Task PublishToEventBusAsync(Type eventType, object eventData) + protected async override Task PublishToEventBusAsync(Type eventType, object eventData) { await PublishAsync(EventNameAttribute.GetNameOrDefault(eventType), eventData); } From 9ec54780d475ca56c2c6086039a9bb4d42a4371c Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 9 Jan 2022 21:18:48 +0800 Subject: [PATCH 004/242] Batch publish events from outbox to the rebus event bus --- .../EventBus/Rebus/AbpRebusEventBusOptions.cs | 13 +--------- .../Rebus/RebusDistributedEventBus.cs | 24 ++++++++++++++++--- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/AbpRebusEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/AbpRebusEventBusOptions.cs index 5238cdd8bb..4c39b9bf1d 100644 --- a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/AbpRebusEventBusOptions.cs +++ b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/AbpRebusEventBusOptions.cs @@ -20,24 +20,13 @@ public class AbpRebusEventBusOptions } private Action _configurer; - [NotNull] - public Func Publish { - get => _publish; - set => _publish = Check.NotNull(value, nameof(value)); - } - private Func _publish; + public Func Publish { get; set; } public AbpRebusEventBusOptions() { - _publish = DefaultPublish; _configurer = DefaultConfigure; } - private async Task DefaultPublish(IBus bus, Type eventType, object eventData) - { - await bus.Advanced.Routing.Send(InputQueueName, eventData); - } - private void DefaultConfigure(RebusConfigurer configure) { configure.Subscriptions(s => s.StoreInMemory()); diff --git a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs index aad844a4d7..fc6a0667af 100644 --- a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs @@ -148,7 +148,18 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen protected async override Task PublishToEventBusAsync(Type eventType, object eventData) { - await AbpRebusEventBusOptions.Publish(Rebus, eventType, eventData); + await PublishAsync(eventType, eventData); + } + + protected virtual async Task PublishAsync(Type eventType, object eventData) + { + if (AbpRebusEventBusOptions.Publish != null) + { + await AbpRebusEventBusOptions.Publish(Rebus, eventType, eventData); + return; + } + + await Rebus.Advanced.Routing.Send(AbpRebusEventBusOptions.InputQueueName, eventData); } protected override void AddToUnitOfWork(IUnitOfWork unitOfWork, UnitOfWorkEventRecord eventRecord) @@ -210,9 +221,16 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen return PublishToEventBusAsync(eventType, eventData); } - public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) { - throw new NotImplementedException(); + var outgoingEventArray = outgoingEvents.ToArray(); + + foreach (var outgoingEvent in outgoingEventArray) + { + await PublishFromOutboxAsync(outgoingEvent, outboxConfig); + } + + return new MultipleOutgoingEventPublishResult(outgoingEventArray); } public async override Task ProcessFromInboxAsync( From 325f82a3d7a7448f7e7b3b73438f965810b93500 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 10 Jan 2022 17:11:06 +0800 Subject: [PATCH 005/242] Update AzureDistributedEventBus --- .../Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs index ffcf6df8c7..5e91a224c5 100644 --- a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs @@ -110,9 +110,7 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen continue; } - var body = _serializer.Serialize(outgoingEvent.EventData); - - if (!messageBatch.TryAddMessage(new ServiceBusMessage(body) { Subject = outgoingEvent.EventName })) + if (!messageBatch.TryAddMessage(new ServiceBusMessage(outgoingEvent.EventData) { Subject = outgoingEvent.EventName })) { failed = true; failures.Add(outgoingEvent.Id); From 3364e7e2273b395b87a5395513a3b5585ac5ddf9 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 14 Jan 2022 14:28:30 +0800 Subject: [PATCH 006/242] Update RabbitMqDistributedEventBus.cs --- .../Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index a9cfb4dc23..a9d6a42207 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -238,7 +238,7 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe foreach (var outgoingEvent in outgoingEventArray) { pendingConfirms.TryAdd(channel.NextPublishSeqNo, outgoingEvent.Id); - await PublishInternalAsync(channel, outgoingEvent.EventName, outgoingEvent.EventData, null, + await PublishAsync(channel, outgoingEvent.EventName, outgoingEvent.EventData, null, eventId: outgoingEvent.Id); } @@ -293,11 +293,11 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe { using (var channel = ConnectionPool.Get(AbpRabbitMqEventBusOptions.ConnectionName).CreateModel()) { - return PublishInternalAsync(channel, eventName, body, properties, headersArguments, eventId); + return PublishAsync(channel, eventName, body, properties, headersArguments, eventId); } } - protected virtual Task PublishInternalAsync( + protected virtual Task PublishAsync( IModel channel, string eventName, byte[] body, From 0c45dccd54f9c70b6fb2008df81b22655a5f2d20 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 25 Jan 2022 14:17:09 +0800 Subject: [PATCH 007/242] Update Rebus --- .../Abp/EventBus/Rebus/RebusDistributedEventBus.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs index 81611e180a..a5cac31235 100644 --- a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Rebus.Bus; using Rebus.Pipeline; +using Rebus.Transport; using Volo.Abp.DependencyInjection; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Guids; @@ -227,9 +228,14 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen { var outgoingEventArray = outgoingEvents.ToArray(); - foreach (var outgoingEvent in outgoingEventArray) + using (var scope = new RebusTransactionScope()) { - await PublishFromOutboxAsync(outgoingEvent, outboxConfig); + foreach (var outgoingEvent in outgoingEventArray) + { + await PublishFromOutboxAsync(outgoingEvent, outboxConfig); + } + + await scope.CompleteAsync(); } return new MultipleOutgoingEventPublishResult(outgoingEventArray); From 282d9ada01463503afbfce2bcbe34f68b9cb48db Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 25 Jan 2022 14:20:56 +0800 Subject: [PATCH 008/242] Update RabbitMqMessageConsumer.cs --- .../Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs index 049e8da712..8ce184295a 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs @@ -176,14 +176,6 @@ public class RabbitMqMessageConsumer : IRabbitMqMessageConsumer, ITransientDepen } catch (Exception ex) { - if (ex is OperationInterruptedException operationInterruptedException && - operationInterruptedException.ShutdownReason.ReplyCode == 406 && - operationInterruptedException.Message.Contains("arg 'x-dead-letter-exchange'")) - { - Logger.LogException(ex, LogLevel.Warning); - await ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning); - } - Logger.LogException(ex, LogLevel.Warning); await ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning); } From 7e0c9dbf2d5b10066819cdee116ad9cdae6c8d23 Mon Sep 17 00:00:00 2001 From: berkansasmaz Date: Tue, 1 Mar 2022 13:33:02 +0300 Subject: [PATCH 009/242] Update en.json --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 3bb6320874..ff1305a336 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -103,6 +103,7 @@ "PreviousEvents": "Previous Events", "WatchTheEvent": "Watch the Event", "RegisterNow": "Register Now", - "ThereIsNoEvent": "There is no event." + "ThereIsNoEvent": "There is no event.", + "Events": "Events" } } From 64bb78f9dcf86b4bb8e67c42ea75815ef5dbe449 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Sat, 5 Mar 2022 20:34:33 +0300 Subject: [PATCH 010/242] Update en.json --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 3af6d451e4..54c1660f18 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -384,6 +384,7 @@ "SpeakerDeletionConfirmationMessage": "Are you sure you want to delete this speaker?", "Menu:Speakers": "Speakers", "ChooseSpeakerImage": "Choose a speaker image...", - "SpeakerImage": "Speaker image" + "SpeakerImage": "Speaker image", + "AddSpeaker": "Add Speaker" } } From 1355b55a980ee68de88b849f2688bdc4cb66b426 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 8 Mar 2022 11:42:25 +0300 Subject: [PATCH 011/242] Add new localizations for abp.io --- .../AbpIoLocalization/Www/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 21a64a34ef..68a6b254ff 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -318,6 +318,7 @@ "InstallingTheABPCLI": "Installing the ABP CLI", "CreateYourProjectNow": "Create Your Project Now", "OrderOn": "Order on {0}", - "DownloadFreeDDDBook": "Download Free DDD Book" + "DownloadFreeDDDBook": "Download Free DDD Book", + "WhatIsABPFramework": "What is the ABP Framework?" } } From abf75f88953e6ac006a3a6fbff28bbedd1d23e5c Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 8 Mar 2022 13:55:05 +0300 Subject: [PATCH 012/242] Blogging: Convert tags to lowercase resolves https://github.com/abpframework/abp/issues/11699 --- .../Volo/Blogging/Posts/PostAppService.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs index 457656291f..15506ecf70 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs +++ b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs @@ -231,11 +231,16 @@ namespace Volo.Blogging.Posts return url; } - private async Task SaveTags(ICollection newTags, Post post) + private async Task SaveTags(ICollection tags, Post post) { - await RemoveOldTags(newTags, post); - - await AddNewTags(newTags, post); + tags = tags + .Select(t => t.ToLowerInvariant()) + .Distinct() + .ToList(); + + await RemoveOldTags(tags, post); + + await AddNewTags(tags, post); } private async Task RemoveOldTags(ICollection newTags, Post post) From db7daeda5ba410837c7545a34955ade6250e66b1 Mon Sep 17 00:00:00 2001 From: rqx110 Date: Thu, 10 Mar 2022 13:55:07 +0800 Subject: [PATCH 013/242] feat(cms-kit): using codemirror as global resources editor --- .../Pages/CmsKit/GlobalResources/Index.cshtml | 8 ++++++++ .../Pages/CmsKit/GlobalResources/index.js | 19 +++++++++++++++++-- npm/packs/cms-kit.admin/package.json | 3 ++- npm/packs/codemirror/abp.resourcemapping.js | 5 ++++- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/Index.cshtml index b67a147baa..615ef31477 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/Index.cshtml @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Layout +@using Volo.Abp.AspNetCore.Mvc.UI.Packages.Codemirror @using Volo.CmsKit.Admin.Web.Pages.CmsKit.GlobalResources @using Volo.CmsKit.Admin.Web.Menus @using Volo.CmsKit.Localization @@ -17,8 +18,15 @@ PageLayout.Content.MenuItemName = CmsKitAdminMenus.GlobalResources.GlobalResourcesMenu; } +@section styles{ + +} + @section scripts { + + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/index.js index 72fb11e8dc..c58447b22d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/GlobalResources/index.js @@ -3,11 +3,26 @@ $(function (){ var service = volo.cmsKit.admin.globalResources.globalResourceAdmin; + var scriptEditor = CodeMirror.fromTextArea(document.getElementById("ScriptContent"),{ + mode:"javascript", + lineNumbers:true + }); + + var styleEditor = CodeMirror.fromTextArea(document.getElementById("StyleContent"),{ + mode:"css", + lineNumbers:true + }); + + $('.nav-tabs a').on('shown.bs.tab', function() { + scriptEditor.refresh(); + styleEditor.refresh(); + }); + $('#SaveResourcesButton').on('click','',function(){ service.setGlobalResources( { - style: $('#StyleContent').val(), - script: $('#ScriptContent').val() + style: styleEditor.getValue(), + script: scriptEditor.getValue() } ).then(function () { abp.message.success(l("SavedSuccessfully")); diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index 528bdb3ac0..524583a187 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -8,7 +8,8 @@ "@abp/jstree": "~5.2.0-rc.1", "@abp/slugify": "~5.2.0-rc.1", "@abp/tui-editor": "~5.2.0-rc.1", - "@abp/uppy": "~5.2.0-rc.1" + "@abp/uppy": "~5.2.0-rc.1", + "@abp/codemirror": "~5.2.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/abp.resourcemapping.js b/npm/packs/codemirror/abp.resourcemapping.js index 71731c389b..d7f349b54a 100644 --- a/npm/packs/codemirror/abp.resourcemapping.js +++ b/npm/packs/codemirror/abp.resourcemapping.js @@ -1,5 +1,8 @@ module.exports = { mappings: { - "@node_modules/codemirror/lib/*.*": "@libs/codemirror/" + "@node_modules/codemirror/lib/*.*": "@libs/codemirror/", + "@node_modules/codemirror/mode/**/*.*": "@libs/codemirror/mode/", + "@node_modules/codemirror/theme/**/*.*": "@libs/codemirror/theme/", + "@node_modules/codemirror/addon/**/*.*": "@libs/codemirror/addon/" } } \ No newline at end of file From 7317e493279e09d2f11322b04310c7442916bf27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 10 Mar 2022 18:49:39 +0300 Subject: [PATCH 014/242] Increment version --- common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.props b/common.props index 12a177739b..facc92f0bc 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 5.2.0-rc.1 + 5.3.0 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From eb7fa083356f10c5f251379093b90d3fb92bba5d Mon Sep 17 00:00:00 2001 From: William Obando Date: Thu, 10 Mar 2022 22:49:14 -0500 Subject: [PATCH 015/242] Add option to disable service bus --- .../Abp/EventBus/Azure/AbpAzureEventBusOptions.cs | 2 ++ .../Abp/EventBus/Azure/AbpEventBusAzureModule.cs | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpAzureEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpAzureEventBusOptions.cs index a6aa2f9857..57fa4b7f48 100644 --- a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpAzureEventBusOptions.cs +++ b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpAzureEventBusOptions.cs @@ -7,4 +7,6 @@ public class AbpAzureEventBusOptions public string SubscriberName { get; set; } public string TopicName { get; set; } + + public bool IsServiceBusDisabled { get; set; } } diff --git a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpEventBusAzureModule.cs b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpEventBusAzureModule.cs index 64c8b2fcd3..129004c871 100644 --- a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpEventBusAzureModule.cs +++ b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AbpEventBusAzureModule.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.AzureServiceBus; using Volo.Abp.Modularity; @@ -19,9 +20,15 @@ public class AbpEventBusAzureModule : AbpModule public override void OnApplicationInitialization(ApplicationInitializationContext context) { - context - .ServiceProvider - .GetRequiredService() - .Initialize(); + var options = context.ServiceProvider.GetRequiredService>().Value; + + if (!options.IsServiceBusDisabled) + { + context + .ServiceProvider + .GetRequiredService() + .Initialize(); + } + } } From b73781874aaa245505264da1dabe7366314176a2 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Fri, 11 Mar 2022 15:43:05 +0300 Subject: [PATCH 016/242] feat: Convert short date,time and datetime functions to pipe #11909 --- .../packages/core/src/lib/core.module.ts | 10 ++++++ .../packages/core/src/lib/pipes/index.ts | 3 ++ .../src/lib/pipes/short-date-time.pipe.ts | 32 +++++++++++++++++++ .../core/src/lib/pipes/short-date.pipe.ts | 32 +++++++++++++++++++ .../core/src/lib/pipes/short-time.pipe.ts | 32 +++++++++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/pipes/short-date-time.pipe.ts create mode 100644 npm/ng-packs/packages/core/src/lib/pipes/short-date.pipe.ts create mode 100644 npm/ng-packs/packages/core/src/lib/pipes/short-time.pipe.ts diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 1de96ef0ba..238ed9bb02 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -34,6 +34,9 @@ import { TENANT_KEY } from './tokens/tenant-key.token'; import { noop } from './utils/common-utils'; import './utils/date-extensions'; import { getInitialData, localeInitializer } from './utils/initial-utils'; +import { ShortDateTimePipe } from './pipes/short-date-time.pipe'; +import { ShortTimePipe } from './pipes/short-time.pipe'; +import { ShortDatePipe } from './pipes/short-date.pipe'; export function storageFactory(): OAuthStorage { return oAuthStorage; @@ -67,6 +70,9 @@ export function storageFactory(): OAuthStorage { SortPipe, StopPropagationDirective, ToInjectorPipe, + ShortDateTimePipe, + ShortTimePipe, + ShortDatePipe ], imports: [ OAuthModule, @@ -92,6 +98,10 @@ export function storageFactory(): OAuthStorage { SortPipe, StopPropagationDirective, ToInjectorPipe, + ShortDateTimePipe, + ShortTimePipe, + ShortDatePipe + ], providers: [LocalizationPipe] }) diff --git a/npm/ng-packs/packages/core/src/lib/pipes/index.ts b/npm/ng-packs/packages/core/src/lib/pipes/index.ts index 31e0a76593..71ce383cd3 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/index.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/index.ts @@ -1,3 +1,6 @@ export * from './localization.pipe'; export * from './sort.pipe'; export * from './to-injector.pipe'; +export * from './short-date.pipe'; +export * from './short-time.pipe'; +export * from './short-date-time.pipe'; diff --git a/npm/ng-packs/packages/core/src/lib/pipes/short-date-time.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/short-date-time.pipe.ts new file mode 100644 index 0000000000..ef12be47d8 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/pipes/short-date-time.pipe.ts @@ -0,0 +1,32 @@ +import { DatePipe, DATE_PIPE_DEFAULT_TIMEZONE } from '@angular/common'; +import { Inject, LOCALE_ID, Optional, Pipe, PipeTransform } from '@angular/core'; +import { ConfigStateService } from '../services'; +import { getShortDateShortTimeFormat } from '../utils/date-utils'; + +@Pipe({ + name: 'shortDateTime', + pure: true, +}) +export class ShortDateTimePipe extends DatePipe implements PipeTransform { + + constructor(private configStateService: ConfigStateService, + @Inject(LOCALE_ID) locale: string, + @Inject(DATE_PIPE_DEFAULT_TIMEZONE) @Optional() defaultTimezone?: string|null + ) { + super(locale, defaultTimezone) + } + + transform(value: Date | string | number, format?: string, timezone?: string, locale?: string): string | null; + transform(value: null | undefined, format?: string, timezone?: string, locale?: string): null; + transform( + value: string|number|Date|null|undefined, timezone?: string, + locale?: string): string|null { + + const format = getShortDateShortTimeFormat(this.configStateService); + return super.transform(value,format,timezone,locale) + } + + +} + + diff --git a/npm/ng-packs/packages/core/src/lib/pipes/short-date.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/short-date.pipe.ts new file mode 100644 index 0000000000..30c9bd9323 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/pipes/short-date.pipe.ts @@ -0,0 +1,32 @@ +import { DatePipe, DATE_PIPE_DEFAULT_TIMEZONE } from '@angular/common'; +import { Inject, LOCALE_ID, Optional, Pipe, PipeTransform } from '@angular/core'; +import { ConfigStateService } from '../services'; +import { getShortDateFormat } from '../utils/date-utils'; + +@Pipe({ + name: 'shortDate', + pure: true, +}) +export class ShortDatePipe extends DatePipe implements PipeTransform { + + constructor(private configStateService: ConfigStateService, + @Inject(LOCALE_ID) locale: string, + @Inject(DATE_PIPE_DEFAULT_TIMEZONE) @Optional() defaultTimezone?: string|null + ) { + super(locale, defaultTimezone) + } + + transform(value: Date | string | number, format?: string, timezone?: string, locale?: string): string | null; + transform(value: null | undefined, format?: string, timezone?: string, locale?: string): null; + transform( + value: string|number|Date|null|undefined, timezone?: string, + locale?: string): string|null { + + const format = getShortDateFormat(this.configStateService); + return super.transform(value,format,timezone,locale) + } + + +} + + diff --git a/npm/ng-packs/packages/core/src/lib/pipes/short-time.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/short-time.pipe.ts new file mode 100644 index 0000000000..cf0450673d --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/pipes/short-time.pipe.ts @@ -0,0 +1,32 @@ +import { DatePipe, DATE_PIPE_DEFAULT_TIMEZONE } from '@angular/common'; +import { Inject, LOCALE_ID, Optional, Pipe, PipeTransform } from '@angular/core'; +import { ConfigStateService } from '../services'; +import { getShortTimeFormat } from '../utils/date-utils'; + +@Pipe({ + name: 'shortTime', + pure: true, +}) +export class ShortTimePipe extends DatePipe implements PipeTransform { + + constructor(private configStateService: ConfigStateService, + @Inject(LOCALE_ID) locale: string, + @Inject(DATE_PIPE_DEFAULT_TIMEZONE) @Optional() defaultTimezone?: string|null + ) { + super(locale, defaultTimezone) + } + + transform(value: Date | string | number, format?: string, timezone?: string, locale?: string): string | null; + transform(value: null | undefined, format?: string, timezone?: string, locale?: string): null; + transform( + value: string|number|Date|null|undefined, timezone?: string, + locale?: string): string|null { + + const format = getShortTimeFormat(this.configStateService); + return super.transform(value,format,timezone,locale) + } + + +} + + From 41cd83240f09bda635b2a00e56945d77f735db2d Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Fri, 11 Mar 2022 21:22:44 +0800 Subject: [PATCH 017/242] Update abp/docs/zh-Hans/Modules/Background-Jobs.md --- docs/zh-Hans/Modules/Background-Jobs.md | 56 ++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Modules/Background-Jobs.md b/docs/zh-Hans/Modules/Background-Jobs.md index b183febd80..87c57acde7 100644 --- a/docs/zh-Hans/Modules/Background-Jobs.md +++ b/docs/zh-Hans/Modules/Background-Jobs.md @@ -1,3 +1,55 @@ -# Background Jobs Module +# 后台作业模块 -待添加 \ No newline at end of file +后台作业模块实现了 `IBackgroundJobStore` 接口,并且可以使用ABP框架的默认后台作业管理。如果你不想使用这个模块,那么你需要自己实现 `IBackgroundJobStore` 接口。 + +> 本文档仅介绍后台作业模块,该模块将后台作业持久化到数据库。有关后台作业系统的更多信息,请参阅[后台作业](../Background-Jobs.md)文档。 + +## 如何使用 + +当您使用ABP框架[创建一个新的解决方案](https://abp.io/get-started)时,这个模块是(作为NuGet/NPM包)预先安装的。您可以继续将其作为软件包使用并轻松获取更新,也可以将其源代码包含到解决方案中(请参阅 `get-source` [CLI](../CLI.md)命令)以开发自定义模块。 + +### 源代码 + +此模块的源代码可在[此处](https://github.com/abpframework/abp/tree/dev/modules/background-jobs)访问。源代码是由[麻省理工学院](https://choosealicense.com/licenses/mit/)授权的,所以你可以自由使用和定制它。 + +## 内部结构 + +### 领域层 + +#### 聚合 + +- `BackgroundJobRecord` (聚合根): 表示后台工作记录. + +#### 仓储 + +为该模块定义了以下自定义仓储: + +- `IBackgroundJobRepository` + +### 数据库提供程序 + +#### 通用 + +##### 表/集合的前缀与架构 + +默认情况下,所有表/集合都使用 `Abp` 前缀。如果需要更改表前缀或设置架构名称(如果数据库提供程序支持),请在 `BackgroundJobsDbProperties` 类上设置静态属性。 + +##### 连接字符串 + +此模块使用 `AbpBackgroundJobs` 作为连接字符串名称。如果不使用此名称定义连接字符串,它将返回 `Default` 连接字符串。有关详细信息,请参阅[连接字符串](https://docs.abp.io/en/abp/latest/Connection-Strings)文档。 + +#### Entity Framework Core + +##### 表 + +- **AbpBackgroundJobs** + +#### MongoDB + +##### 集合 + +- **AbpBackgroundJobs** + +## 另请参阅 + +* [后台作业系统](../Background-Jobs.md) From 1a4d44ce9fb3185019001f5dab70cb6b44345dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 11 Mar 2022 16:41:21 +0300 Subject: [PATCH 018/242] Added discord channel link --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index dbf8bce537..1d7b7e51a7 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,10 @@ ABP is a community-driven open source project. See [the contribution guide](http Love ABP Framework? **Please give a star** to this repository :star: +## Discord Channel + +You can use this link to join the ABP Community Discord Server: https://discord.gg/uVGt6hyhcm + ## ABP Commercial See also [ABP Commercial](https://commercial.abp.io/) if you are looking for pre-built application modules, professional themes, code generation tooling and premium support for the ABP Framework. From 4c67d1a1dc8a63108d1d21d7def67effbe1f12b7 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Fri, 11 Mar 2022 22:45:11 +0800 Subject: [PATCH 019/242] Update Specification.md --- docs/zh-Hans/Specifications.md | 258 ++++++++++++++++++++++++++++++++- 1 file changed, 256 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Specifications.md b/docs/zh-Hans/Specifications.md index f927c80255..bc5c67101b 100644 --- a/docs/zh-Hans/Specifications.md +++ b/docs/zh-Hans/Specifications.md @@ -1,3 +1,257 @@ -## 规约 +## 规范 -TODO.. \ No newline at end of file +规范模式用于为实体和其他业务对象定义 **命名、可复用、可组合和可测试的过滤器** 。 + +> 规范是领域层的一部分。 + +## 安装 + +> 这个包 **已经安装** 在启动模板中。所以,大多数时候你不需要手动去安装。 + +添加 [Volo.Abp.Specifications](https://abp.io/package-detail/Volo.Abp.Specifications) 包到你的项目. 如果当前文件夹是您的项目的根目录(`.csproj`)时,您可以在命令行终端中使用 [ABP CLI](CLI.md) *add package* 命令: + +````bash +abp add-package Volo.Abp.Specifications +```` + +## 定义规范 + +假设您定义了如下的顾客实体: + +````csharp +using System; +using Volo.Abp.Domain.Entities; + +namespace MyProject +{ + public class Customer : AggregateRoot + { + public string Name { get; set; } + + public byte Age { get; set; } + + public long Balance { get; set; } + + public string Location { get; set; } + } +} +```` + +您可以创建一个由 `Specification` 派生的新规范类。 + +**例如:规定选择一个18岁以上的顾客** + +````csharp +using System; +using System.Linq.Expressions; +using Volo.Abp.Specifications; + +namespace MyProject +{ + public class Age18PlusCustomerSpecification : Specification + { + public override Expression> ToExpression() + { + return c => c.Age >= 18; + } + } +} +```` + +您只需通过定义一个lambda[表达式](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/lambda-expressions)来定义规范。 + +> 您也可以直接实现`ISpecification`接口,但是基类`Specification`做了大量简化。 + +## 使用规范 + +这里有两种常见的规范用例。 + +### IsSatisfiedBy + +`IsSatisfiedBy` 方法可以用于检查单个对象是否满足规范。 + +**例如:如果顾客不满足年龄规定,则抛出异常** + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace MyProject +{ + public class CustomerService : ITransientDependency + { + public async Task BuyAlcohol(Customer customer) + { + if (!new Age18PlusCustomerSpecification().IsSatisfiedBy(customer)) + { + throw new Exception( + "这位顾客不满足年龄规定!" + ); + } + + //TODO... + } + } +} +```` + +### ToExpression & Repositories + +`ToExpression()` 方法可用于将规范转化为表达式。通过这种方式,您可以使用规范在**数据库查询时过滤实体**。 + +````csharp +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Domain.Services; + +namespace MyProject +{ + public class CustomerManager : DomainService, ITransientDependency + { + private readonly IRepository _customerRepository; + + public CustomerManager(IRepository customerRepository) + { + _customerRepository = customerRepository; + } + + public async Task> GetCustomersCanBuyAlcohol() + { + var queryable = await _customerRepository.GetQueryableAsync(); + var query = queryable.Where( + new Age18PlusCustomerSpecification().ToExpression() + ); + + return await AsyncExecuter.ToListAsync(query); + } + } +} +```` + +> 规范被正确地转换为SQL/数据库查询语句,并且在DBMS端高效执行。虽然它与规范无关,但如果您想了解有关 `AsyncExecuter` 的更多信息,请参阅[仓储](Repositories.md)文档。 + +实际上,没有必要使用 `ToExpression()` 方法,因为规范会自动转换为表达式。这也会起作用: + +````csharp +var queryable = await _customerRepository.GetQueryableAsync(); +var query = queryable.Where( + new Age18PlusCustomerSpecification() +); +```` + +## 编写规范 + +规范有一个强大的功能是,它们可以与`And`、`Or`、`Not`以及`AndNot`扩展方法组合使用。 + +假设您有另一个规范,定义如下: + +```csharp +using System; +using System.Linq.Expressions; +using Volo.Abp.Specifications; + +namespace MyProject +{ + public class PremiumCustomerSpecification : Specification + { + public override Expression> ToExpression() + { + return (customer) => (customer.Balance >= 100000); + } + } +} +``` + +您可以将 `PremiumCustomerSpecification` 和 `Age18PlusCustomerSpecification` 结合起来,查询优质成人顾客的数量,如下所示: + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Domain.Services; +using Volo.Abp.Specifications; + +namespace MyProject +{ + public class CustomerManager : DomainService, ITransientDependency + { + private readonly IRepository _customerRepository; + + public CustomerManager(IRepository customerRepository) + { + _customerRepository = customerRepository; + } + + public async Task GetAdultPremiumCustomerCountAsync() + { + return await _customerRepository.CountAsync( + new Age18PlusCustomerSpecification() + .And(new PremiumCustomerSpecification()).ToExpression() + ); + } + } +} +```` + +如果你想让这个组合成为一个可复用的规范,你可以创建这样一个组合的规范类,它派生自`AndSpecification`: + +````csharp +using Volo.Abp.Specifications; + +namespace MyProject +{ + public class AdultPremiumCustomerSpecification : AndSpecification + { + public AdultPremiumCustomerSpecification() + : base(new Age18PlusCustomerSpecification(), + new PremiumCustomerSpecification()) + { + } + } +} +```` + +现在,您就可以向下面一样重新编写 `GetAdultPremiumCustomerCountAsync` 方法: + +````csharp +public async Task GetAdultPremiumCustomerCountAsync() +{ + return await _customerRepository.CountAsync( + new AdultPremiumCustomerSpecification() + ); +} +```` + +> 你可以从这些例子中看到规范的强大之处。如果您之后想要更改 `PremiumCustomerSpecification` ,比如将余额从 `100.000` 修改为 `200.000` ,所有查询语句和合并的规范都将受到本次更改的影响。这是减少代码重复的好方法! + +## 讨论 + +虽然规范模式通常与C#的lambda表达式相比较,算是一种更老的方式。一些开发人员可能认为不再需要它,我们可以直接将表达式传入到仓储或领域服务中,如下所示: + +````csharp +var count = await _customerRepository.CountAsync(c => c.Balance > 100000 && c.Age => 18); +```` + +自从ABP的[仓储](Repositories.md)支持表达式,这是一个完全有效的用法。您不必在应用程序中定义或使用任何规范,可以直接使用表达式。 + +所以,规范的意义是什么?为什么或者应该在什么时候考虑去使用它? + +### 何时使用? + +使用规范的一些好处: + +- **可复用**:假设您在代码库的许多地方都需要用到优质顾客过滤器。如果使用表达式而不创建规范,那么如果以后更改“优质顾客”的定义会发生什么?假设您想将最低余额从100000美元更改为250000美元,并添加另一个条件,成为顾客超过3年。如果使用了规范,只需修改一个类。如果在任何其他地方重复(复制/粘贴)相同的表达式,则需要更改所有的表达式。 +- **可组合**:可以组合多个规范来创建新规范。这是另一种可复用性。 +- **命名**:`PremiumCustomerSpecification` 更好地解释了为什么使用规范,而不是复杂的表达式。因此,如果在您的业务中使用了一个有意义的表达式,请考虑使用规范。 +- **可测试**:规范是一个单独(且易于)测试的对象。 + +### 什么时侯不要使用? + +- **没有业务含义的表达式**:不要对与业务无关的表达式和操作使用规范。 +- **报表**:如果只是创建报表,不要创建规范,而是直接使用 `IQueryable` 和LINQ表达式。您甚至可以使用普通SQL、视图或其他工具生成报表。DDD不关心报表,因此从性能角度来看,查询底层数据存储的方式可能很重要。 From 8d5dd8260a1c2dee6d49d88d85901a5261fb3bf3 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Fri, 11 Mar 2022 17:59:43 +0300 Subject: [PATCH 020/242] Move some localizations in AdminResources to BaseResources --- .../Admin/Localization/Resources/en.json | 12 ------------ .../Base/Localization/Resources/en.json | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index d2702c83b9..023a4b18ed 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -337,18 +337,6 @@ "Expired": "Expired", "TrialLicenseDeletionWarningMessage": "Are you sure you want to delete the trial license? Trial license, organization, support accounts will be deleted!", "LicenseCategoryFilter": "License category", - "Volo.AbpIo.Commercial:030000": "You already used your trial period.", - "Volo.AbpIo.Commercial:030001": "This organization name already exists.", - "Volo.AbpIo.Commercial:030002": "Once activated, trial license cannot be set to requested!", - "Volo.AbpIo.Commercial:030003": "There is no such status!", - "Volo.AbpIo.Commercial:030004": "Status could not be changed due to an unexpected error!", - "Volo.AbpIo.Commercial:030005": "Start and end date can be updated when the trial license is in the -activated- status!", - "Volo.AbpIo.Commercial:030006": "End date must always be greater than start date!", - "Volo.AbpIo.Commercial:030007": "This trial license has already been activated once!", - "Volo.AbpIo.Commercial:030008": "Purchase date can be set only when status is Purchased!", - "Volo.AbpIo.Commercial:030009": "User not found!", - "Volo.AbpIo.Commercial:030010": "To purchase the trial license, first you need to activate your trial license!", - "Volo.AbpIo.Commercial:030011": "You cannot delete a trial license when it is purchased!", "Permission:SendWelcomeEmail": "Send Welcome Email", "SendWelcomeEmail": "Send Welcome Email", "SendWelcomeEmailWarningMessage": "Are you sure you want to send welcome email to the organization members?", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index a214e251af..bfb5da247b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -14,6 +14,18 @@ "Volo.AbpIo.Domain:020002": "Could not delete this NPM Package because \"{Modules}\" Modules are using this package.", "Volo.AbpIo.Domain:020003": "Could not delete this NPM Package because \"{Modules}\" Modules are using this package and \"{NugetPackages}\" Nuget Packages are dependent to this package.", "Volo.AbpIo.Domain:020004": "Could not delete this Nuget Package because \"{Modules}\" Modules are using this package.", + "Volo.AbpIo.Domain:030000": "You already used your trial period.", + "Volo.AbpIo.Domain:030001": "This organization name already exists.", + "Volo.AbpIo.Domain:030002": "Once activated, trial license cannot be set to requested!", + "Volo.AbpIo.Domain:030003": "There is no such status!", + "Volo.AbpIo.Domain:030004": "Status could not be changed due to an unexpected error!", + "Volo.AbpIo.Domain:030005": "Start and end date can be updated when the trial license is in the -activated- status!", + "Volo.AbpIo.Domain:030006": "End date must always be greater than start date!", + "Volo.AbpIo.Domain:030007": "This trial license has already been activated once!", + "Volo.AbpIo.Domain:030008": "Purchase date can be set only when status is Purchased!", + "Volo.AbpIo.Domain:030009": "User not found!", + "Volo.AbpIo.Domain:030010": "To purchase the trial license, first you need to activate your trial license!", + "Volo.AbpIo.Domain:030011": "You cannot delete a trial license when it is purchased!", "WantToLearn?": "Want to learn?", "ReadyToGetStarted?": "Ready to get started?", "JoinOurCommunity": "Join our community", From 1263bf51e6a82494d77926513bdfc4dca913640e Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sat, 12 Mar 2022 13:27:44 +0800 Subject: [PATCH 021/242] Update Background-Jobs.md --- docs/zh-Hans/Modules/Background-Jobs.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/zh-Hans/Modules/Background-Jobs.md b/docs/zh-Hans/Modules/Background-Jobs.md index 87c57acde7..fe021f1a56 100644 --- a/docs/zh-Hans/Modules/Background-Jobs.md +++ b/docs/zh-Hans/Modules/Background-Jobs.md @@ -1,16 +1,16 @@ # 后台作业模块 -后台作业模块实现了 `IBackgroundJobStore` 接口,并且可以使用ABP框架的默认后台作业管理。如果你不想使用这个模块,那么你需要自己实现 `IBackgroundJobStore` 接口。 +后台作业模块实现了 `IBackgroundJobStore` 接口,并且可以使用ABP框架的默认后台作业管理.如果你不想使用这个模块,那么你需要自己实现 `IBackgroundJobStore` 接口. -> 本文档仅介绍后台作业模块,该模块将后台作业持久化到数据库。有关后台作业系统的更多信息,请参阅[后台作业](../Background-Jobs.md)文档。 +> 本文档仅介绍后台作业模块,该模块将后台作业持久化到数据库.有关后台作业系统的更多信息,请参阅[后台作业](../Background-Jobs.md)文档. ## 如何使用 -当您使用ABP框架[创建一个新的解决方案](https://abp.io/get-started)时,这个模块是(作为NuGet/NPM包)预先安装的。您可以继续将其作为软件包使用并轻松获取更新,也可以将其源代码包含到解决方案中(请参阅 `get-source` [CLI](../CLI.md)命令)以开发自定义模块。 +当你使用ABP框架[创建一个新的解决方案](https://abp.io/get-started)时,这个模块是(作为NuGet/NPM包)预先安装的.你可以继续将其作为软件包使用并轻松获取更新,也可以将其源代码包含到解决方案中(请参阅 `get-source` [CLI](../CLI.md)命令)以开发自定义模块. ### 源代码 -此模块的源代码可在[此处](https://github.com/abpframework/abp/tree/dev/modules/background-jobs)访问。源代码是由[麻省理工学院](https://choosealicense.com/licenses/mit/)授权的,所以你可以自由使用和定制它。 +此模块的源代码可在[此处](https://github.com/abpframework/abp/tree/dev/modules/background-jobs)访问.源代码是由[MIT](https://choosealicense.com/licenses/mit/)授权的,所以你可以自由使用和定制它. ## 内部结构 @@ -32,11 +32,11 @@ ##### 表/集合的前缀与架构 -默认情况下,所有表/集合都使用 `Abp` 前缀。如果需要更改表前缀或设置架构名称(如果数据库提供程序支持),请在 `BackgroundJobsDbProperties` 类上设置静态属性。 +默认情况下,所有表/集合都使用 `Abp` 前缀.如果需要更改表前缀或设置架构名称(如果数据库提供程序支持),请在 `BackgroundJobsDbProperties` 类上设置静态属性. ##### 连接字符串 -此模块使用 `AbpBackgroundJobs` 作为连接字符串名称。如果不使用此名称定义连接字符串,它将返回 `Default` 连接字符串。有关详细信息,请参阅[连接字符串](https://docs.abp.io/en/abp/latest/Connection-Strings)文档。 +此模块使用 `AbpBackgroundJobs` 作为连接字符串名称.如果不使用此名称定义连接字符串,它将返回 `Default` 连接字符串.有关详细信息,请参阅[连接字符串](https://docs.abp.io/en/abp/latest/Connection-Strings)文档. #### Entity Framework Core From 00014eee2f58f50d5b3508cffe5b42ede6694e69 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sat, 12 Mar 2022 13:30:19 +0800 Subject: [PATCH 022/242] Update Specifications.md --- docs/zh-Hans/Specifications.md | 70 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/zh-Hans/Specifications.md b/docs/zh-Hans/Specifications.md index bc5c67101b..40a473dbc0 100644 --- a/docs/zh-Hans/Specifications.md +++ b/docs/zh-Hans/Specifications.md @@ -1,22 +1,22 @@ -## 规范 +## 规约 -规范模式用于为实体和其他业务对象定义 **命名、可复用、可组合和可测试的过滤器** 。 +规约模式用于为实体和其他业务对象定义 **命名、可复用、可组合和可测试的过滤器** . -> 规范是领域层的一部分。 +> 规约是领域层的一部分. ## 安装 -> 这个包 **已经安装** 在启动模板中。所以,大多数时候你不需要手动去安装。 +> 这个包 **已经安装** 在启动模板中.所以,大多数时候你不需要手动去安装. -添加 [Volo.Abp.Specifications](https://abp.io/package-detail/Volo.Abp.Specifications) 包到你的项目. 如果当前文件夹是您的项目的根目录(`.csproj`)时,您可以在命令行终端中使用 [ABP CLI](CLI.md) *add package* 命令: +添加 [Volo.Abp.Specifications](https://abp.io/package-detail/Volo.Abp.Specifications) 包到你的项目. 如果当前文件夹是你的项目的根目录(`.csproj`)时,你可以在命令行终端中使用 [ABP CLI](CLI.md) *add package* 命令: ````bash abp add-package Volo.Abp.Specifications ```` -## 定义规范 +## 定义规约 -假设您定义了如下的顾客实体: +假设你定义了如下的顾客实体: ````csharp using System; @@ -37,9 +37,9 @@ namespace MyProject } ```` -您可以创建一个由 `Specification` 派生的新规范类。 +你可以创建一个由 `Specification` 派生的新规约类. -**例如:规定选择一个18岁以上的顾客** +**例如:规定选择一个18岁以上的顾客** ````csharp using System; @@ -58,19 +58,19 @@ namespace MyProject } ```` -您只需通过定义一个lambda[表达式](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/lambda-expressions)来定义规范。 +你只需通过定义一个lambda[表达式](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/lambda-expressions)来定义规约. -> 您也可以直接实现`ISpecification`接口,但是基类`Specification`做了大量简化。 +> 你也可以直接实现`ISpecification`接口,但是基类`Specification`做了大量简化. -## 使用规范 +## 使用规约 -这里有两种常见的规范用例。 +这里有两种常见的规约用例. ### IsSatisfiedBy -`IsSatisfiedBy` 方法可以用于检查单个对象是否满足规范。 +`IsSatisfiedBy` 方法可以用于检查单个对象是否满足规约. -**例如:如果顾客不满足年龄规定,则抛出异常** +**例如:如果顾客不满足年龄规定,则抛出异常** ````csharp using System; @@ -98,7 +98,7 @@ namespace MyProject ### ToExpression & Repositories -`ToExpression()` 方法可用于将规范转化为表达式。通过这种方式,您可以使用规范在**数据库查询时过滤实体**。 +`ToExpression()` 方法可用于将规约转化为表达式.通过这种方式,你可以使用规约在**数据库查询时过滤实体**. ````csharp using System; @@ -133,9 +133,9 @@ namespace MyProject } ```` -> 规范被正确地转换为SQL/数据库查询语句,并且在DBMS端高效执行。虽然它与规范无关,但如果您想了解有关 `AsyncExecuter` 的更多信息,请参阅[仓储](Repositories.md)文档。 +> 规约被正确地转换为SQL/数据库查询语句,并且在DBMS端高效执行.虽然它与规约无关,但如果你想了解有关 `AsyncExecuter` 的更多信息,请参阅[仓储](Repositories.md)文档. -实际上,没有必要使用 `ToExpression()` 方法,因为规范会自动转换为表达式。这也会起作用: +实际上,没有必要使用 `ToExpression()` 方法,因为规约会自动转换为表达式.这也会起作用: ````csharp var queryable = await _customerRepository.GetQueryableAsync(); @@ -144,11 +144,11 @@ var query = queryable.Where( ); ```` -## 编写规范 +## 编写规约 -规范有一个强大的功能是,它们可以与`And`、`Or`、`Not`以及`AndNot`扩展方法组合使用。 +规约有一个强大的功能是,它们可以与`And`、`Or`、`Not`以及`AndNot`扩展方法组合使用. -假设您有另一个规范,定义如下: +假设你有另一个规约,定义如下: ```csharp using System; @@ -167,7 +167,7 @@ namespace MyProject } ``` -您可以将 `PremiumCustomerSpecification` 和 `Age18PlusCustomerSpecification` 结合起来,查询优质成人顾客的数量,如下所示: +你可以将 `PremiumCustomerSpecification` 和 `Age18PlusCustomerSpecification` 结合起来,查询优质成人顾客的数量,如下所示: ````csharp using System; @@ -199,7 +199,7 @@ namespace MyProject } ```` -如果你想让这个组合成为一个可复用的规范,你可以创建这样一个组合的规范类,它派生自`AndSpecification`: +如果你想让这个组合成为一个可复用的规约,你可以创建这样一个组合的规约类,它派生自`AndSpecification`: ````csharp using Volo.Abp.Specifications; @@ -217,7 +217,7 @@ namespace MyProject } ```` -现在,您就可以向下面一样重新编写 `GetAdultPremiumCustomerCountAsync` 方法: +现在,你就可以向下面一样重新编写 `GetAdultPremiumCustomerCountAsync` 方法: ````csharp public async Task GetAdultPremiumCustomerCountAsync() @@ -228,30 +228,30 @@ public async Task GetAdultPremiumCustomerCountAsync() } ```` -> 你可以从这些例子中看到规范的强大之处。如果您之后想要更改 `PremiumCustomerSpecification` ,比如将余额从 `100.000` 修改为 `200.000` ,所有查询语句和合并的规范都将受到本次更改的影响。这是减少代码重复的好方法! +> 你可以从这些例子中看到规约的强大之处.如果你之后想要更改 `PremiumCustomerSpecification` ,比如将余额从 `100.000` 修改为 `200.000` ,所有查询语句和合并的规约都将受到本次更改的影响.这是减少代码重复的好方法! ## 讨论 -虽然规范模式通常与C#的lambda表达式相比较,算是一种更老的方式。一些开发人员可能认为不再需要它,我们可以直接将表达式传入到仓储或领域服务中,如下所示: +虽然规约模式通常与C#的lambda表达式相比较,算是一种更老的方式.一些开发人员可能认为不再需要它,我们可以直接将表达式传入到仓储或领域服务中,如下所示: ````csharp var count = await _customerRepository.CountAsync(c => c.Balance > 100000 && c.Age => 18); ```` -自从ABP的[仓储](Repositories.md)支持表达式,这是一个完全有效的用法。您不必在应用程序中定义或使用任何规范,可以直接使用表达式。 +自从ABP的[仓储](Repositories.md)支持表达式,这是一个完全有效的用法.你不必在应用程序中定义或使用任何规约,可以直接使用表达式. -所以,规范的意义是什么?为什么或者应该在什么时候考虑去使用它? +所以,规约的意义是什么?为什么或者应该在什么时候考虑去使用它? ### 何时使用? -使用规范的一些好处: +使用规约的一些好处: -- **可复用**:假设您在代码库的许多地方都需要用到优质顾客过滤器。如果使用表达式而不创建规范,那么如果以后更改“优质顾客”的定义会发生什么?假设您想将最低余额从100000美元更改为250000美元,并添加另一个条件,成为顾客超过3年。如果使用了规范,只需修改一个类。如果在任何其他地方重复(复制/粘贴)相同的表达式,则需要更改所有的表达式。 -- **可组合**:可以组合多个规范来创建新规范。这是另一种可复用性。 -- **命名**:`PremiumCustomerSpecification` 更好地解释了为什么使用规范,而不是复杂的表达式。因此,如果在您的业务中使用了一个有意义的表达式,请考虑使用规范。 -- **可测试**:规范是一个单独(且易于)测试的对象。 +- **可复用**:假设你在代码库的许多地方都需要用到优质顾客过滤器.如果使用表达式而不创建规约,那么如果以后更改“优质顾客”的定义会发生什么?假设你想将最低余额从100000美元更改为250000美元,并添加另一个条件,成为顾客超过3年.如果使用了规约,只需修改一个类.如果在任何其他地方重复(复制/粘贴)相同的表达式,则需要更改所有的表达式. +- **可组合**:可以组合多个规约来创建新规约.这是另一种可复用性. +- **命名**:`PremiumCustomerSpecification` 更好地解释了为什么使用规约,而不是复杂的表达式.因此,如果在你的业务中使用了一个有意义的表达式,请考虑使用规约. +- **可测试**:规约是一个单独(且易于)测试的对象. ### 什么时侯不要使用? -- **没有业务含义的表达式**:不要对与业务无关的表达式和操作使用规范。 -- **报表**:如果只是创建报表,不要创建规范,而是直接使用 `IQueryable` 和LINQ表达式。您甚至可以使用普通SQL、视图或其他工具生成报表。DDD不关心报表,因此从性能角度来看,查询底层数据存储的方式可能很重要。 +- **没有业务含义的表达式**:不要对与业务无关的表达式和操作使用规约. +- **报表**:如果只是创建报表,不要创建规约,而是直接使用 `IQueryable` 和LINQ表达式.你甚至可以使用普通SQL、视图或其他工具生成报表.DDD不关心报表,因此从性能角度来看,查询底层数据存储的方式可能很重要. From 848c4947b87cc88d3a18f6079ea2a21fefd6e62a Mon Sep 17 00:00:00 2001 From: albert <9526587+ebicoglu@users.noreply.github.com> Date: Sat, 12 Mar 2022 19:39:18 +0300 Subject: [PATCH 023/242] Update en.json --- .../Base/Localization/Resources/en.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index bfb5da247b..fe0947da89 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -14,17 +14,17 @@ "Volo.AbpIo.Domain:020002": "Could not delete this NPM Package because \"{Modules}\" Modules are using this package.", "Volo.AbpIo.Domain:020003": "Could not delete this NPM Package because \"{Modules}\" Modules are using this package and \"{NugetPackages}\" Nuget Packages are dependent to this package.", "Volo.AbpIo.Domain:020004": "Could not delete this Nuget Package because \"{Modules}\" Modules are using this package.", - "Volo.AbpIo.Domain:030000": "You already used your trial period.", + "Volo.AbpIo.Domain:030000": "You have already completed your trial period.", "Volo.AbpIo.Domain:030001": "This organization name already exists.", - "Volo.AbpIo.Domain:030002": "Once activated, trial license cannot be set to requested!", + "Volo.AbpIo.Domain:030002": "Once activated, you cannot switch the trial license to -requested- status!", "Volo.AbpIo.Domain:030003": "There is no such status!", "Volo.AbpIo.Domain:030004": "Status could not be changed due to an unexpected error!", "Volo.AbpIo.Domain:030005": "Start and end date can be updated when the trial license is in the -activated- status!", - "Volo.AbpIo.Domain:030006": "End date must always be greater than start date!", - "Volo.AbpIo.Domain:030007": "This trial license has already been activated once!", - "Volo.AbpIo.Domain:030008": "Purchase date can be set only when status is Purchased!", + "Volo.AbpIo.Domain:030006": "The end date must be greater than the start date!", + "Volo.AbpIo.Domain:030007": "This trial license has already been activated!", + "Volo.AbpIo.Domain:030008": "The purchase date can be set only when the status is -purchased-!", "Volo.AbpIo.Domain:030009": "User not found!", - "Volo.AbpIo.Domain:030010": "To purchase the trial license, first you need to activate your trial license!", + "Volo.AbpIo.Domain:030010": "To purchase the trial license, you first need to activate your trial license!", "Volo.AbpIo.Domain:030011": "You cannot delete a trial license when it is purchased!", "WantToLearn?": "Want to learn?", "ReadyToGetStarted?": "Ready to get started?", From b870fbe4769add75cab464791b546bad18f61af0 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 14 Mar 2022 08:54:31 +0300 Subject: [PATCH 024/242] Add code-mirror mapping for test app --- .../Volo.CmsKit.Web.Unified/abp.resourcemapping.js | 5 ++++- .../host/Volo.CmsKit.Web.Unified/package.json | 3 ++- .../cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock | 13 +++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js index 82b2d4b649..b473302023 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js @@ -7,6 +7,9 @@ module.exports = { "@libs" ], mappings: { - + "@node_modules/codemirror/lib/*.*": "@libs/codemirror/", + "@node_modules/codemirror/mode/**/*.*": "@libs/codemirror/mode/", + "@node_modules/codemirror/theme/**/*.*": "@libs/codemirror/theme/", + "@node_modules/codemirror/addon/**/*.*": "@libs/codemirror/addon/" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index c27b4dc457..909a876b9d 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.0-rc.1", - "@abp/cms-kit": "5.2.0-rc.1" + "@abp/cms-kit": "5.2.0-rc.1", + "@abp/codemirror": "~5.2.0-rc.1" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index 47305a1cad..e69e2daced 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -90,6 +90,14 @@ "@abp/cms-kit.admin" "~5.2.0-rc.1" "@abp/cms-kit.public" "~5.2.0-rc.1" +"@abp/codemirror@~5.2.0-rc.1": + version "5.2.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-5.2.0-rc.1.tgz#0f06b4396056d1f3c854e67127d84781690d554f" + integrity sha512-iYl9LnHJTZFGUF/WJdGwXwTDUtfrodqr4RAEG+OBETe55yjGLmEW9cRjqgyZdX8UZvYGv9kSD3ScVUrv3woa/A== + dependencies: + "@abp/core" "~5.2.0-rc.1" + codemirror "^5.65.1" + "@abp/core@~5.2.0-rc.1": version "5.2.0-rc.1" resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.0-rc.1.tgz#28dd4949d6b45a2a75f4b76fe0b78b9fa809755d" @@ -987,6 +995,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codemirror@^5.65.1: + version "5.65.2" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.2.tgz#5799a70cb3d706e10f60e267245e3a75205d3dd9" + integrity sha512-SZM4Zq7XEC8Fhroqe3LxbEEX1zUPWH1wMr5zxiBuiUF64iYOUH/JI88v4tBag8MiBS8B8gRv8O1pPXGYXQ4ErA== + collection-map@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" From 68194d7f85b736e5834aeab6700b4c97a1dcf8d1 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 14 Mar 2022 09:08:52 +0300 Subject: [PATCH 025/242] Add style & script editor for Page Create/Update --- .../Pages/CmsKit/Pages/Create.cshtml | 9 ++++++-- .../Pages/CmsKit/Pages/Update.cshtml | 5 +++++ .../Pages/CmsKit/Pages/create.js | 22 +++++++++++++++++-- .../Pages/CmsKit/Pages/update.js | 18 +++++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml index 841576e761..4671cb2ca2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml @@ -1,6 +1,7 @@ @page @using System.Globalization +@using Volo.Abp.AspNetCore.Mvc.UI.Packages.Codemirror @using Volo.Abp.AspNetCore.Mvc.UI.Packages.TuiEditor @using Volo.Abp.AspNetCore.Mvc.UI.Packages.Uppy @using Volo.CmsKit.Admin.Web.Pages @@ -22,6 +23,9 @@ + + + @@ -31,6 +35,7 @@ @section styles { + } @@ -56,11 +61,11 @@ - + - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml index 1271502946..499ad1b633 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml @@ -1,6 +1,7 @@ @page "{Id}" @using System.Globalization +@using Volo.Abp.AspNetCore.Mvc.UI.Packages.Codemirror @using Volo.Abp.AspNetCore.Mvc.UI.Packages.TuiEditor @using Volo.Abp.AspNetCore.Mvc.UI.Packages.Uppy @using Volo.Abp.AspNetCore.Mvc.UI.Packages.Slugify @@ -23,6 +24,9 @@ + + + @@ -32,6 +36,7 @@ @section styles { + } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js index ffe37fe5a8..1de6021a7d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js @@ -6,22 +6,40 @@ $(function () { var $slug = $('#ViewModel_Slug'); var $buttonSubmit = $('#button-page-create'); + var scriptEditor = CodeMirror.fromTextArea(document.getElementById("ViewModel_Script"), { + mode: "javascript", + lineNumbers: true + }); + + var styleEditor = CodeMirror.fromTextArea(document.getElementById("ViewModel_Style"), { + mode: "css", + lineNumbers: true + }); + + $('.nav-tabs a').on('shown.bs.tab', function () { + scriptEditor.refresh(); + styleEditor.refresh(); + }); + $createForm.data('validator').settings.ignore = ":hidden, [contenteditable='true']:not([name]), .tui-popup-wrapper"; $createForm.on('submit', function (e) { e.preventDefault(); - + if ($createForm.valid()) { abp.ui.setBusy(); + $("#ViewModel_Style").val(styleEditor.getValue()); + $("#ViewModel_Script").val(scriptEditor.getValue()); + $createForm.ajaxSubmit({ success: function (result) { abp.notify.success(l('SuccessfullySaved')); abp.ui.clearBusy(); location.href = "../Pages"; }, - error: function(result){ + error: function (result) { abp.ui.clearBusy(); abp.notify.error(result.responseJSON.error.message); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js index 99af38b70c..6bd90dd934 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js @@ -7,6 +7,21 @@ $(function () { $formUpdate.data('validator').settings.ignore = ":hidden, [contenteditable='true']:not([name]), .tui-popup-wrapper"; + var scriptEditor = CodeMirror.fromTextArea(document.getElementById("ViewModel_Script"), { + mode: "javascript", + lineNumbers: true + }); + + var styleEditor = CodeMirror.fromTextArea(document.getElementById("ViewModel_Style"), { + mode: "css", + lineNumbers: true + }); + + $('.nav-tabs a').on('shown.bs.tab', function () { + scriptEditor.refresh(); + styleEditor.refresh(); + }); + $formUpdate.on('submit', function (e) { e.preventDefault(); @@ -14,6 +29,9 @@ $(function () { abp.ui.setBusy(); + $("#ViewModel_Style").val(styleEditor.getValue()); + $("#ViewModel_Script").val(scriptEditor.getValue()); + $formUpdate.ajaxSubmit({ success: function (result) { abp.notify.success(l('SuccessfullySaved')); From 880d23357af54ef7afca428dedc6bac10a089d9a Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 14 Mar 2022 09:32:21 +0300 Subject: [PATCH 026/242] Revert local changes for Volo.CmsKit.Web.Unified --- .../host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js | 4 ---- modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js index b473302023..26cdc6aad9 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/abp.resourcemapping.js @@ -7,9 +7,5 @@ module.exports = { "@libs" ], mappings: { - "@node_modules/codemirror/lib/*.*": "@libs/codemirror/", - "@node_modules/codemirror/mode/**/*.*": "@libs/codemirror/mode/", - "@node_modules/codemirror/theme/**/*.*": "@libs/codemirror/theme/", - "@node_modules/codemirror/addon/**/*.*": "@libs/codemirror/addon/" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index 909a876b9d..c27b4dc457 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -4,7 +4,6 @@ "private": true, "dependencies": { "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.0-rc.1", - "@abp/cms-kit": "5.2.0-rc.1", - "@abp/codemirror": "~5.2.0-rc.1" + "@abp/cms-kit": "5.2.0-rc.1" } } \ No newline at end of file From e40dfb586e18ac522614e0180aafbdc31a36d5b4 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 14 Mar 2022 09:33:14 +0300 Subject: [PATCH 027/242] Update yarn.lock --- .../cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index e69e2daced..47305a1cad 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -90,14 +90,6 @@ "@abp/cms-kit.admin" "~5.2.0-rc.1" "@abp/cms-kit.public" "~5.2.0-rc.1" -"@abp/codemirror@~5.2.0-rc.1": - version "5.2.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-5.2.0-rc.1.tgz#0f06b4396056d1f3c854e67127d84781690d554f" - integrity sha512-iYl9LnHJTZFGUF/WJdGwXwTDUtfrodqr4RAEG+OBETe55yjGLmEW9cRjqgyZdX8UZvYGv9kSD3ScVUrv3woa/A== - dependencies: - "@abp/core" "~5.2.0-rc.1" - codemirror "^5.65.1" - "@abp/core@~5.2.0-rc.1": version "5.2.0-rc.1" resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.0-rc.1.tgz#28dd4949d6b45a2a75f4b76fe0b78b9fa809755d" @@ -995,11 +987,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codemirror@^5.65.1: - version "5.65.2" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.2.tgz#5799a70cb3d706e10f60e267245e3a75205d3dd9" - integrity sha512-SZM4Zq7XEC8Fhroqe3LxbEEX1zUPWH1wMr5zxiBuiUF64iYOUH/JI88v4tBag8MiBS8B8gRv8O1pPXGYXQ4ErA== - collection-map@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" From d703bfedae34bd110d0cd0e387335f00fdad66be Mon Sep 17 00:00:00 2001 From: mehmetuken Date: Mon, 14 Mar 2022 09:50:51 +0300 Subject: [PATCH 028/242] add imports.razor --- .../_Imports.razor | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/_Imports.razor diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/_Imports.razor b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/_Imports.razor new file mode 100644 index 0000000000..fe27745143 --- /dev/null +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/_Imports.razor @@ -0,0 +1,13 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using MyCompanyName.MyProjectName.Blazor.Server +@using Blazorise +@using Blazorise.DataGrid +@using Volo.Abp.BlazoriseUI +@using Volo.Abp.BlazoriseUI.Components \ No newline at end of file From d6157e632f75e5859e0b65f10cde06df2333a46c Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 14 Mar 2022 13:14:56 +0300 Subject: [PATCH 029/242] Add new localizations for abp.io website --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index fe0947da89..f772006632 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -84,7 +84,7 @@ "WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials like product deals & special offers.", "JoinOurMarketingNewsletter": "Join our marketing newsletter", "CommunityPrivacyPolicyConfirmation": "I agree to the Terms & Conditions and Privacy Policy.", - "ABPIO-Common": "ABPIO-Common", + "WouldLikeToReceiveNotification": "I would like to receive the latest news from abp.io websites.", "CommercialNewsletterConfirmationMessage": "I agree to the Terms & Conditions and Privacy Policy.", "FreeDDDEBook": "Free DDD E-Book", "AdditionalServices": "Additional Services", @@ -118,6 +118,7 @@ "ThereIsNoEvent": "There is no event.", "Events": "Events", "Volo.AbpIo.Domain:080000": "There is already a purchase item named \"{Name}\"", - "MasteringAbpFrameworkBook": "Book: Mastering ABP Framework" + "MasteringAbpFrameworkBook": "Book: Mastering ABP Framework", + "ABPIO-CommonPreferenceDefinition": "Get latest news about ABP Platform like new posts, events and more." } } From c543dd5c6b27a588918f43bc15981659780c7280 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 14 Mar 2022 20:47:18 +0800 Subject: [PATCH 030/242] Update distributed-Event-Bus.md Update Distributed-Event-Bus-RabbitMQ-Integration.md --- .../zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md b/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md index ab7cb68bd7..1cd6b5b9dd 100644 --- a/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md +++ b/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md @@ -1,10 +1,10 @@ # 分布式事件总线RabbitMQ集成 -> 本文解释了**如何配置[RabbitMQ](https://www.rabbitmq.com/)**做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. +> 本文解释了 **如何配置[RabbitMQ](https://www.rabbitmq.com/)** 做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. ## 安装 -使用ABP CLI添加[Volo.Abp.EventBus.RabbitMQ[Volo.Abp.EventBus.RabbitMQ](https://www.nuget.org/packages/Volo.Abp.EventBus.RabbitMQ)NuGet包到你的项目: +使用ABP CLI添加[Volo.Abp.EventBus.RabbitMQ](https://www.nuget.org/packages/Volo.Abp.EventBus.RabbitMQ)NuGet包到你的项目: * 安装[ABP CLI](https://docs.abp.io/en/abp/latest/CLI),如果你还没有安装. * 在你想要安装 `Volo.Abp.EventBus.RabbitMQ` 包的 `.csproj` 文件目录打开命令行(终端). @@ -18,7 +18,7 @@ ### `appsettings.json` 文件配置 -这是配置RabbitMQ设置最简单的方法. 它也非常强大,因为你可以使用[由AspNet Core支持的](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/)的任何其他配置源(如环境变量). +这是配置RabbitMQ设置最简单的方法. 它也非常强大,因为你可以使用[由AspNet Core支持](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/)的任何其他配置源(如环境变量). **示例:最小化配置与默认配置连接到本地的RabbitMQ服务器** @@ -151,4 +151,4 @@ Configure(options => }); ```` -使用这些选项类可以与 `appsettings.json` 组合在一起. 在代码中配置选项属性会覆盖配置文件中的值. \ No newline at end of file +使用这些选项类可以与 `appsettings.json` 组合在一起. 在代码中配置选项属性会覆盖配置文件中的值. From d2e1863bbf9cbb5bcf4bbfd0d8ec75199d59eac4 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 14 Mar 2022 20:49:42 +0800 Subject: [PATCH 031/242] Update Rebus-Integration.md Update Distributed-Event-Bus-Rebus-Integration.md --- docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md b/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md index 409b935ace..64fce06d1b 100644 --- a/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md +++ b/docs/zh-Hans/Distributed-Event-Bus-Rebus-Integration.md @@ -1,10 +1,10 @@ # 分布式事件总线Rebus集成 -> 本文解释了**如何配置[Rebus](http://mookid.dk/category/rebus/)**做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. +> 本文解释了 **如何配置[Rebus](http://mookid.dk/category/rebus/)** 做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. ## 安装 -使用ABP CLI添加[Volo.Abp.EventBus.Rebus[Volo.Abp.EventBus.Rebus](https://www.nuget.org/packages/Volo.Abp.EventBus.Rebus)NuGet包到你的项目: +使用ABP CLI添加[Volo.Abp.EventBus.Rebus](https://www.nuget.org/packages/Volo.Abp.EventBus.Rebus)NuGet包到你的项目: * 安装[ABP CLI](https://docs.abp.io/en/abp/latest/CLI),如果你还没有安装. * 在你想要安装 `Volo.Abp.EventBus.Rebus` 包的 `.csproj` 文件目录打开命令行(终端). From 069c338dcbf0037b01cee7c2a999faf9c94b2e62 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 14 Mar 2022 20:51:29 +0800 Subject: [PATCH 032/242] Update Kafka-Integration.md Update Distributed-Event-Bus-Kafka-Integration.md --- docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md b/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md index f621a95fae..171fe3c23b 100644 --- a/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md +++ b/docs/zh-Hans/Distributed-Event-Bus-Kafka-Integration.md @@ -1,10 +1,10 @@ # 分布式事件总线Kafka集成 -> 本文解释了**如何配置[Kafka](https://kafka.apache.org/)**做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. +> 本文解释了 **如何配置[Kafka](https://kafka.apache.org/)** 做为分布式总线提供程序. 参阅[分布式事件总线文档](Distributed-Event-Bus.md)了解如何使用分布式事件总线系统. ## 安装 -使用ABP CLI添加[Volo.Abp.EventBus.Kafka[Volo.Abp.EventBus.Kafka](https://www.nuget.org/packages/Volo.Abp.EventBus.Kafka)NuGet包到你的项目: +使用ABP CLI添加[Volo.Abp.EventBus.Kafka](https://www.nuget.org/packages/Volo.Abp.EventBus.Kafka)NuGet包到你的项目: * 安装[ABP CLI](https://docs.abp.io/en/abp/latest/CLI),如果你还没有安装. * 在你想要安装 `Volo.Abp.EventBus.Kafka` 包的 `.csproj` 文件目录打开命令行(终端). @@ -18,7 +18,7 @@ ### `appsettings.json` 文件配置 -这是配置Kafka设置最简单的方法. 它也非常强大,因为你可以使用[由AspNet Core支持的](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/)的任何其他配置源(如环境变量). +这是配置Kafka设置最简单的方法. 它也非常强大,因为你可以使用[由AspNet Core支持](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/)的任何其他配置源(如环境变量). **示例:最小化配置与默认配置连接到本地的Kafka服务器** @@ -160,4 +160,4 @@ Configure(options => }); ```` -使用这些选项类可以与 `appsettings.json` 组合在一起. 在代码中配置选项属性会覆盖配置文件中的值. \ No newline at end of file +使用这些选项类可以与 `appsettings.json` 组合在一起. 在代码中配置选项属性会覆盖配置文件中的值. From 2bb482deec38d4916baebb4103e90f03ed89b544 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 14 Mar 2022 20:52:43 +0800 Subject: [PATCH 033/242] Update Distributed-Event-Bus.md --- docs/zh-Hans/Distributed-Event-Bus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus.md b/docs/zh-Hans/Distributed-Event-Bus.md index f16aa0610f..e59fa5e726 100644 --- a/docs/zh-Hans/Distributed-Event-Bus.md +++ b/docs/zh-Hans/Distributed-Event-Bus.md @@ -264,7 +264,7 @@ Configure(options => 因此可以实现 `IDistributedEventHandler>` 订阅事件. 但是订阅这样的通用事件不是一个好方法,你可以为实体类型定义对应的ETO. -**示例: 为 `Product` 声明使用 `ProductDto`** +**示例: 为 `Product` 声明使用 `ProductEto`** ````csharp Configure(options => From 8b57594b4b78e672be40fd066ca2d1a1ba9d660f Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 14 Mar 2022 22:23:26 +0800 Subject: [PATCH 034/242] Update Caching.md --- docs/zh-Hans/Caching.md | 259 +++++++++++++++++++++++++--------------- 1 file changed, 162 insertions(+), 97 deletions(-) diff --git a/docs/zh-Hans/Caching.md b/docs/zh-Hans/Caching.md index a75199ce47..491e60eb29 100644 --- a/docs/zh-Hans/Caching.md +++ b/docs/zh-Hans/Caching.md @@ -1,164 +1,180 @@ # 缓存 -ABP框架扩展了ASP.NET Core的分布式缓存系统. +ABP框架扩展了 [ASP.NET Core的分布式缓存系统](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed). -## Volo.Abp.Caching Package +## 安装 -> 默认情况下启动模板已经安装了这个包,所以大部分情况下你不需要手动安装. +> 默认情况下 [启动模板](Startup-Templates/Application.md) 已经安装了这个包. 所以大部分情况下你不需要手动安装. -Volo.Abp.Caching是缓存系统的核心包.使用包管理控制台(PMC)安装到项目: +[Volo.Abp.Caching](https://www.nuget.org/packages/Volo.Abp.Caching)是缓存系统的核心包. 可以使用 [ABP CLI](CLI.md) 的add-package命令将其安装到项目中: ``` -Install-Package Volo.Abp.Caching +abp add-package Volo.Abp.Caching ``` +你需要在包含 `csproj` 文件的文件夹中的命令行终端上运行此命令(请参阅 [其他选项](https://abp.io/package-detail/Volo.Abp.Caching) 安装). -然后将 **AbpCachingModule** 依赖添加到你的模块: +## 使用方式 -```c# -using Volo.Abp.Modularity; -using Volo.Abp.Caching; - -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpCachingModule))] - public class MyModule : AbpModule - { - //... - } -} -``` - -## `IDistributedCache` 接口 +### `IDistributedCache` 接口 -ASP.NET Core 定义了 `IDistributedCache` 接口用于 get/set 缓存值 . 但是会有以下问题: +ASP.NET Core 定义了 `IDistributedCache` 接口用于 get/set 缓存值. 但是会有以下问题: * 它适用于 **byte 数组** 而不是 .NET 对象. 因此你需要对缓存的对象进行**序列化/反序列化**. -* 它为所有的缓存项提供了 **单个 key 池** , 因此 ; +* 它为所有的缓存项提供了 **单个 key 池** , 因此; * 你需要注意键区分 **不同类型的对象**. * 你需要注意**不同租户**(参见[多租户](Multi-Tenancy.md))的缓存项. > `IDistributedCache` 定义在 `Microsoft.Extensions.Caching.Abstractions` 包中. 这使它不仅适用于ASP.NET Core应用程序, 也可用于**任何类型的程序**. -> `IDistributedCache` 接口的默认实现是 `MemoryDistributedCache` 它使用**内存**工作. 参见 [ASP.NET Core文档](https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/distributed) 了解如何切换到 **Redis** 或其他缓存提供程序. +> `IDistributedCache` 接口的默认实现是 `MemoryDistributedCache` 它使用**内存**工作. 参见 [ASP.NET Core文档](https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/distributed) 了解如何切换到 **Redis** 或其他缓存提供程序. 此外, 如果要将Redis用作分布式缓存服务器, [Redis缓存](Redis-Cache.md) 文档. 有关更多信息, 参见 [ASP.NET Core 分布式缓存文档](https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/distributed). -## `IDistributedCache` 接口 +### `IDistributedCache` 接口 ABP框架在[Volo.Abp.Caching](https://www.nuget.org/packages/Volo.Abp.Caching/)包定义了通用的泛型 `IDistributedCache` 接口. `TCacheItem` 是存储在缓存中的对象类型. -`IDistributedCache` 接口了上述中的问题; +`IDistributedCache` 接口解决了上述中的问题; * 它在内部 **序列化/反序列化** 缓存对象. 默认使用 **JSON** 序列化, 但可以替换[依赖注入](Dependency-Injection.md)系统中 `IDistributedCacheSerializer` 服务的实现来覆盖默认的处理. -* 它根据缓存中对象类型自动向缓存key添加 **缓存名称** 前缀. 默认缓存名是缓存对象类的全名(如果你的类名以`CacheItem` 结尾, 那么`CacheItem` 会被忽略,不应用到缓存名称上). 你也可以在缓存类上使用 `CacheName` 设置换缓存的名称. -* 它自动将当前的**租户id**添加到缓存键中, 以区分不同租户的缓存项 (只有在你的应用程序是[多租户](Multi-Tenancy.md)的情况下生效). 在缓存类上应用 `IgnoreMultiTenancy` attribute, 可以在所有的租户间共享缓存. -* 允许为每个应用程序定义 **全局缓存键前缀** ,不同的应用程序可以在共享的分布式缓存中拥有自己的隔离池. +* 它根据缓存中对象类型自动向缓存key添加 **缓存名称** 前缀. 默认缓存名是缓存对象类的全名(如果你的类名以`CacheItem` 结尾, 那么`CacheItem` 会被忽略,不应用到缓存名称上). 你也可以在缓存类上使用 **`CacheName` 特性** 设置缓存的名称. +* 它自动将**当前的租户id**添加到缓存键中, 以区分不同租户的缓存项 (只有在你的应用程序是[多租户](Multi-Tenancy.md)的情况下生效). 如果要在多租户应用程序中的所有租户之间共享缓存对象, 请在缓存项类上定义`IgnoreMultiTenancy`特性以禁用此选项. +* 允许为每个应用程序定义 **全局缓存键前缀** , 不同的应用程序可以在共享的分布式缓存中拥有自己的隔离池. +* 它可以在任何可能绕过缓存的情况下 **容忍错误** 的发生. 这在缓存服务器出现临时问题时非常有用. +* 它有 `GetManyAsync` 和 `SetManyAsync` 等方法, 可以显著提高**批处理**的性能. -### 使用方式 - -缓存中存储项的示例类: +**示例: 在缓存中存储图书名称和价格** ````csharp -public class BookCacheItem +namespace MyProject { - public string Name { get; set; } + public class BookCacheItem + { + public string Name { get; set; } - public float Price { get; set; } + public float Price { get; set; } + } } ```` 你可以注入 `IDistributedCache` 服务用于 get/set `BookCacheItem` 对象. -使用示例: - ````csharp -public class BookService : ITransientDependency -{ - private readonly IDistributedCache _cache; - - public BookService(IDistributedCache cache) - { - _cache = cache; - } - - public async Task GetAsync(Guid bookId) - { - return await _cache.GetOrAddAsync( - bookId.ToString(), //Cache key - async () => await GetBookFromDatabaseAsync(bookId), - () => new DistributedCacheEntryOptions - { - AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) - } - ); - } +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; - private Task GetBookFromDatabaseAsync(Guid bookId) +namespace MyProject +{ + public class BookService : ITransientDependency { - //TODO: get from database + private readonly IDistributedCache _cache; + + public BookService(IDistributedCache cache) + { + _cache = cache; + } + + public async Task GetAsync(Guid bookId) + { + return await _cache.GetOrAddAsync( + bookId.ToString(), //缓存键 + async () => await GetBookFromDatabaseAsync(bookId), + () => new DistributedCacheEntryOptions + { + AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) + } + ); + } + + private Task GetBookFromDatabaseAsync(Guid bookId) + { + //TODO: 从数据库获取数据 + } } } ```` -* 示例服务代码中的 `GetOrAddAsync()` 方法从缓存中获取图书项. +* 示例服务代码中的 `GetOrAddAsync()` 方法从缓存中获取图书项. `GetOrAddAsync`是ABP框架在 ASP.NET Core 分布式缓存方法中添增的附加方法. * 如果没有在缓存中找到图书,它会调用工厂方法 (本示例中是 `GetBookFromDatabaseAsync`)从原始数据源中获取图书项. * `GetOrAddAsync` 有一个可选参数 `DistributedCacheEntryOptions` , 可用于设置缓存的生命周期. -`IDistributedCache` 的其他方法与ASP.NET Core的`IDistributedCache` 接口相同, 你可以参考 [ASP.NET Core文档](https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/distributed). +`IDistributedCache` 与ASP.NET Core的`IDistributedCache` 接口拥有相同的方法, 你可以参考 [ASP.NET Core文档](https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/distributed). -## `IDistributedCache` 接口 +### `IDistributedCache` 接口 -`IDistributedCache` 接口默认了键是 `string` 类型 (如果你的键不是string类型需要进行手动类型转换). `IDistributedCache` 将键的类型泛型化试图简化手动转换的操作. +`IDistributedCache` 接口默认了**缓存键**是 `string` 类型 (如果你的键不是string类型需要进行手动类型转换). 但当缓存键的类型不是`string`时, 可以使用`IDistributedCache`. -### 使用示例 +**示例: 在缓存中存储图书名称和价格** 示例缓存项 ````csharp -public class BookCacheItem +using Volo.Abp.Caching; + +namespace MyProject { - public string Name { get; set; } + [CacheName("Books")] + public class BookCacheItem + { + public string Name { get; set; } - public float Price { get; set; } + public float Price { get; set; } + } } ```` -用法示例 (这里假设你的键类型是 `Guid`): +* 在本例中使用`CacheName`特性给`BookCacheItem`类设置缓存名称. -````csharp -public class BookService : ITransientDependency -{ - private readonly IDistributedCache _cache; +你可以注入 `IDistributedCache` 服务用于 get/set `BookCacheItem` 对象. - public BookService(IDistributedCache cache) - { - _cache = cache; - } +````csharp +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; - public async Task GetAsync(Guid bookId) - { - return await _cache.GetOrAddAsync( - bookId, //Guid type used as the cache key - async () => await GetBookFromDatabaseAsync(bookId), - () => new DistributedCacheEntryOptions - { - AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) - } - ); - } - private Task GetBookFromDatabaseAsync(Guid bookId) +namespace MyProject +{ + public class BookService : ITransientDependency { - //TODO: get from database + private readonly IDistributedCache _cache; + + public BookService(IDistributedCache cache) + { + _cache = cache; + } + + public async Task GetAsync(Guid bookId) + { + return await _cache.GetOrAddAsync( + bookId, //Guid类型作为缓存键 + async () => await GetBookFromDatabaseAsync(bookId), + () => new DistributedCacheEntryOptions + { + AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) + } + ); + } + private Task GetBookFromDatabaseAsync(Guid bookId) + { + //TODO: 从数据库获取数据 + } } } ```` * 示例服务中 `GetOrAddAsync()` 方法获取缓存的图书项. -* 我们采用了 `Guid` 做为键,在 `_cache_GetOrAddAsync()` 方法中传入 `Guid` 类型的bookid. +* 我们采用了 `Guid` 做为键, 在 `_cache_GetOrAddAsync()` 方法中传入 `Guid` 类型的bookid. + +#### 复杂类型的缓存键 -`IDistributedCache` 在内部使用键对象的 `ToString()` 方法转换类型为string. 如果你的将复杂对象做为键,那么需要重写类的 `ToString` 方法. +`IDistributedCache` 在内部使用键对象的 `ToString()` 方法转换类型为string. 如果你的将复杂对象做为缓存键,那么需要重写类的 `ToString` 方法. -示例: +举例一个作为缓存键的类: ````csharp public class UserInOrganizationCacheKey @@ -187,23 +203,72 @@ public class BookService : ITransientDependency { _cache = cache; } - + ... } ```` +## 配置 + +### AbpDistributedCacheOptions +`AbpDistributedCacheOptions` 是配置缓存的主要[Option类](Options.md). + +**示例:为应用程序设置缓存键前缀** + +```csharp +Configure(options => +{ + options.KeyPrefix = "MyApp1"; +}); +``` +> 在[模块类](Module-Development-Basics.md)的`ConfigureServices`方法中添加代码. + +#### 可用选项 + +* `HideErrors` (`bool`, 默认: `true`): 启用/禁用隐藏从缓存服务器写入/读取值时的错误. +* `KeyPrefix` (`string`, 默认: `null`): 如果你的缓存服务器由多个应用程序共同使用, 则可以为应用程序的缓存键设置一个前缀. 在这种情况下, 不同的应用程序不能覆盖彼此的缓存内容. +* `GlobalCacheEntryOptions` (`DistributedCacheEntryOptions`): 用于设置保存缓内容却没有指定选项时, 默认的分布式缓存选项 (例如 `AbsoluteExpiration` 和 `SlidingExpiration`). `SlidingExpiration`的默认值设置为20分钟. + +## 错误处理 + +当为你的对象设计缓存时, 通常会首先尝试从缓存中获取值. 如果在缓存中找不到该值, 则从**来源**查询对象. 它可能在**数据库**中, 或者可能需要通过HTTP调用远程服务器. + +在大多数情况下, 你希望**容忍缓存错误**; 如果缓存服务器出现错误, 也不希望取消该操作. 相反, 你可以默默地隐藏(并记录)错误并**从来源查询**. 这就是ABP框架默认的功能. + +ABP的分布式缓存 [异常处理](Exception-Handling.md), 默认记录并隐藏错误. 有一个全局修改该功能的选项(参见下面的选项内容). + +所有的`IDistributedCache` (和 `IDistributedCache`)方法都有一个可选的参数`hideErrors`, 默认值为`null`. 如果此参数设置为`null`, 则全局生效, 否则你可以选择单个方法调用时隐藏或者抛出异常. + ## 批量操作 ABP的分布式缓存接口定义了以下批量操作方法,当你需要在一个方法中调用多次缓存操作时,这些方法可以提高性能 -* `SetManyAsync` 和 `SetMany` 方法可以用来设置多个值. +* `SetManyAsync` 和 `SetMany` 方法可以用来向缓存中设置多个值. * `GetManyAsync` 和 `GetMany` 方法可以用来从缓存中获取多个值. * `GetOrAddManyAsync` 和 `GetOrAddMany` 方法可以用来从缓存中获取并添加缺少的值. * `RefreshManyAsync` 和 `RefreshMany` 方法可以来用重置多个值的滚动过期时间. -* `RemoveManyAsync` 和 `RemoveMany` 方法呆以用来删除多个值. +* `RemoveManyAsync` 和 `RemoveMany` 方法可以用来从缓存中删除多个值. > 这些不是标准的ASP.NET Core缓存方法, 所以某些提供程序可能不支持. [ABP Redis集成包](Redis-Cache.md)实现了它们. 如果提供程序不支持,会回退到 `SetAsync` 和 `GetAsync` ... 方法(循环调用). -### DistributedCacheOptions +## 高级主题 + +### 工作单元级别的缓存 + +分布式缓存服务提供了一个有趣的功能. 假设你已经更新了数据库中某本书的价格, 然后将新价格设置到缓存中, 以便以后使用缓存的值. 如果设置缓存后出现异常, 并且更新图书价格的**事务被回滚了**, 该怎么办?在这种情况下, 缓存值是错误的. + +`IDistributedCache<..>`方法提供一个可选参数, `considerOuw`, 默认为`false`. 如果将其设置为`true`, 则你对缓存所做的更改不会应用于真正的缓存存储, 而是与当前的[工作单元](Unit-Of-Work.md)关联. 你将获得在同一工作单元中设置的缓存值, 但**仅当前工作单元成功时**更改才会生效. + +### IDistributedCacheSerializer + +`IDistributedCacheSerializer`服务用于序列化和反序列化缓存内容. 默认实现是`Utf8JsonDistributedCacheSerializer`类, 它使用`IJsonSerializer`服务将对象转换为[JSON](Json-Serialization.md), 反之亦然. 然后, 它使用UTC8编码将JSON字符串转换为分布式缓存接受的字节数组. + +如果你想实现自己的序列化逻辑, 可以自己实现并[替换](Dependency-Injection.md) 此服务. + +### IDistributedCacheKeyNormalizer + +默认情况下, `IDistributedCacheKeyNormalizer`是由`DistributedCacheKeyNormalizer`类实现的. 它将缓存名称、应用程序缓存前缀和当前租户id添加到缓存键中. 如果需要更高级的键规范化, 可以自己实现并[替换](Dependency-Injection.md)此服务. + +## 另请参阅 -TODO \ No newline at end of file +* [Redis 缓存](Redis-Cache.md) From 7221600e75719a494447953b789e79539fb7f10e Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 17 Mar 2022 21:55:33 +0800 Subject: [PATCH 035/242] Refactor --- .../Azure/AzureDistributedEventBus.cs | 15 +--- .../Kafka/KafkaDistributedEventBus.cs | 76 ++++++++++++------- .../RabbitMq/RabbitMqDistributedEventBus.cs | 69 +++++++---------- .../Rebus/RebusDistributedEventBus.cs | 8 +- .../Distributed/AbpEventBusBoxesOptions.cs | 6 ++ .../Distributed/DistributedEventBusBase.cs | 2 +- .../Distributed/ISupportsEventBoxes.cs | 2 +- .../Abp/EventBus/Distributed/OutboxSender.cs | 46 +++++++++-- .../MultipleOutgoingEventPublishResult.cs | 14 ---- .../Volo/Abp/Kafka/ConsumerPool.cs | 1 + .../Volo/Abp/Kafka/KafkaMessageConsumer.cs | 21 +++-- .../Volo/Abp/Kafka/ProducerPool.cs | 31 +++++--- 12 files changed, 161 insertions(+), 130 deletions(-) delete mode 100644 framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs diff --git a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs index add6670bd4..fa6e155081 100644 --- a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs @@ -92,10 +92,9 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen await PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData, outgoingEvent.Id); } - public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) { var outgoingEventArray = outgoingEvents.ToArray(); - var failures = new List(); var publisher = await _publisherPool.GetAsync( _options.TopicName, @@ -103,25 +102,15 @@ public class AzureDistributedEventBus : DistributedEventBusBase, ISingletonDepen using var messageBatch = await publisher.CreateMessageBatchAsync(); - var failed = false; foreach (var outgoingEvent in outgoingEventArray) { - if (failed) - { - failures.Add(outgoingEvent.Id); - continue; - } - if (!messageBatch.TryAddMessage(new ServiceBusMessage(outgoingEvent.EventData) { Subject = outgoingEvent.EventName })) { - failed = true; - failures.Add(outgoingEvent.Id); + throw new AbpException("The message is too large to fit in the batch. Set AbpEventBusBoxesOptions.OutboxWaitingEventMaxCount to reduce the number"); } } await publisher.SendMessagesAsync(messageBatch); - - return new MultipleOutgoingEventPublishResult(outgoingEventArray.Where(x => !failures.Contains(x.Id)).ToList()); } public async override Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig) diff --git a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs index e271ad502c..4dba728c51 100644 --- a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs @@ -193,38 +193,40 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen ); } - public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) { - var pendingConfirms = new ConcurrentDictionary(); + var producer = ProducerPool.Get(); var outgoingEventArray = outgoingEvents.ToArray(); - - var tasks = new List(); - foreach (var outgoingEvent in outgoingEventArray) + producer.BeginTransaction(); + try { - var messageId = outgoingEvent.Id.ToString("N"); - pendingConfirms.TryAdd(messageId, outgoingEvent.Id); - - var task = PublishAsync( - AbpKafkaEventBusOptions.TopicName, - outgoingEvent.EventName, - outgoingEvent.EventData, - new Headers { { "messageId", System.Text.Encoding.UTF8.GetBytes(messageId)} }, - null - ); - - tasks.Add(task.ContinueWith(t => - { - if (!t.IsFaulted) - { - var message = t.Result.Message; - pendingConfirms.TryRemove(message.GetMessageId(), out _); - } - })); + foreach (var outgoingEvent in outgoingEventArray) + { + var messageId = outgoingEvent.Id.ToString("N"); + var headers = new Headers + { + { "messageId", System.Text.Encoding.UTF8.GetBytes(messageId)} + }; + + producer.Produce( + AbpKafkaEventBusOptions.TopicName, + new Message + { + Key = outgoingEvent.EventName, + Value = outgoingEvent.EventData, + Headers = headers + }); + } + + producer.CommitTransaction(); } - - await Task.WhenAll(tasks); - - return new MultipleOutgoingEventPublishResult(outgoingEventArray.Where(x => !pendingConfirms.Select(p => p.Value).Contains(x.Id)).ToList()); + catch (Exception e) + { + producer.AbortTransaction(); + throw; + } + + return Task.CompletedTask; } public async override Task ProcessFromInboxAsync( @@ -270,10 +272,26 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen return PublishAsync(topicName, eventName, body, headers, headersArguments); } - private Task> PublishAsync(string topicName, string eventName, byte[] body, Headers headers, Dictionary headersArguments) + private Task> PublishAsync( + string topicName, + string eventName, + byte[] body, + Headers headers, + Dictionary headersArguments) { var producer = ProducerPool.Get(AbpKafkaEventBusOptions.ConnectionName); + return PublishAsync(producer, topicName, eventName, body, headers, headersArguments); + } + + private Task> PublishAsync( + IProducer producer, + string topicName, + string eventName, + byte[] body, + Headers headers, + Dictionary headersArguments) + { SetEventMessageHeaders(headers, headersArguments); return producer.ProduceAsync( diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index 9b3bc5b76e..b9210a6eb8 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -34,6 +34,8 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe protected IRabbitMqMessageConsumerFactory MessageConsumerFactory { get; } protected IRabbitMqMessageConsumer Consumer { get; private set; } + private bool _exchangeCreated; + public RabbitMqDistributedEventBus( IOptions options, IConnectionPool connectionPool, @@ -84,6 +86,8 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe Consumer.OnMessageReceived(ProcessEventAsync); SubscribeHandlers(AbpDistributedEventBusOptions.Handlers); + + } private async Task ProcessEventAsync(IModel channel, BasicDeliverEventArgs ea) @@ -197,7 +201,7 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe return PublishAsync(outgoingEvent.EventName, outgoingEvent.EventData, null, eventId: outgoingEvent.Id); } - public async override Task PublishManyFromOutboxAsync( + public async override Task PublishManyFromOutboxAsync( IEnumerable outgoingEvents, OutboxConfig outboxConfig) { @@ -206,48 +210,17 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe var outgoingEventArray = outgoingEvents.ToArray(); channel.ConfirmSelect(); - var pendingConfirms = new ConcurrentDictionary(); - var failures = new ConcurrentBag(); - - void CleanPendingConfirms(ulong sequenceNumber, bool multiple, bool ack) - { - if (multiple) - { - var confirmed = pendingConfirms.Where(x => x.Key <= sequenceNumber); - foreach (var entry in confirmed) - { - pendingConfirms.TryRemove(entry.Key, out var eventId); - - if (!ack) - { - failures.Add(eventId); - } - } - } - else - { - pendingConfirms.TryRemove(sequenceNumber, out var eventId); - - if (!ack) - { - failures.Add(eventId); - } - } - } - foreach (var outgoingEvent in outgoingEventArray) { - pendingConfirms.TryAdd(channel.NextPublishSeqNo, outgoingEvent.Id); - await PublishAsync(channel, outgoingEvent.EventName, outgoingEvent.EventData, null, + await PublishAsync( + channel, + outgoingEvent.EventName, + outgoingEvent.EventData, + properties: null, eventId: outgoingEvent.Id); } - channel.BasicAcks += (_, ea) => CleanPendingConfirms(ea.DeliveryTag, ea.Multiple, true); - channel.BasicNacks += (_, ea) => CleanPendingConfirms(ea.DeliveryTag, ea.Multiple, false); - - channel.WaitForConfirms(); - - return new MultipleOutgoingEventPublishResult(outgoingEventArray.Where(x => !failures.Contains(x.Id)).ToList()); + channel.WaitForConfirmsOrDie(); } } @@ -308,11 +281,7 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe Dictionary headersArguments = null, Guid? eventId = null) { - channel.ExchangeDeclare( - AbpRabbitMqEventBusOptions.ExchangeName, - "direct", - durable: true - ); + EnsureExchangeExists(channel); if (properties == null) { @@ -338,6 +307,20 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe return Task.CompletedTask; } + private void EnsureExchangeExists(IModel channel) + { + if (_exchangeCreated) + { + return; + } + + channel.ExchangeDeclare( + AbpRabbitMqEventBusOptions.ExchangeName, + "direct", + durable: true + ); + } + private void SetEventMessageHeaders(IBasicProperties properties, Dictionary headersArguments) { if (headersArguments == null) diff --git a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs index a5cac31235..4ccd72ba15 100644 --- a/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Rebus/Volo/Abp/EventBus/Rebus/RebusDistributedEventBus.cs @@ -162,7 +162,7 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen return; } - await Rebus.Advanced.Routing.Send(AbpRebusEventBusOptions.InputQueueName, eventData); + await Rebus.Publish(eventData); } protected override void AddToUnitOfWork(IUnitOfWork unitOfWork, UnitOfWorkEventRecord eventRecord) @@ -224,7 +224,7 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen return PublishToEventBusAsync(eventType, eventData); } - public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) { var outgoingEventArray = outgoingEvents.ToArray(); @@ -234,11 +234,9 @@ public class RebusDistributedEventBus : DistributedEventBusBase, ISingletonDepen { await PublishFromOutboxAsync(outgoingEvent, outboxConfig); } - + await scope.CompleteAsync(); } - - return new MultipleOutgoingEventPublishResult(outgoingEventArray); } public async override Task ProcessFromInboxAsync( diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs index a46fc76238..749aa3d6d2 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs @@ -34,6 +34,11 @@ public class AbpEventBusBoxesOptions /// Default: 2 hours /// public TimeSpan WaitTimeToDeleteProcessedInboxEvents { get; set; } + + /// + /// Default: false + /// + public bool OutboxPublishInBatch { get; set; } public AbpEventBusBoxesOptions() { @@ -43,5 +48,6 @@ public class AbpEventBusBoxesOptions PeriodTimeSpan = TimeSpan.FromSeconds(2); DistributedLockWaitDuration = TimeSpan.FromSeconds(15); WaitTimeToDeleteProcessedInboxEvents = TimeSpan.FromHours(2); + OutboxPublishInBatch = false; } } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs index 0add75f9c4..69ae91505d 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs @@ -85,7 +85,7 @@ public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventB OutboxConfig outboxConfig ); - public abstract Task PublishManyFromOutboxAsync( + public abstract Task PublishManyFromOutboxAsync( IEnumerable outgoingEvents, OutboxConfig outboxConfig ); diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs index 7c23be5ecd..73f74a68ad 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/ISupportsEventBoxes.cs @@ -10,7 +10,7 @@ public interface ISupportsEventBoxes OutboxConfig outboxConfig ); - Task PublishManyFromOutboxAsync( + Task PublishManyFromOutboxAsync( IEnumerable outgoingEvents, OutboxConfig outboxConfig ); diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs index 17dec0a810..ac92740e86 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; @@ -84,14 +85,15 @@ public class OutboxSender : IOutboxSender, ITransientDependency } Logger.LogInformation($"Found {waitingEvents.Count} events in the outbox."); - - var result = await DistributedEventBus - .AsSupportsEventBoxes() - .PublishManyFromOutboxAsync(waitingEvents, OutboxConfig); - - await Outbox.DeleteManyAsync(result.PublishedOutgoingEvents.Select(x => x.Id).ToArray()); - - Logger.LogInformation($"Sent {result.PublishedOutgoingEvents.Count} events to message broker"); + + if (EventBusBoxesOptions.OutboxPublishInBatch) + { + await PublishOutgoingMessagesInBatchAsync(waitingEvents); + } + else + { + await PublishOutgoingMessagesAsync(waitingEvents); + } } } else @@ -105,4 +107,32 @@ public class OutboxSender : IOutboxSender, ITransientDependency } } } + + protected virtual async Task PublishOutgoingMessagesAsync(List waitingEvents) + { + foreach (var waitingEvent in waitingEvents) + { + await DistributedEventBus + .AsSupportsEventBoxes() + .PublishFromOutboxAsync( + waitingEvent, + OutboxConfig + ); + + await Outbox.DeleteAsync(waitingEvent.Id); + + Logger.LogInformation($"Sent the event to the message broker with id = {waitingEvent.Id:N}"); + } + } + + protected virtual async Task PublishOutgoingMessagesInBatchAsync(List waitingEvents) + { + await DistributedEventBus + .AsSupportsEventBoxes() + .PublishManyFromOutboxAsync(waitingEvents, OutboxConfig); + + await Outbox.DeleteManyAsync(waitingEvents.Select(x => x.Id).ToArray()); + + Logger.LogInformation($"Sent {waitingEvents.Count} events to message broker"); + } } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs deleted file mode 100644 index 515dec1ae6..0000000000 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/MultipleOutgoingEventPublishResult.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using Volo.Abp.EventBus.Distributed; - -namespace Volo.Abp.EventBus; - -public class MultipleOutgoingEventPublishResult -{ - public IReadOnlyList PublishedOutgoingEvents { get; } - - public MultipleOutgoingEventPublishResult(IReadOnlyList outgoingEvents) - { - PublishedOutgoingEvents = outgoingEvents; - } -} diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs index 81a5c195c1..7147c81271 100644 --- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs +++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs @@ -76,6 +76,7 @@ public class ConsumerPool : IConsumerPool, ISingletonDependency try { + consumer.Value.Unsubscribe(); consumer.Value.Close(); consumer.Value.Dispose(); } diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs index da21f48883..704c15845f 100644 --- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs +++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs @@ -80,9 +80,11 @@ public class KafkaMessageConsumer : IKafkaMessageConsumer, ITransientDependency, protected virtual async Task Timer_Elapsed(AbpAsyncTimer timer) { - await CreateTopicAsync(); - Consume(); - Timer.Stop(); + if (Consumer == null) + { + await CreateTopicAsync(); + Consume(); + } } protected virtual async Task CreateTopicAsync() @@ -164,12 +166,21 @@ public class KafkaMessageConsumer : IKafkaMessageConsumer, ITransientDependency, public virtual void Dispose() { + Timer.Stop(); if (Consumer == null) { return; } - Consumer.Close(); - Consumer.Dispose(); + try + { + Consumer.Unsubscribe(); + Consumer.Close(); + Consumer.Dispose(); + Consumer = null; + } + catch (ObjectDisposedException) + { + } } } diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs index 49287a20e9..0a31a3483a 100644 --- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs +++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs @@ -17,6 +17,8 @@ public class ProducerPool : IProducerPool, ISingletonDependency protected ConcurrentDictionary>> Producers { get; } protected TimeSpan TotalDisposeWaitDuration { get; set; } = TimeSpan.FromSeconds(10); + + protected TimeSpan DefaultTransactionsWaitDuration { get; set; } = TimeSpan.FromSeconds(30); public ILogger Logger { get; set; } @@ -37,11 +39,18 @@ public class ProducerPool : IProducerPool, ISingletonDependency return Producers.GetOrAdd( connectionName, connection => new Lazy>(() => { - var config = Options.Connections.GetOrDefault(connection); - - Options.ConfigureProducer?.Invoke(new ProducerConfig(config)); - - return new ProducerBuilder(config).Build(); + var producerConfig = new ProducerConfig(Options.Connections.GetOrDefault(connection)); + Options.ConfigureProducer?.Invoke(producerConfig); + + if (producerConfig.TransactionalId.IsNullOrWhiteSpace()) + { + producerConfig.TransactionalId = Guid.NewGuid().ToString(); + } + + var producer = new ProducerBuilder(producerConfig).Build(); + producer.InitTransactions(DefaultTransactionsWaitDuration); + + return producer; })).Value; } @@ -69,7 +78,7 @@ public class ProducerPool : IProducerPool, ISingletonDependency foreach (var producer in Producers.Values) { var poolItemDisposeStopwatch = Stopwatch.StartNew(); - + try { producer.Value.Dispose(); @@ -77,19 +86,19 @@ public class ProducerPool : IProducerPool, ISingletonDependency catch { } - + poolItemDisposeStopwatch.Stop(); - + remainingWaitDuration = remainingWaitDuration > poolItemDisposeStopwatch.Elapsed ? remainingWaitDuration.Subtract(poolItemDisposeStopwatch.Elapsed) : TimeSpan.Zero; } - + poolDisposeStopwatch.Stop(); - + Logger.LogInformation( $"Disposed Kafka Producer Pool ({Producers.Count} producers in {poolDisposeStopwatch.Elapsed.TotalMilliseconds:0.00} ms)."); - + if (poolDisposeStopwatch.Elapsed.TotalSeconds > 5.0) { Logger.LogWarning( From 2a62c18ee685a6f2b6ea35f9622ff7a4a42e7c98 Mon Sep 17 00:00:00 2001 From: "gerardo.greco@porini.it" Date: Thu, 17 Mar 2022 16:23:30 +0100 Subject: [PATCH 036/242] pass option from appsettings to servicebusadminclient --- .../Volo/Abp/AzureServiceBus/ConnectionPool.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ConnectionPool.cs b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ConnectionPool.cs index 5f9d9eacfd..d616e1264f 100644 --- a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ConnectionPool.cs +++ b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ConnectionPool.cs @@ -47,7 +47,7 @@ public class ConnectionPool : IConnectionPool, ISingletonDependency connectionName, new Lazy(() => { var config = _options.Connections.GetOrDefault(connectionName); - return new ServiceBusAdministrationClient(config.ConnectionString); + return new ServiceBusAdministrationClient(config.ConnectionString, config.Admin); }) ).Value; } From f1cbcb16c7e7fa5f4b21603d981fdbf9619dc223 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 18 Mar 2022 11:55:14 +0800 Subject: [PATCH 037/242] Update RabbitMqDistributedEventBus --- .../RabbitMq/RabbitMqDistributedEventBus.cs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index b9210a6eb8..73ca0cbb61 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -86,8 +86,6 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe Consumer.OnMessageReceived(ProcessEventAsync); SubscribeHandlers(AbpDistributedEventBusOptions.Handlers); - - } private async Task ProcessEventAsync(IModel channel, BasicDeliverEventArgs ea) @@ -313,12 +311,20 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe { return; } - - channel.ExchangeDeclare( - AbpRabbitMqEventBusOptions.ExchangeName, - "direct", - durable: true - ); + + try + { + channel.ExchangeDeclarePassive(AbpRabbitMqEventBusOptions.ExchangeName); + } + catch (Exception) + { + channel.ExchangeDeclare( + AbpRabbitMqEventBusOptions.ExchangeName, + "direct", + durable: true + ); + } + _exchangeCreated = true; } private void SetEventMessageHeaders(IBasicProperties properties, Dictionary headersArguments) From dfb6025654a2112d3a2088cc393900cf2235a110 Mon Sep 17 00:00:00 2001 From: gaoabout Date: Fri, 18 Mar 2022 16:55:37 +0800 Subject: [PATCH 038/242] docs: fix typo in Caching.md --- docs/en/Caching.md | 2 +- docs/zh-Hans/Caching.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Caching.md b/docs/en/Caching.md index 13129bbc95..074d6d951f 100644 --- a/docs/en/Caching.md +++ b/docs/en/Caching.md @@ -258,7 +258,7 @@ ABP's distributed cache interfaces provide methods to perform batch methods thos Distributed cache service provides an interesting feature. Assume that you've updated the price of a book in the database, then set the new price to the cache, so you can use the cached value later. What if you have an exception after setting the cache and you **rollback the transaction** that updates the price of the book? In this case, cache value will be incorrect. -`IDistributedCache<..>` methods gets an optional parameter, named `considerOuw`, which is `false` by default. If you set it to `true`, then the changes you made for the cache are not actually applied to the real cache store, but associated with the current [unit of work](Unit-Of-Work.md). You get the value you set in the same unit of work, but the changes are applied **only if the current unit of work succeed**. +`IDistributedCache<..>` methods gets an optional parameter, named `considerUow`, which is `false` by default. If you set it to `true`, then the changes you made for the cache are not actually applied to the real cache store, but associated with the current [unit of work](Unit-Of-Work.md). You get the value you set in the same unit of work, but the changes are applied **only if the current unit of work succeed**. ### IDistributedCacheSerializer diff --git a/docs/zh-Hans/Caching.md b/docs/zh-Hans/Caching.md index 491e60eb29..d8f064a24e 100644 --- a/docs/zh-Hans/Caching.md +++ b/docs/zh-Hans/Caching.md @@ -257,7 +257,7 @@ ABP的分布式缓存接口定义了以下批量操作方法,当你需要在一 分布式缓存服务提供了一个有趣的功能. 假设你已经更新了数据库中某本书的价格, 然后将新价格设置到缓存中, 以便以后使用缓存的值. 如果设置缓存后出现异常, 并且更新图书价格的**事务被回滚了**, 该怎么办?在这种情况下, 缓存值是错误的. -`IDistributedCache<..>`方法提供一个可选参数, `considerOuw`, 默认为`false`. 如果将其设置为`true`, 则你对缓存所做的更改不会应用于真正的缓存存储, 而是与当前的[工作单元](Unit-Of-Work.md)关联. 你将获得在同一工作单元中设置的缓存值, 但**仅当前工作单元成功时**更改才会生效. +`IDistributedCache<..>`方法提供一个可选参数, `considerUow`, 默认为`false`. 如果将其设置为`true`, 则你对缓存所做的更改不会应用于真正的缓存存储, 而是与当前的[工作单元](Unit-Of-Work.md)关联. 你将获得在同一工作单元中设置的缓存值, 但**仅当前工作单元成功时**更改才会生效. ### IDistributedCacheSerializer From 13d6864843ce9ee9bfb12035c11110a2f8d74c4f Mon Sep 17 00:00:00 2001 From: Bishnu Rawal Date: Fri, 18 Mar 2022 17:20:49 +0545 Subject: [PATCH 039/242] Update Background-Workers-Hangfire.md --- docs/en/Background-Workers-Hangfire.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Background-Workers-Hangfire.md b/docs/en/Background-Workers-Hangfire.md index 2ea7fd633e..4cbaf8cc24 100644 --- a/docs/en/Background-Workers-Hangfire.md +++ b/docs/en/Background-Workers-Hangfire.md @@ -1,6 +1,6 @@ # Hangfire Background Worker Manager -[Hangfire](https://https://www.hangfire.io/) is an advanced background jobs and worker manager. You can integrate Hangfire with the ABP Framework to use it instead of the [default background worker manager](Background-Workers.md). +[Hangfire](https://www.hangfire.io/) is an advanced background jobs and worker manager. You can integrate Hangfire with the ABP Framework to use it instead of the [default background worker manager](Background-Workers.md). The major advantage is that you can use the same server farm to manage your Background Jobs and Workers, as well as leverage the advanced scheduling that is available from Hangfire for [Recurring Jobs](https://docs.hangfire.io/en/latest/background-methods/performing-recurrent-tasks.html?highlight=recurring), aka Background Workers. @@ -126,4 +126,4 @@ context.ServiceProvider So, it resolves the given background worker and adds to the `IBackgroundWorkerManager`. -While we generally add workers in OnApplicationInitialization, there are no restrictions on that. You can inject IBackgroundWorkerManager anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down. \ No newline at end of file +While we generally add workers in OnApplicationInitialization, there are no restrictions on that. You can inject IBackgroundWorkerManager anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down. From 86d89ebba52b99927f37ef9a592ed01d2b80d8e5 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sat, 19 Mar 2022 20:44:44 +0100 Subject: [PATCH 040/242] Allow the exchange type to be specified --- .../RabbitMq/AbpRabbitMqEventBusOptions.cs | 20 ++++++++++++++++++- .../RabbitMq/RabbitMqDistributedEventBus.cs | 2 +- .../Volo/Abp/RabbitMQ/RabbitMqConsts.cs | 11 ++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs index ad09223f05..dd451d2127 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs @@ -1,10 +1,28 @@ -namespace Volo.Abp.EventBus.RabbitMq; +using Volo.Abp.RabbitMQ; + +namespace Volo.Abp.EventBus.RabbitMq; public class AbpRabbitMqEventBusOptions { + public const string DefaultExchangeType = RabbitMqConsts.ExchangeTypes.Direct; + public string ConnectionName { get; set; } public string ClientName { get; set; } public string ExchangeName { get; set; } + + public string ExchangeType { get; set; } + + public AbpRabbitMqEventBusOptions() + { + ExchangeType = "direct"; + } + + public string GetExchangeTypeOrDefault() + { + return string.IsNullOrEmpty(ExchangeType) + ? DefaultExchangeType + : ExchangeType; + } } diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index c57d9e9417..38070ae7ce 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -69,7 +69,7 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe Consumer = MessageConsumerFactory.Create( new ExchangeDeclareConfiguration( AbpRabbitMqEventBusOptions.ExchangeName, - type: "direct", + type: AbpRabbitMqEventBusOptions.ExchangeType, durable: true ), new QueueDeclareConfiguration( diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqConsts.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqConsts.cs index 19b8ddb573..996e88959b 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqConsts.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqConsts.cs @@ -8,4 +8,15 @@ public static class RabbitMqConsts public const int Persistent = 2; } + + public static class ExchangeTypes + { + public const string Direct = "direct"; + + public const string Topic = "topic"; + + public const string Fanout = "fanout"; + + public const string Headers = "headers"; + } } From 5cfd2fa012817a521b12987ff68eec5ad5a6c5a6 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sat, 19 Mar 2022 20:45:53 +0100 Subject: [PATCH 041/242] fix hardcoded reference --- .../Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index 38070ae7ce..33663086c4 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -244,7 +244,7 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe { channel.ExchangeDeclare( AbpRabbitMqEventBusOptions.ExchangeName, - "direct", + AbpRabbitMqEventBusOptions.ExchangeType, durable: true ); From ff9ebdbcabbf0e3806644378a39d127bbccb882f Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sat, 19 Mar 2022 20:46:56 +0100 Subject: [PATCH 042/242] Update usage of default value --- .../Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs | 5 ----- .../Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs index dd451d2127..addbc49171 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs @@ -14,11 +14,6 @@ public class AbpRabbitMqEventBusOptions public string ExchangeType { get; set; } - public AbpRabbitMqEventBusOptions() - { - ExchangeType = "direct"; - } - public string GetExchangeTypeOrDefault() { return string.IsNullOrEmpty(ExchangeType) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index 33663086c4..a2932de52e 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -69,7 +69,7 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe Consumer = MessageConsumerFactory.Create( new ExchangeDeclareConfiguration( AbpRabbitMqEventBusOptions.ExchangeName, - type: AbpRabbitMqEventBusOptions.ExchangeType, + type: AbpRabbitMqEventBusOptions.GetExchangeTypeOrDefault(), durable: true ), new QueueDeclareConfiguration( @@ -244,7 +244,7 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe { channel.ExchangeDeclare( AbpRabbitMqEventBusOptions.ExchangeName, - AbpRabbitMqEventBusOptions.ExchangeType, + AbpRabbitMqEventBusOptions.GetExchangeTypeOrDefault(), durable: true ); From 9082870eec79dfb271561e3ab6721f61e32f003a Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Mon, 21 Mar 2022 00:01:25 +0300 Subject: [PATCH 043/242] add filter by user --- .../Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs | 2 ++ .../CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 3 ++- .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 3 ++- .../Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs | 4 +++- .../CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs | 4 +++- .../Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs | 11 +++++++++++ .../CmsKit/Public/Blogs/IBlogPostPublicAppService.cs | 2 +- .../CmsKit/Public/Blogs/BlogPostPublicAppService.cs | 7 ++++--- .../CmsKit/Public/Blogs/BlogPostPublicController.cs | 5 ++--- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 3 +-- 10 files changed, 31 insertions(+), 13 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs index e8fa497e15..3b2d4c2c93 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs @@ -8,4 +8,6 @@ public class BlogPostGetListInput : PagedAndSortedResultRequestDto public string Filter { get; set; } public Guid? BlogId { get; set; } + + public Guid? AuthorId { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 83899199f0..fbea1d81c7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -89,7 +89,8 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { var blogs = (await BlogRepository.GetListAsync()).ToDictionary(x => x.Id); - var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.MaxResultCount, input.SkipCount, input.Sorting); + var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId, + input.MaxResultCount, input.SkipCount, input.Sorting); var count = await BlogPostRepository.GetCountAsync(input.Filter); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index 8b1e86f8b7..5b04ffee07 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -16,6 +16,7 @@ public interface IBlogPostRepository : IBasicRepository Task> GetListAsync( string filter = null, Guid? blogId = null, + Guid? authorId = null, int maxResultCount = int.MaxValue, int skipCount = 0, string sorting = null, @@ -24,4 +25,4 @@ public interface IBlogPostRepository : IBasicRepository Task SlugExistsAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); -} +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index f0a6aa61ee..64fe2e2e02 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -54,6 +54,7 @@ public class EfCoreBlogPostRepository : EfCoreRepository> GetListAsync( string filter = null, Guid? blogId = null, + Guid? authorId = null, int maxResultCount = int.MaxValue, int skipCount = 0, string sorting = null, @@ -66,7 +67,8 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.BlogId == blogId) - .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); + .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) + .WhereIf(authorId.HasValue, x => x.AuthorId == authorId); queryable = queryable.OrderBy(sorting.IsNullOrEmpty() ? $"{nameof(BlogPost.CreationTime)} desc" : sorting); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index f52dc3add4..adf394b90f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -55,6 +55,7 @@ public class MongoBlogPostRepository : MongoDbRepository> GetListAsync( string filter = null, Guid? blogId = null, + Guid? authorId = null, int maxResultCount = int.MaxValue, int skipCount = 0, string sorting = null, @@ -68,7 +69,8 @@ public class MongoBlogPostRepository : MongoDbRepository x.BlogId == blogId) - .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); + .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) + .WhereIf(authorId.HasValue, x => x.AuthorId == authorId); queryable = queryable.OrderBy(sorting.IsNullOrEmpty() ? $"{nameof(BlogPost.CreationTime)} desc" : sorting); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs new file mode 100644 index 0000000000..82388fdb42 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs @@ -0,0 +1,11 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Public.Blogs; + +public class BlogPostGetListInput : PagedAndSortedResultRequestDto +{ + public string BlogSlug { get; set; } + + public Guid? AuthorId { get; set; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index f561a289cf..89103979ba 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -7,7 +7,7 @@ namespace Volo.CmsKit.Public.Blogs; public interface IBlogPostPublicAppService : IApplicationService { - Task> GetListAsync([NotNull] string blogSlug, PagedAndSortedResultRequestDto input); + Task> GetListAsync(BlogPostGetListInput input); Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index 4160639815..39e5e75128 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -32,11 +32,12 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub return ObjectMapper.Map(blogPost); } - public virtual async Task> GetListAsync([NotNull] string blogSlug, PagedAndSortedResultRequestDto input) + public virtual async Task> GetListAsync(BlogPostGetListInput input) { - var blog = await BlogRepository.GetBySlugAsync(blogSlug); + var blog = await BlogRepository.GetBySlugAsync(input.BlogSlug); - var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.MaxResultCount, input.SkipCount, input.Sorting); + var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, input.MaxResultCount, + input.SkipCount, input.Sorting); return new PagedResultDto( await BlogPostRepository.GetCountAsync(blogId: blog.Id), diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index bdd0b2cf32..b89939627f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -30,9 +30,8 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub } [HttpGet] - [Route("{blogSlug}")] - public virtual Task> GetListAsync(string blogSlug, PagedAndSortedResultRequestDto input) + public virtual Task> GetListAsync(BlogPostGetListInput input) { - return BlogPostPublicAppService.GetListAsync(blogSlug, input); + return BlogPostPublicAppService.GetListAsync(input); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index 30d4c6bcf2..b93a5d5f40 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -34,8 +34,7 @@ public class IndexModel : CmsKitPublicPageModelBase public async Task OnGetAsync() { Blogs = await BlogPostPublicAppService.GetListAsync( - BlogSlug, - new PagedAndSortedResultRequestDto + new BlogPostGetListInput { SkipCount = PageSize * (CurrentPage - 1), MaxResultCount = PageSize From 02ab0c64520b997a77db759f993fa82adf8fd20c Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 21 Mar 2022 14:20:47 +0800 Subject: [PATCH 044/242] Upgrade Minio to 4.0.1. Resolve #11995 --- .../Volo.Abp.BlobStoring.Minio.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj b/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj index 822189c677..a78b131962 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj @@ -3,7 +3,7 @@ - netstandard2.0 + net6.0 Volo.Abp.BlobStoring.Minio Volo.Abp.BlobStoring.Minio $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; @@ -15,7 +15,7 @@ - + From 4dc23548a58795d8fd7274a31f7ffe51fb47a0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=A8=E6=AC=A3?= Date: Mon, 21 Mar 2022 15:45:53 +0800 Subject: [PATCH 045/242] Update Domain-Services.md --- docs/zh-Hans/Domain-Services.md | 129 +++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Domain-Services.md b/docs/zh-Hans/Domain-Services.md index 9c9bb7dfd2..692d16ab2e 100644 --- a/docs/zh-Hans/Domain-Services.md +++ b/docs/zh-Hans/Domain-Services.md @@ -1,3 +1,128 @@ -# ABP Documentation +# 领域服务 -待添加 +## 介绍 + +在 [领域驱动设计](Domain-Driven-Design.md) (DDD) 解决方案中,核心业务逻辑通常在聚合 ([实体](Entities.md)) 和领域服务中实现. 在以下情况下特别需要创建域服务: + +* 您实现了依赖于某些服务(如存储库或其他外部服务)的核心域逻辑. +* 您需要实现的逻辑与多个聚合/实体相关,因此它不适合任何聚合. + +## ABP 领域服务基础设施 + +域服务是简单的无状态类.虽然您不必从任何服务或接口派生,但 ABP 框架提供了一些有用的基类和约定. + +### DomainService 和 IDomainService + +从基类派生域服务 `DomainService` 或直接实现 `IDomainService` 接口. + +**示例: 创建从 `DomainService` 基类派生的领域服务.** + +````csharp +using Volo.Abp.Domain.Services; +namespace MyProject.Issues +{ + public class IssueManager : DomainService + { + + } +} +```` + +当你这样做时: + +* ABP 框架自动将类注册到具有瞬态生命周期的依赖注入系统. +* 您可以直接使用一些常用服务作为基础属性,而无需手动注入 (例如 [ILogger](Logging.md) and [IGuidGenerator](Guid-Generation.md)). + +> 建议使用 `Manager` 或 `Service` 后缀命名领域服务. 我们通常使用如上面示例中的 `Manager` 后缀. +**示例: 实现将问题分配给用户的领域逻辑** + +````csharp +public class IssueManager : DomainService +{ + private readonly IRepository _issueRepository; + public IssueManager(IRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task AssignAsync(Issue issue, AppUser user) + { + var currentIssueCount = await _issueRepository + .CountAsync(i => i.AssignedUserId == user.Id); + + //Implementing a core business validation + if (currentIssueCount >= 3) + { + throw new IssueAssignmentException(user.UserName); + } + issue.AssignedUserId = user.Id; + } +} +```` + +问题是定义如下所示的 [聚合根](Entities.md): + +````csharp +public class Issue : AggregateRoot +{ + public Guid? AssignedUserId { get; internal set; } + + //... +} +```` + +* 使用 `internal` 的 set 确保外层调用者不能直接在调用 set ,并强制始终使用 `IssueManager` 为 `User` 分配 `Issue`. + +### 使用领域服务 + +域服务通常用于 [应用程序服务](Application-Services.md). + +**示例: 使用 `IssueManager` 将问题分配给用户** + +````csharp +using System; +using System.Threading.Tasks; +using MyProject.Users; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; +namespace MyProject.Issues +{ + public class IssueAppService : ApplicationService, IIssueAppService + { + private readonly IssueManager _issueManager; + private readonly IRepository _userRepository; + private readonly IRepository _issueRepository; + public IssueAppService( + IssueManager issueManager, + IRepository userRepository, + IRepository issueRepository) + { + _issueManager = issueManager; + _userRepository = userRepository; + _issueRepository = issueRepository; + } + public async Task AssignAsync(Guid id, Guid userId) + { + var issue = await _issueRepository.GetAsync(id); + var user = await _userRepository.GetAsync(userId); + await _issueManager.AssignAsync(issue, user); + await _issueRepository.UpdateAsync(issue); + } + } +} +```` + +由于 `IssueAppService` 在应用层, 它不能直接将问题分配给用户。因此,它使用 `IssueManager`. + +## 应用程序服务与领域服务 + +虽然应用服务和领域服务都实现了业务规则,但存在根本的逻辑和形式差异; +虽然 [应用服务](Application-Services.md) 和领域服务都实现了业务规则,但存在根本的逻辑和形式差异: + +* 应用程序服务实现应用程序的 **用例** (典型 Web 应用程序中的用户交互), 而域服务实现 **核心的、用例独立的域逻辑**. +* 应用程序服务获取/返回 [数据传输对象](Data-Transfer-Objects.md), 域服务方法通常获取和返回 **域对象** ([实体](Entities.md), [值对象](Value-Objects.md)). +* 领域服务通常由应用程序服务或其他领域服务使用,而应用程序服务由表示层或客户端应用程序使用. + +## 生命周期 + +领域服务的生命周期是 [瞬态](https://docs.abp.io/en/abp/latest/Dependency-Injection) 的,它们会自动注册到依赖注入服务. From efd92737b22f8e627b7a66d46c85322c5c43ae29 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 21 Mar 2022 16:38:23 +0800 Subject: [PATCH 046/242] Update Domain-Services.md --- docs/zh-Hans/Domain-Services.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/zh-Hans/Domain-Services.md b/docs/zh-Hans/Domain-Services.md index 692d16ab2e..a617aea645 100644 --- a/docs/zh-Hans/Domain-Services.md +++ b/docs/zh-Hans/Domain-Services.md @@ -2,18 +2,18 @@ ## 介绍 -在 [领域驱动设计](Domain-Driven-Design.md) (DDD) 解决方案中,核心业务逻辑通常在聚合 ([实体](Entities.md)) 和领域服务中实现. 在以下情况下特别需要创建域服务: +在 [领域驱动设计](Domain-Driven-Design.md) (DDD) 解决方案中,核心业务逻辑通常在聚合 ([实体](Entities.md)) 和领域服务中实现. 在以下情况下特别需要创建领域服务 -* 您实现了依赖于某些服务(如存储库或其他外部服务)的核心域逻辑. -* 您需要实现的逻辑与多个聚合/实体相关,因此它不适合任何聚合. +* 你实现了依赖于某些服务(如存储库或其他外部服务)的核心域逻辑. +* 你需要实现的逻辑与多个聚合/实体相关,因此它不适合任何聚合. ## ABP 领域服务基础设施 -域服务是简单的无状态类.虽然您不必从任何服务或接口派生,但 ABP 框架提供了一些有用的基类和约定. +领域服务是简单的无状态类. 虽然你不必从任何服务或接口派生,但 ABP 框架提供了一些有用的基类和约定. ### DomainService 和 IDomainService -从基类派生域服务 `DomainService` 或直接实现 `IDomainService` 接口. +从 `DomainService` 基类派生领域服务或直接实现 `IDomainService` 接口. **示例: 创建从 `DomainService` 基类派生的领域服务.** @@ -30,8 +30,8 @@ namespace MyProject.Issues 当你这样做时: -* ABP 框架自动将类注册到具有瞬态生命周期的依赖注入系统. -* 您可以直接使用一些常用服务作为基础属性,而无需手动注入 (例如 [ILogger](Logging.md) and [IGuidGenerator](Guid-Generation.md)). +* ABP 框架自动将类注册为瞬态生命周期到依赖注入系统. +* 你可以直接使用一些常用服务作为基础属性,而无需手动注入 (例如 [ILogger](Logging.md) and [IGuidGenerator](Guid-Generation.md)). > 建议使用 `Manager` 或 `Service` 后缀命名领域服务. 我们通常使用如上面示例中的 `Manager` 后缀. **示例: 实现将问题分配给用户的领域逻辑** @@ -75,7 +75,7 @@ public class Issue : AggregateRoot ### 使用领域服务 -域服务通常用于 [应用程序服务](Application-Services.md). +领域服务通常用于 [应用程序服务](Application-Services.md). **示例: 使用 `IssueManager` 将问题分配给用户** @@ -112,16 +112,16 @@ namespace MyProject.Issues } ```` -由于 `IssueAppService` 在应用层, 它不能直接将问题分配给用户。因此,它使用 `IssueManager`. +由于 `IssueAppService` 在应用层, 它不能直接将问题分配给用户.因此,它使用 `IssueManager`. ## 应用程序服务与领域服务 -虽然应用服务和领域服务都实现了业务规则,但存在根本的逻辑和形式差异; -虽然 [应用服务](Application-Services.md) 和领域服务都实现了业务规则,但存在根本的逻辑和形式差异: +虽然应用服务和领域服务都实现了业务规则,但存在根本的逻辑和形式差异; +虽然 [应用服务](Application-Services.md) 和领域服务都实现了业务规则,但存在根本的逻辑和形式差异: -* 应用程序服务实现应用程序的 **用例** (典型 Web 应用程序中的用户交互), 而域服务实现 **核心的、用例独立的域逻辑**. -* 应用程序服务获取/返回 [数据传输对象](Data-Transfer-Objects.md), 域服务方法通常获取和返回 **域对象** ([实体](Entities.md), [值对象](Value-Objects.md)). -* 领域服务通常由应用程序服务或其他领域服务使用,而应用程序服务由表示层或客户端应用程序使用. +* 应用程序服务实现应用程序的 **用例** (典型 Web 应用程序中的用户交互), 而领域服务实现 **核心的、用例独立的领域逻辑**. +* 应用程序服务获取/返回 [数据传输对象](Data-Transfer-Objects.md), 领域服务方法通常获取和返回 **领域对象** ([实体](Entities.md), [值对象](Value-Objects.md)). +* 领域服务通常由应用程序服务或其他领域服务使用,而应用程序服务由表示层或客户端应用程序使用. ## 生命周期 From 9b0b1a8e6d61135f2024789db503de9dd1cfc1b0 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 22 Mar 2022 15:52:08 +0800 Subject: [PATCH 047/242] Provide Global Features in application configuration. Resolve #12042 --- .../ApplicationConfigurationDto.cs | 2 ++ ...pplicationGlobalFeatureConfigurationDto.cs | 18 +++++++++++++++++ .../AbpApplicationConfigurationAppService.cs | 20 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationGlobalFeatureConfigurationDto.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs index 9b6a66992f..eb29c5c7cb 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs @@ -17,6 +17,8 @@ public class ApplicationConfigurationDto public ApplicationFeatureConfigurationDto Features { get; set; } + public ApplicationGlobalFeatureConfigurationDto GlobalFeatures { get; set; } + public MultiTenancyInfoDto MultiTenancy { get; set; } public CurrentTenantDto CurrentTenant { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationGlobalFeatureConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationGlobalFeatureConfigurationDto.cs new file mode 100644 index 0000000000..e911cd911d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationGlobalFeatureConfigurationDto.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; + +[Serializable] +public class ApplicationGlobalFeatureConfigurationDto +{ + public HashSet EnabledFeatures { get; set; } + + public Dictionary> ModuleEnabledFeatures { get; set; } + + public ApplicationGlobalFeatureConfigurationDto() + { + EnabledFeatures = new HashSet(); + ModuleEnabledFeatures = new Dictionary>(); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs index 6ecd9fc195..bfa2e6a285 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs @@ -14,6 +14,7 @@ using Volo.Abp.AspNetCore.Mvc.MultiTenancy; using Volo.Abp.Authorization; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Features; +using Volo.Abp.GlobalFeatures; using Volo.Abp.Localization; using Volo.Abp.MultiTenancy; using Volo.Abp.Settings; @@ -87,6 +88,7 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp { Auth = await GetAuthConfigAsync(), Features = await GetFeaturesConfigAsync(), + GlobalFeatures = await GetGlobalFeaturesConfigAsync(), Localization = await GetLocalizationConfigAsync(), CurrentUser = GetCurrentUser(), Setting = await GetSettingConfigAsync(), @@ -284,6 +286,24 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp return result; } + protected virtual Task GetGlobalFeaturesConfigAsync() + { + var result = new ApplicationGlobalFeatureConfigurationDto(); + + foreach (var enabledFeatureName in GlobalFeatureManager.Instance.GetEnabledFeatureNames()) + { + result.EnabledFeatures.AddIfNotContains(enabledFeatureName); + } + + foreach (var module in GlobalFeatureManager.Instance.Modules) + { + result.ModuleEnabledFeatures.AddIfNotContains(new KeyValuePair>(module.Key, module.Value.GetFeatures().Select(x => x.FeatureName).ToList())); + } + + return Task.FromResult(result); + } + + protected virtual async Task GetTimingConfigAsync() { var windowsTimeZoneId = await _settingProvider.GetOrNullAsync(TimingSettingNames.TimeZone); From 59fed8a9ddb2b7fb2f6afb87aac04a740c3f9f69 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 22 Mar 2022 15:51:28 +0300 Subject: [PATCH 048/242] Update en.json --- .../Commercial/Localization/Resources/en.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 8fa96b5ee2..8aa62afbb4 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -495,7 +495,9 @@ "LicenseTypeNotCorrect": "The license type is not correct!", "Trainings": "Trainings", "ChoseTrainingPlaceholder": "Chose the training...", - "ContactUsToGetQuote": "Contact us to get a quote", + "DoYouNeedTrainings": "Do you need one of these trainings?", + "DoYouNeedTraining": "Do you need {0} training?", + "GetInTouchUs": "Get in touch with us", "ForMoreInformationClickHere": "For more information, click here.", "IsGetOnboardingTraining": "Would you like to get onboarding & web application development training?", "OnboardingWebApplicationDevelopmentTrainingMessage": "To schedule your training calendar, please contact {0} after creating the organization", From cf226dca5297bb6f89891c5aeead11c6336dee32 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Tue, 22 Mar 2022 16:03:56 +0300 Subject: [PATCH 049/242] filter by user completed --- .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 3 ++ .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 6 +++ .../MongoDB/Blogs/MongoBlogPostRepository.cs | 6 +++ .../Public/Blogs/BlogPostGetListInput.cs | 2 - .../Public/Blogs/IBlogPostPublicAppService.cs | 8 +++- .../Public/Blogs/BlogPostPublicAppService.cs | 12 +++++- .../Public/Blogs/BlogPostPublicController.cs | 15 +++++-- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 4 +- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 39 ++++++++++++++++--- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 13 ++++++- .../Pages/Public/CmsKit/Blogs/index.css | 4 ++ .../Pages/Public/CmsKit/Blogs/index.js | 18 +++++++++ 12 files changed, 113 insertions(+), 17 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.js diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index 5b04ffee07..6e650113d3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Blogs; @@ -25,4 +26,6 @@ public interface IBlogPostRepository : IBasicRepository Task SlugExistsAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); + + Task> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index 64fe2e2e02..cbd8fa3cfe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -97,4 +97,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.BlogId == blogId && x.Slug.ToLower() == slug, GetCancellationToken(cancellationToken)); } + + public async Task> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).BlogPosts.Select(x => x.Author).Distinct() + .ToListAsync(GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index adf394b90f..a2bae9e317 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -101,4 +101,10 @@ public class MongoBlogPostRepository : MongoDbRepository x.BlogId == blogId && x.Slug.ToLower() == slug, token); } + + public async Task> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default) + { + var queryable = (await GetQueryableAsync()).Select(x => x.Author).Distinct(); + return await AsyncExecuter.ToListAsync(queryable, GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs index 82388fdb42..b471171f3b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs @@ -5,7 +5,5 @@ namespace Volo.CmsKit.Public.Blogs; public class BlogPostGetListInput : PagedAndSortedResultRequestDto { - public string BlogSlug { get; set; } - public Guid? AuthorId { get; set; } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index 89103979ba..7f2b50c2a5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -1,13 +1,17 @@ -using JetBrains.Annotations; +using System.Collections.Generic; +using JetBrains.Annotations; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs; public interface IBlogPostPublicAppService : IApplicationService { - Task> GetListAsync(BlogPostGetListInput input); + Task> GetListAsync(string blogSlug, BlogPostGetListInput input); Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); + + Task> GetAuthorsHasBlogPosts(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index 39e5e75128..12543b0ed4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -5,6 +5,7 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Blogs; using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs; @@ -14,6 +15,7 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub protected IBlogRepository BlogRepository { get; } protected IBlogPostRepository BlogPostRepository { get; } + public BlogPostPublicAppService( IBlogRepository blogRepository, @@ -32,9 +34,9 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub return ObjectMapper.Map(blogPost); } - public virtual async Task> GetListAsync(BlogPostGetListInput input) + public virtual async Task> GetListAsync(string blogSlug, BlogPostGetListInput input) { - var blog = await BlogRepository.GetBySlugAsync(input.BlogSlug); + var blog = await BlogRepository.GetBySlugAsync(blogSlug); var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, input.MaxResultCount, input.SkipCount, input.Sorting); @@ -43,4 +45,10 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub await BlogPostRepository.GetCountAsync(blogId: blog.Id), ObjectMapper.Map, List>(blogPosts)); } + + public virtual async Task> GetAuthorsHasBlogPosts() + { + var authors = await BlogPostRepository.GetAuthorsHasBlogPosts(); + return ObjectMapper.Map, List>(authors); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index b89939627f..6db900c6ad 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -1,11 +1,13 @@ using Microsoft.AspNetCore.Mvc; using System; +using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Content; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs; @@ -30,8 +32,15 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub } [HttpGet] - public virtual Task> GetListAsync(BlogPostGetListInput input) + [Route("{blogSlug}")] + public virtual Task> GetListAsync(string blogSlug, BlogPostGetListInput input) { - return BlogPostPublicAppService.GetListAsync(input); + return BlogPostPublicAppService.GetListAsync(blogSlug, input); } -} + + [HttpGet] + public virtual Task> GetAuthorsHasBlogPosts() + { + return BlogPostPublicAppService.GetAuthorsHasBlogPosts(); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index d8c1f428da..496ce7f8c5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -41,7 +41,9 @@

@Model.BlogPost.Title

- @@@Model.BlogPost.Author?.UserName + + @@@Model.BlogPost.Author?.UserName + @Model.BlogPost.CreationTime

diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 32c5585f8e..dbc0d699ef 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -8,12 +8,40 @@ @model IndexModel @section styles{ - + } + +@section scripts { + + + +} + @{ const string dummyImageSource = "https://dummyimage.com/320x180/a3a3a3/fff.png"; } + + +
+ + +
+
+
@foreach (var blog in Model.Blogs.Items) { @@ -21,16 +49,16 @@ @if (blog.CoverImageMediaId != null) { - + } else { - + }
@blog.Title

- @@@blog.Author?.UserName + @@@blog.Author?.UserName @blog.CreationTime

@blog.ShortDescription

@@ -42,11 +70,10 @@
- }
- + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index b93a5d5f40..92c4ff235c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Pagination; using Volo.CmsKit.Public.Blogs; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs; @@ -19,10 +20,16 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public int CurrentPage { get; set; } = 1; + + [BindProperty(SupportsGet = true)] + public Guid? AuthorId { get; set; } public PagedResultDto Blogs { get; private set; } public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString()); + + [BindProperty(SupportsGet = true)] + public List Authors { get; set; } protected IBlogPostPublicAppService BlogPostPublicAppService { get; } @@ -34,10 +41,14 @@ public class IndexModel : CmsKitPublicPageModelBase public async Task OnGetAsync() { Blogs = await BlogPostPublicAppService.GetListAsync( + BlogSlug, new BlogPostGetListInput { SkipCount = PageSize * (CurrentPage - 1), - MaxResultCount = PageSize + MaxResultCount = PageSize, + AuthorId = AuthorId }); + + Authors = await BlogPostPublicAppService.GetAuthorsHasBlogPosts(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css index 161bb41190..19137de2cb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.css @@ -3,4 +3,8 @@ .popover { min-width: 276px; +} + +.author-name-span{ + cursor: pointer; } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.js new file mode 100644 index 0000000000..0d567d1650 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/index.js @@ -0,0 +1,18 @@ +$(function () { + var $selectAuthor = $('#AuthorSelect'); + var $authorNameSpan = $('.author-name-span'); + + $selectAuthor.on('change', function () { + var authorId = $selectAuthor.val(); + reloadPageWithQueryString({'authorId': authorId}); + }); + + $authorNameSpan.click(function () { + var authorId = $(this).data('author-id'); + reloadPageWithQueryString({'authorId': authorId}); + }); + + function reloadPageWithQueryString(param) { + window.location.href = window.location.pathname + "?" + $.param(param); + } +}); From 8fa4afa2601c3510f3406a000b5089fbee91aa7d Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Tue, 22 Mar 2022 16:32:13 +0300 Subject: [PATCH 050/242] Update BlogPostPublicClientProxy.Generated.cs --- .../BlogPostPublicClientProxy.Generated.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index c96e37f579..62a79cf6a5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -1,5 +1,6 @@ // This file is automatically generated by ABP framework to use MVC Controllers from CSharp using System; +using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Http.Client; @@ -7,6 +8,7 @@ using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; using Volo.CmsKit.Public.Blogs; +using Volo.CmsKit.Users; // ReSharper disable once CheckNamespace namespace Volo.CmsKit.Public.Blogs.ClientProxies; @@ -23,13 +25,18 @@ public partial class BlogPostPublicClientProxy : ClientProxyBase> GetListAsync(string blogSlug, PagedAndSortedResultRequestDto input) + + public virtual async Task> GetListAsync(string blogSlug, BlogPostGetListInput input) { return await RequestAsync>(nameof(GetListAsync), new ClientProxyRequestTypeValue { { typeof(string), blogSlug }, - { typeof(PagedAndSortedResultRequestDto), input } + { typeof(BlogPostGetListInput), input } }); } + + public virtual async Task> GetAuthorsHasBlogPosts() + { + return await RequestAsync>(nameof(GetAuthorsHasBlogPosts)); + } } From c9f348db49fd5d8afe19a8789759cdb36468a8d7 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 23 Mar 2022 12:55:19 +0800 Subject: [PATCH 051/242] Always use GetCancellationToken --- .../CmsKit/Blogs/IBlogFeatureRepository.cs | 7 +- .../Volo/CmsKit/Tags/ITagRepository.cs | 8 +- .../Blogs/EfCoreBlogFeatureRepository.cs | 13 +- .../Volo/CmsKit/Tags/EfCoreTagRepository.cs | 8 +- .../Blogs/MongoBlogFeatureRepository.cs | 17 +- .../MongoDB/Blogs/MongoBlogPostRepository.cs | 18 +- .../MongoDB/Blogs/MongoBlogRepository.cs | 2 +- .../CmsKit/MongoDB/Tags/MongoTagRepository.cs | 12 +- .../Documents/EFCoreDocumentRepository.cs | 12 +- .../Docs/Documents/MongoDocumentRepository.cs | 10 +- .../EfCoreOrganizationUnitRepository.cs | 8 +- .../MongoDB/MongoIdentityUserRepository.cs | 20 +- .../MongoOrganizationUnitRepository.cs | 11 +- .../EfCoreTenantRepository.cs | 2 +- .../MongoDb/MongoTenantRepository.cs | 2 +- .../MyCompanyName.MyProjectName.Web/yarn.lock | 343 +++++++++--------- 16 files changed, 246 insertions(+), 247 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs index 1854353429..8ce64ac4df 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogFeatureRepository.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; @@ -9,9 +10,9 @@ namespace Volo.CmsKit.Blogs; public interface IBlogFeatureRepository : IBasicRepository { - Task> GetListAsync(Guid blogId); + Task> GetListAsync(Guid blogId, CancellationToken cancellationToken = default); - Task> GetListAsync(Guid blogId, List featureNames); + Task> GetListAsync(Guid blogId, List featureNames, CancellationToken cancellationToken = default); - Task FindAsync(Guid blogId, string featureName); + Task FindAsync(Guid blogId, string featureName, CancellationToken cancellationToken = default); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/ITagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/ITagRepository.cs index 7ac48eeb1a..e74b767078 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/ITagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/ITagRepository.cs @@ -24,9 +24,13 @@ public interface ITagRepository : IBasicRepository [NotNull] string name, CancellationToken cancellationToken = default); - Task> GetListAsync(string filter); + Task> GetListAsync( + string filter, + CancellationToken cancellationToken = default); - Task GetCountAsync(string filter); + Task GetCountAsync( + string filter, + CancellationToken cancellationToken = default); Task> GetAllRelatedTagsAsync( [NotNull] string entityType, diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs index 8c674e11f5..3f0a9cf726 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogFeatureRepository.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; @@ -15,22 +16,22 @@ public class EfCoreBlogFeatureRepository : EfCoreRepository FindAsync(Guid blogId, string featureName) + public Task FindAsync(Guid blogId, string featureName, CancellationToken cancellationToken = default) { - return base.FindAsync(x => x.BlogId == blogId && x.FeatureName == featureName); + return base.FindAsync(x => x.BlogId == blogId && x.FeatureName == featureName, cancellationToken: cancellationToken); } - public async Task> GetListAsync(Guid blogId) + public async Task> GetListAsync(Guid blogId, CancellationToken cancellationToken = default) { return await (await GetQueryableAsync()) .Where(x => x.BlogId == blogId) - .ToListAsync(); + .ToListAsync(GetCancellationToken(cancellationToken)); } - public async Task> GetListAsync(Guid blogId, List featureNames) + public async Task> GetListAsync(Guid blogId, List featureNames, CancellationToken cancellationToken = default) { return await (await GetQueryableAsync()) .Where(x => x.BlogId == blogId && featureNames.Contains(x.FeatureName)) - .ToListAsync(); + .ToListAsync(GetCancellationToken(cancellationToken)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreTagRepository.cs index dc026b32aa..9b750eaac5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreTagRepository.cs @@ -80,14 +80,14 @@ public class EfCoreTagRepository : EfCoreRepository return await query.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)); } - public async Task> GetListAsync(string filter) + public async Task> GetListAsync(string filter, CancellationToken cancellationToken = default) { - return await (await GetQueryableByFilterAsync(filter)).ToListAsync(); + return await (await GetQueryableByFilterAsync(filter)).ToListAsync(GetCancellationToken(cancellationToken)); } - public async Task GetCountAsync(string filter) + public async Task GetCountAsync(string filter, CancellationToken cancellationToken = default) { - return await (await GetQueryableByFilterAsync(filter)).CountAsync(); + return await (await GetQueryableByFilterAsync(filter)).CountAsync(GetCancellationToken(cancellationToken)); } private async Task> GetQueryableByFilterAsync(string filter) diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs index 45253b3991..334debe8c8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogFeatureRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Driver.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; @@ -17,22 +18,22 @@ public class MongoBlogFeatureRepository : MongoDbRepository FindAsync(Guid blogId, string featureName) + public Task FindAsync(Guid blogId, string featureName, CancellationToken cancellationToken = default) { - return base.FindAsync(x => x.BlogId == blogId && x.FeatureName == featureName); + return base.FindAsync(x => x.BlogId == blogId && x.FeatureName == featureName, cancellationToken: cancellationToken); } - public virtual async Task> GetListAsync(Guid blogId) + public virtual async Task> GetListAsync(Guid blogId, CancellationToken cancellationToken = default) { - return await (await GetMongoQueryableAsync()) + return await (await GetMongoQueryableAsync(cancellationToken)) .Where(x => x.BlogId == blogId) - .ToListAsync(); + .ToListAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task> GetListAsync(Guid blogId, List featureNames) + public virtual async Task> GetListAsync(Guid blogId, List featureNames, CancellationToken cancellationToken = default) { - return await (await GetMongoQueryableAsync()) + return await (await GetMongoQueryableAsync(cancellationToken)) .Where(x => x.BlogId == blogId && featureNames.Contains(x.FeatureName)) - .ToListAsync(); + .ToListAsync(GetCancellationToken(cancellationToken)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index f52dc3add4..3583fdfc68 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -44,12 +44,12 @@ public class MongoBlogPostRepository : MongoDbRepository>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) .WhereIf>(blogId.HasValue, x => x.BlogId == blogId) - .CountAsync(GetCancellationToken(cancellationToken)); + .CountAsync(cancellationToken); } public virtual async Task> GetListAsync( @@ -60,8 +60,8 @@ public class MongoBlogPostRepository : MongoDbRepository().AsQueryable(); @@ -81,7 +81,7 @@ public class MongoBlogPostRepository : MongoDbRepository { @@ -95,8 +95,8 @@ public class MongoBlogPostRepository : MongoDbRepository x.BlogId == blogId && x.Slug.ToLower() == slug, token); + cancellationToken = GetCancellationToken(cancellationToken); + var queryable = await GetMongoQueryableAsync(cancellationToken); + return await queryable.AnyAsync(x => x.BlogId == blogId && x.Slug.ToLower() == slug, cancellationToken); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs index 00d12a0246..b34c452621 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogRepository.cs @@ -66,7 +66,7 @@ public class MongoBlogRepository : MongoDbRepository> GetListQueryAsync(string filter = null, CancellationToken cancellationToken = default) { - return (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) + return (await GetMongoQueryableAsync(cancellationToken)) .WhereIf(!filter.IsNullOrWhiteSpace(), b => b.Name.Contains(filter)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoTagRepository.cs index 2230c36f19..6b4be3dbbf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoTagRepository.cs @@ -82,19 +82,19 @@ public class MongoTagRepository : MongoDbRepository> GetListAsync(string filter) + public async Task> GetListAsync(string filter, CancellationToken cancellationToken = default) { - return await (await GetQueryableByFilterAsync(filter)).ToListAsync(); + return await (await GetQueryableByFilterAsync(filter, cancellationToken)).ToListAsync(GetCancellationToken(cancellationToken)); } - public async Task GetCountAsync(string filter) + public async Task GetCountAsync(string filter, CancellationToken cancellationToken = default) { - return await (await GetQueryableByFilterAsync(filter)).CountAsync(); + return await (await GetQueryableByFilterAsync(filter, cancellationToken)).CountAsync(GetCancellationToken(cancellationToken)); } - private async Task> GetQueryableByFilterAsync(string filter) + private async Task> GetQueryableByFilterAsync(string filter, CancellationToken cancellationToken = default) { - var mongoQueryable = await GetMongoQueryableAsync(); + var mongoQueryable = await GetMongoQueryableAsync(cancellationToken: cancellationToken); if (!filter.IsNullOrWhiteSpace()) { diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs index a322120c3d..d1d78cc24a 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs @@ -29,13 +29,13 @@ namespace Volo.Docs.Documents LanguageCode = x.LanguageCode, Format = x.Format, }) - .ToListAsync(cancellationToken: cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public async Task> GetListByProjectId(Guid projectId, CancellationToken cancellationToken = default) { - return await (await GetDbSetAsync()).Where(d => d.ProjectId == projectId).ToListAsync(cancellationToken: cancellationToken); + return await (await GetDbSetAsync()).Where(d => d.ProjectId == projectId).ToListAsync(GetCancellationToken(cancellationToken)); } public async Task> GetListAsync(Guid? projectId, string version, string name, CancellationToken cancellationToken = default) @@ -44,7 +44,7 @@ namespace Volo.Docs.Documents .WhereIf(version != null, x => x.Version == version) .WhereIf(name != null, x => x.Name == name) .WhereIf(projectId.HasValue, x => x.ProjectId == projectId) - .ToListAsync(cancellationToken: cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public async Task> GetAllAsync( @@ -86,7 +86,7 @@ namespace Volo.Docs.Documents ); query = query.OrderBy(string.IsNullOrWhiteSpace(sorting) ? nameof(Document.Name) : sorting); - return await query.PageBy(skipCount, maxResultCount).ToListAsync(cancellationToken); + return await query.PageBy(skipCount, maxResultCount).ToListAsync(GetCancellationToken(cancellationToken)); } public async Task GetAllCountAsync( @@ -138,7 +138,7 @@ namespace Volo.Docs.Documents .FirstOrDefaultAsync(x => x.ProjectId == projectId && x.Name == name && x.LanguageCode == languageCode && x.Version == version, - cancellationToken); + GetCancellationToken(cancellationToken)); } public async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, CancellationToken cancellationToken = default) @@ -150,7 +150,7 @@ namespace Volo.Docs.Documents public async Task GetAsync(Guid id, CancellationToken cancellationToken = default) { - return await (await GetDbSetAsync()).Where(x => x.Id == id).SingleAsync(cancellationToken: cancellationToken); + return await (await GetDbSetAsync()).Where(x => x.Id == id).SingleAsync(cancellationToken: GetCancellationToken(cancellationToken)); } protected virtual IQueryable ApplyFilterForGetAll( diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs index 3a57330557..c812947388 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs @@ -31,12 +31,12 @@ namespace Volo.Docs.Documents LanguageCode = x.LanguageCode, Format = x.Format }) - .ToListAsync(cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public async Task> GetListByProjectId(Guid projectId, CancellationToken cancellationToken = default) { - return await (await GetMongoQueryableAsync(cancellationToken)).Where(d => d.ProjectId == projectId).ToListAsync(cancellationToken); + return await (await GetMongoQueryableAsync(cancellationToken)).Where(d => d.ProjectId == projectId).ToListAsync(GetCancellationToken(cancellationToken)); } public async Task FindAsync(Guid projectId, string name, string languageCode, string version, @@ -46,7 +46,7 @@ namespace Volo.Docs.Documents return await (await GetMongoQueryableAsync(cancellationToken)).FirstOrDefaultAsync(x => x.ProjectId == projectId && x.Name == name && x.LanguageCode == languageCode && - x.Version == version, cancellationToken); + x.Version == version, GetCancellationToken(cancellationToken)); } public async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, @@ -64,7 +64,7 @@ namespace Volo.Docs.Documents .WhereIf(name != null, x => x.Name == name) .WhereIf(projectId.HasValue, x => x.ProjectId == projectId) .As>() - .ToListAsync(cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public async Task> GetAllAsync( @@ -156,7 +156,7 @@ namespace Volo.Docs.Documents public async Task GetAsync(Guid id, CancellationToken cancellationToken = default) { - return await (await GetMongoQueryableAsync(cancellationToken)).Where(x => x.Id == id).SingleAsync(cancellationToken); + return await (await GetMongoQueryableAsync(cancellationToken)).Where(x => x.Id == id).SingleAsync(GetCancellationToken(cancellationToken)); } protected virtual IMongoQueryable ApplyFilterForGetAll( diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs index eae1306975..cd2e2af595 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs @@ -137,7 +137,7 @@ public class EfCoreOrganizationUnitRepository .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) .OrderBy(sorting.IsNullOrEmpty() ? nameof(IdentityRole.Name) : sorting) .PageBy(skipCount, maxResultCount) - .ToListAsync(cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public virtual async Task GetUnaddedRolesCountAsync( @@ -151,7 +151,7 @@ public class EfCoreOrganizationUnitRepository return await dbContext.Roles .Where(r => !roleIds.Contains(r.Id)) .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) - .CountAsync(cancellationToken); + .CountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetMembersAsync( @@ -211,7 +211,7 @@ public class EfCoreOrganizationUnitRepository .IncludeDetails(includeDetails) .OrderBy(sorting.IsNullOrEmpty() ? nameof(IdentityUser.Name) : sorting) .PageBy(skipCount, maxResultCount) - .ToListAsync(cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public virtual async Task GetUnaddedUsersCountAsync( @@ -231,7 +231,7 @@ public class EfCoreOrganizationUnitRepository u.UserName.Contains(filter) || u.Email.Contains(filter) || (u.PhoneNumber != null && u.PhoneNumber.Contains(filter))) - .CountAsync(cancellationToken); + .CountAsync(GetCancellationToken(cancellationToken)); } [Obsolete("Use WithDetailsAsync method.")] diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index 7a953ed81e..2edcff0388 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -36,7 +36,8 @@ public class MongoIdentityUserRepository : MongoDbRepository r.OrganizationUnitId) .ToArray(); @@ -47,14 +48,15 @@ public class MongoIdentityUserRepository : MongoDbRepository x.Roles.Select(r => r.RoleId)).ToArray(); var roleIds = user.Roles.Select(r => r.RoleId).ToArray(); var allRoleIds = orgUnitRoleIds.Union(roleIds); - return await (await GetMongoQueryableAsync(cancellationToken)).Where(r => allRoleIds.Contains(r.Id)).Select(r => r.Name).ToListAsync(GetCancellationToken(cancellationToken)); + return await (await GetMongoQueryableAsync(cancellationToken)).Where(r => allRoleIds.Contains(r.Id)).Select(r => r.Name).ToListAsync(cancellationToken); } public virtual async Task> GetRoleNamesInOrganizationUnitAsync( Guid id, CancellationToken cancellationToken = default) { - var user = await GetAsync(id, cancellationToken: GetCancellationToken(cancellationToken)); + cancellationToken = GetCancellationToken(cancellationToken); + var user = await GetAsync(id, cancellationToken: cancellationToken); var organizationUnitIds = user.OrganizationUnits .Select(r => r.OrganizationUnitId) @@ -71,7 +73,7 @@ public class MongoIdentityUserRepository : MongoDbRepository roleIds.Contains(r.Id)) .Select(r => r.Name) - .ToListAsync(GetCancellationToken(cancellationToken)); + .ToListAsync(cancellationToken); } public virtual async Task FindByLoginAsync( @@ -172,7 +174,8 @@ public class MongoIdentityUserRepository : MongoDbRepository r.OrganizationUnitId) .ToArray(); @@ -183,7 +186,7 @@ public class MongoIdentityUserRepository : MongoDbRepository x.Roles.Select(r => r.RoleId)).ToArray(); var roleIds = user.Roles.Select(r => r.RoleId).ToArray(); var allRoleIds = orgUnitRoleIds.Union(roleIds); - return await (await GetMongoQueryableAsync(cancellationToken)).Where(r => allRoleIds.Contains(r.Id)).ToListAsync(GetCancellationToken(cancellationToken)); + return await (await GetMongoQueryableAsync(cancellationToken)).Where(r => allRoleIds.Contains(r.Id)).ToListAsync(cancellationToken); } public virtual async Task> GetOrganizationUnitsAsync( @@ -191,12 +194,13 @@ public class MongoIdentityUserRepository : MongoDbRepository r.OrganizationUnitId); return await (await GetMongoQueryableAsync(cancellationToken)) .Where(ou => organizationUnitIds.Contains(ou.Id)) - .ToListAsync(GetCancellationToken(cancellationToken)); + .ToListAsync(cancellationToken); } public virtual async Task GetCountAsync( diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs index 5f0f5fd097..23726693ad 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs @@ -95,7 +95,7 @@ public class MongoOrganizationUnitRepository .OrderBy(sorting.IsNullOrEmpty() ? nameof(IdentityRole.Name) : sorting) .As>() .PageBy>(skipCount, maxResultCount) - .ToListAsync(cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public virtual async Task GetRolesCountAsync( @@ -104,7 +104,7 @@ public class MongoOrganizationUnitRepository { var roleIds = organizationUnit.Roles.Select(r => r.RoleId).ToArray(); - return await (await GetMongoQueryableAsync(cancellationToken)).Where(r => roleIds.Contains(r.Id)).CountAsync(cancellationToken); + return await (await GetMongoQueryableAsync(cancellationToken)).Where(r => roleIds.Contains(r.Id)).CountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetUnaddedRolesAsync( @@ -124,7 +124,7 @@ public class MongoOrganizationUnitRepository .OrderBy(sorting.IsNullOrEmpty() ? nameof(IdentityRole.Name) : sorting) .As>() .PageBy>(skipCount, maxResultCount) - .ToListAsync(cancellationToken); + .ToListAsync(GetCancellationToken(cancellationToken)); } public virtual async Task GetUnaddedRolesCountAsync( @@ -138,7 +138,7 @@ public class MongoOrganizationUnitRepository .Where(r => !roleIds.Contains(r.Id)) .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) .As>() - .CountAsync(cancellationToken); + .CountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetMembersAsync( @@ -218,12 +218,13 @@ public class MongoOrganizationUnitRepository public virtual async Task RemoveAllMembersAsync(OrganizationUnit organizationUnit, CancellationToken cancellationToken = default) { + cancellationToken = GetCancellationToken(cancellationToken); var userQueryable = await GetMongoQueryableAsync(cancellationToken); var dbContext = await GetDbContextAsync(cancellationToken); var users = await userQueryable .Where(u => u.OrganizationUnits.Any(uou => uou.OrganizationUnitId == organizationUnit.Id)) .As>() - .ToListAsync(GetCancellationToken(cancellationToken)); + .ToListAsync(cancellationToken); foreach (var user in users) { diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs index 1fdeeb562b..34d350d242 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs @@ -74,7 +74,7 @@ public class EfCoreTenantRepository : EfCoreRepository u.Name.Contains(filter) - ).CountAsync(cancellationToken: cancellationToken); + ).CountAsync(cancellationToken: GetCancellationToken(cancellationToken)); } [Obsolete("Use WithDetailsAsync method.")] diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs index 5da1dad761..321dcf365f 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs @@ -69,6 +69,6 @@ public class MongoTenantRepository : MongoDbRepository u.Name.Contains(filter) - ).CountAsync(cancellationToken: cancellationToken); + ).CountAsync(cancellationToken: GetCancellationToken(cancellationToken)); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock index 4eb7e9ff11..ba1ca22dfb 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.0.1.tgz#884a4bc9ea043654891be56cd7e7c7bbf9bbad8c" - integrity sha512-JGTQyg3Zyfda84yg/Geq6rGuBN2SX4gIOaFL2h8BX9bA8CVuBC+zcwfO1bBsP89xfTyPvdSAGBvSfhCjPwsukQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.0.1.tgz#77a4900424603e0be048f3507aa852701f3139a2" - integrity sha512-mn9HEOHBkmBr7d/VUt0bfg9K58IyRDb7j3ZiDoHo263WLXJkf0+C7MEbv/zxfDHW4NeztsNCd3ugA7PdTxPzmA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.0.1" - "@abp/bootstrap" "~5.0.1" - "@abp/bootstrap-datepicker" "~5.0.1" - "@abp/datatables.net-bs5" "~5.0.1" - "@abp/font-awesome" "~5.0.1" - "@abp/jquery-form" "~5.0.1" - "@abp/jquery-validation-unobtrusive" "~5.0.1" - "@abp/lodash" "~5.0.1" - "@abp/luxon" "~5.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.0.1" - "@abp/select2" "~5.0.1" - "@abp/sweetalert2" "~5.0.1" - "@abp/timeago" "~5.0.1" - "@abp/toastr" "~5.0.1" - -"@abp/aspnetcore.mvc.ui@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.0.1.tgz#f5aa4e0dcc10878f590e30836887f3f9861e91e3" - integrity sha512-bN15UcNhTqeo0RXlIYws7Jd8ZfSBsVM6Y5wiAqbq1Q3Lvs1uLmryhZpn6sHmKw2Z3Lnhec7VjnZN0FwNpzEqUw== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.0-rc.2.tgz#d2cf4a0f2b8a93f1fe53a0bc6c66d9c3233b620a" + integrity sha512-aQk3RSl31UT4gEqiHT3oV06BZ/k6q1DVKBwVOj+YQEIb8ojptJtbGv+aUhHEql5I7zwiWe4EWf2rM2Ve0JQa6Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.0-rc.2.tgz#9ff2eb2a1b5f438d8f848659400100e20f74fc77" + integrity sha512-m06zMEt0C9P3f7+Qg7SjvP+k4wHPqvAOzsd5jDNN0JekeWH4gIMsqgDAoRB2SA72HUUpMbGe8Utune7EgE/T1Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.2.0-rc.2" + "@abp/bootstrap" "~5.2.0-rc.2" + "@abp/bootstrap-datepicker" "~5.2.0-rc.2" + "@abp/datatables.net-bs5" "~5.2.0-rc.2" + "@abp/font-awesome" "~5.2.0-rc.2" + "@abp/jquery-form" "~5.2.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~5.2.0-rc.2" + "@abp/lodash" "~5.2.0-rc.2" + "@abp/luxon" "~5.2.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~5.2.0-rc.2" + "@abp/select2" "~5.2.0-rc.2" + "@abp/sweetalert2" "~5.2.0-rc.2" + "@abp/timeago" "~5.2.0-rc.2" + "@abp/toastr" "~5.2.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.0-rc.2.tgz#427811f66eb738dbb89434e926b36a2309fe43b2" + integrity sha512-+ss9MctYTF9Ewn7VEsMqszEoiX51G070kN2bIepgyXnYetrQRFsTgQGa4yi1bAqyAF9rZ1j0hSB0eM2clFyJMg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,152 +41,151 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.0.1.tgz#52116a154e343d84c87257ad1ef10b54012f4c33" - integrity sha512-ZJWaZKzGzshBAfyBqaUScfWqeBVfWGbZIwIplF8VKtDGcyI8R54bqDsydhS88CCnolRz4+tfq3QY6yAXrUEKAw== +"@abp/bootstrap-datepicker@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.0-rc.2.tgz#bfb648e7b8e5d2a9806301417c7864abb4cc26e2" + integrity sha512-wKR+5g/xx7zqFGFaOZVO9XySlrOmOFH/ZidDpq9QYjE+OoHSlS8X5DUnkbXj2MbQy4etZuvz9ILcmnBPonrQ7g== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.0.1.tgz#d542a8fd7151e22eda1643e313a67f9892c50533" - integrity sha512-wyVAp6a4OIwlqK7AZozs7wpsBZgzG55EKeChBBfUXloJPuirQHxccFNE41aAYWfKur+wj25WD5NBnzFuKyNYiQ== +"@abp/bootstrap@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.0-rc.2.tgz#0375b38317c5d1f5f6cb7d46a0ee6bf9b85a6f4f" + integrity sha512-hsgxY8WNRonQZP3cmMKvBNHnyCSBfbBB4savLW5r7CxysjnRt6MDyhmmj7XVwVTC1siBviUcWClOHCJisaNRSw== dependencies: - "@abp/core" "~5.0.1" - bootstrap "^5.1.0" - bootstrap-v4-rtl "4.6.0-1" + "@abp/core" "~5.2.0-rc.2" + bootstrap "^5.1.3" -"@abp/core@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.0.1.tgz#904fa2c22bcbf42deb56abf772c3a53362807a2f" - integrity sha512-QzX35Oa+Vncu2OP1tXvGjAVFznmD1tZRn4tlDQgn36B2MU06UEO0JSx7JVedPvhzQZceUe5+WWMfuYNM2xeBTw== +"@abp/core@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.0-rc.2.tgz#f0c3dd7f0b12e8e13a702a3b0a53aa4525da673e" + integrity sha512-zotgZOXmkh+aD0KExBr4QytQfDDHxrG15e2HFzYKywhd0mpnwAVdR2Z2Ye01C360wJ2opv0mtgaSuEZniXNO3Q== dependencies: - "@abp/utils" "~5.0.1" + "@abp/utils" "~5.2.0-rc.2" -"@abp/datatables.net-bs5@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.0.1.tgz#b8afa2255e374c86c50e57bd57c2b36a86d6a890" - integrity sha512-1fuCk+K4xW3XnDFo2+kPXHMoOTol4HLRcWVRELjoBQ5YbTxEPsbrhfNUeUsECDAmkxoqY7G3MEdtIVwmy5NPpg== +"@abp/datatables.net-bs5@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.0-rc.2.tgz#df5cbe004ba3a2330cc667b3724440c4881cc6b2" + integrity sha512-Q2Sy6MMWM3EuELHeHxKkDflPTX09ictonjB5vn/Cau2PHuOkWTnL0Ystl91a1DetQIa1ejJL/YB+Pz1TUVoUNA== dependencies: - "@abp/datatables.net" "~5.0.1" - datatables.net-bs5 "^1.10.25" + "@abp/datatables.net" "~5.2.0-rc.2" + datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.0.1.tgz#0ce5bdf7aa5bf224b93a22758a016c50562d6569" - integrity sha512-x9D2YNtnOJRrKXi2Pwrqzz9sIOrn3o6x2c8ZxjyC54vh+SLQtLycAzQw7OyaZGdbFkudlJiCuME/FiuZvht8Og== +"@abp/datatables.net@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.0-rc.2.tgz#bfdc01302d19eab0d73eff908238bf88c5806e74" + integrity sha512-TG1b8moW4RqCyNtzQKB7RnCmDt1cDEy/5WD++Maz2x4/yvu1uBBa6qLR7Mn6UNgoC51Y/op+LzaabkwXUSJl4w== dependencies: - "@abp/jquery" "~5.0.1" - datatables.net "^1.10.21" + "@abp/jquery" "~5.2.0-rc.2" + datatables.net "^1.11.4" -"@abp/font-awesome@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.0.1.tgz#661753403499925661f880c53214841dd34f5210" - integrity sha512-C+alReNvHZzST55ITBTyFqhdTehPo5ondzfqc9QlyB3Kwk1DIq0CaLqfS2xU5glYGDSqKi7xfkyQnJdwu2hKRA== +"@abp/font-awesome@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.0-rc.2.tgz#0292cb22c0280dccfe148ad3d46947ede26f8b14" + integrity sha512-FzjH/lnAglswqU7/YAXZP0H/ocGBrDkegMiQ7OjzZVcgGPS9BnqRPbiHDz7mjBHaQHzBtTCcZrXnU0l3GXCdbw== dependencies: - "@abp/core" "~5.0.1" - "@fortawesome/fontawesome-free" "^5.13.0" + "@abp/core" "~5.2.0-rc.2" + "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.0.1.tgz#20fa51946f68a7acd6ef3dd3d8d1349307f681b4" - integrity sha512-Q7GG0+XFXs7pDoa4p3r7vm8+sUh5ohwovedPNVghtX8Rm2I1sfVfJKamPr24PCAyJcFVntU1WCt/CngneES3pw== +"@abp/jquery-form@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.0-rc.2.tgz#797e3b72a91435d74f19ddaa9b2e6e04fcfed616" + integrity sha512-cVbReCeM5q7nqeQDjSIH7VmuMwX8lE36D9sariUw8xSUn5GJlnrGYNV4kE7G9JLIlIRanIlS3SPuA3RFA2z9ZA== dependencies: - "@abp/jquery" "~5.0.1" + "@abp/jquery" "~5.2.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.0.1.tgz#50798d3c087d0b103944b3a9e7c39a1f51db9fdc" - integrity sha512-w5SAYB0EZRbOhIFcCUXWvoGB/dWj3zyQOarbvzJ9LelgrXvvoissaaSSqq6BySjr1UigIWBCVuruAQssizmXBQ== +"@abp/jquery-validation-unobtrusive@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.0-rc.2.tgz#ec0c22cecef3016c1da0b8dca4374a263915a835" + integrity sha512-b+ttLlnRPgDB7V2tnYp8+1Q3niM4ZmiU/ZaQB4z6gSMk/2tPAIhOOwAQt7DYRWSMUsgGFI0NvsgEBM9aLTikFA== dependencies: - "@abp/jquery-validation" "~5.0.1" - jquery-validation-unobtrusive "^3.2.11" + "@abp/jquery-validation" "~5.2.0-rc.2" + jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.0.1.tgz#5932060d1fdf04a81e998caac959188aefdf1669" - integrity sha512-T5p0U2cWh6Jov55AiUxJYRw92L6ubFXfqL0EkaePV5AnoetVXheluhq9gQAKnwVAqtc/3Rxkr/lO047catUkjw== +"@abp/jquery-validation@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.0-rc.2.tgz#a98383e6c7fb21b74ecde937c25d7fa46810a333" + integrity sha512-6lVxJyMfL0kHmv8tpxLhVfK0Rf+qjLMPkm1qHd0pSwvH+GM0QMN39s9TaexCvH3QO70BlEnwXJ2PWVY9OQY5uw== dependencies: - "@abp/jquery" "~5.0.1" - jquery-validation "^1.19.2" + "@abp/jquery" "~5.2.0-rc.2" + jquery-validation "^1.19.3" -"@abp/jquery@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.0.1.tgz#1522ba1e0c488bffdc30a230ab35e225ae32d028" - integrity sha512-AacK4cy/RpzBfRYf7Jjn+TmVm72TW0jEjRoQ3TOXmlOrunRph05mQm72Ux2o8+Z1lOwxJKRz5gKSbRTfa6Tgpw== +"@abp/jquery@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.0-rc.2.tgz#3235b92834cbca4d3e22fb0b19122aa2a24b8262" + integrity sha512-u7xpQcaMpzlXq018qBdzwWmPx+65QHPq5VhI7aAvZAUlQrvQjiiCeG25egxOeCL0aROcCjsAlnTItT1U/q9loQ== dependencies: - "@abp/core" "~5.0.1" + "@abp/core" "~5.2.0-rc.2" jquery "~3.6.0" -"@abp/lodash@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.0.1.tgz#ad22895772ce65e52941dddb84d0a7d26c521d59" - integrity sha512-r1QqZCXfDd0YQnE4MkcY291H5jWFdZtGeYmwjIkn7aeOZ0PP9qsDPkWTwPwbpfmnz4DhmIdO5a1rveWz/J5ZwQ== +"@abp/lodash@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.0-rc.2.tgz#e55f11279d4f374785a56ec68ed99cdf2495a9aa" + integrity sha512-BR6d1NbTcuk772RK8VdeHBokbqZ1OHUgRKdPG3MXlDGKZmUS4/ijFdRiIvo7Rd0WFqgk2QdbHw3lfKQ/CGqyhw== dependencies: - "@abp/core" "~5.0.1" - lodash "^4.17.15" + "@abp/core" "~5.2.0-rc.2" + lodash "^4.17.21" -"@abp/luxon@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.0.1.tgz#7930e30db60e63b486a51030c60e09b54bcb3867" - integrity sha512-cXbnyAI9Gn2bZBQuCN46UFOkzb+djA3LMgpeMlTTv0aA87PrjzT60EPQ4a9FLovESqNnblaQ9Je43QwoGH8kZA== +"@abp/luxon@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.0-rc.2.tgz#0d263482b9a73269164a8a58562ce8bd69b57f36" + integrity sha512-KIhpvl9kf43Bc/E/u6bmb1lp0asf81NoUoERQTRz7JqmH1XYJvJCqGHxommvItcu7zNjCLL6FK/JtO0v7DUiEw== dependencies: - "@abp/core" "~5.0.1" - luxon "^1.24.1" + "@abp/core" "~5.2.0-rc.2" + luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.0.1.tgz#268ec30eef8ba72a0c8cb997e55d48a1508b2719" - integrity sha512-mqF6OizoWp6kg5pztNfF78+mbfyX3JAXDfv+ZUCvjtAqllIzyOUIqRSXULDkAcDeCC1+PluRsd+uSltIppC5hA== +"@abp/malihu-custom-scrollbar-plugin@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.0-rc.2.tgz#5136c0d59d5d385350f560c6d8a3d10f6393dea7" + integrity sha512-7Q8yZbU9YRA5/Y+rRLLiPD724rjfrVBuCpfp1+b99LyeFTFTSD2oNG3r/I6FC7tE5HLaFscJLJyOca4GPS1mww== dependencies: - "@abp/core" "~5.0.1" + "@abp/core" "~5.2.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.0.1.tgz#644c46c7c942a6b9d36bc76c7132f32ad577933b" - integrity sha512-FHVqEebQS3XiYn5TMEhGaQJOAYnPqxivKpeOB0F0F2bEDGqt3OXh05KcQBOm+sDSScq3c7T7HLr9mMzlYtyHXw== +"@abp/select2@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.0-rc.2.tgz#2eef30442957ac02133357604a1256e995a9ebe7" + integrity sha512-1cFOavpWP6zRfrpXi0zozFkL6W0tEEBkWj7AiHU3AGctAQEZ0qWGKSTIExqnEsDb3LsjAKMdBycGdkLFbK97Og== dependencies: - "@abp/core" "~5.0.1" + "@abp/core" "~5.2.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert2@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.0.1.tgz#acf2acfc04619c7907237238bfaeb63f2d75fb22" - integrity sha512-CPqXIaHK7Ff6i8gNhxoZ9r3te9LIEiDCUpdHNtgRVMCaLbywfkiLyirlfRIB6lxRWSw8BZ+M/azdp5uzidW8Vw== +"@abp/sweetalert2@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.0-rc.2.tgz#15b6718b1378e8bd7e0ea019b965e7b51f0cb1ea" + integrity sha512-1ROKcfpu0Xyk7ebUFMNBhFgENcHCMj48+1Lj/OxdJH3U7KhyF5WEs54uYgn8EvY2wTCgOkHCnqeK9bRCp5M9+g== dependencies: - "@abp/core" "~5.0.1" - sweetalert2 "^11.0.18" + "@abp/core" "~5.2.0-rc.2" + sweetalert2 "^11.3.6" -"@abp/timeago@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.0.1.tgz#09ca6302304de09baa5ac8c72b950515ab0d0451" - integrity sha512-6onXho8R6eiWfncONZFBn18OwgQPKIaRM73rVevpRGJTf2pylcHtCp4uHGsoqgCc+TQU7FyoKTTkg4lfvCQa0A== +"@abp/timeago@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.0-rc.2.tgz#e6ad0cb584515b95e47258976d726fd996b7f47d" + integrity sha512-D9Y7xfpP6neURDkP/WMrFh25G++0SUiGIDaCIElgymhNdVp2gm9pC633ShetMOFrPCSuOUvlzC2p4YkUdq0Lnw== dependencies: - "@abp/jquery" "~5.0.1" + "@abp/jquery" "~5.2.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.0.1.tgz#a3959df1de0c4640fabf508da9ccd3ed37ae2b03" - integrity sha512-ndL1uj2ce4PbGDzxh+QCIWYu+GAmW1Xwma4aJcq5zKo+xhlLJJnTe6QFGKr7wSsTVZMB7z1Pp2olvXH6an82+g== +"@abp/toastr@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.0-rc.2.tgz#b5f013f1f00dab648da2fe1cf4ece6691e6eafc7" + integrity sha512-FSkva7zP3kJFSh6SlmvrgjPFJscJbmrgCilxGxPGVxlg5p9LNORgkotNk2yKsGHX0F0rnKJ4kHepTq7g+oGMdw== dependencies: - "@abp/jquery" "~5.0.1" + "@abp/jquery" "~5.2.0-rc.2" toastr "^2.1.4" -"@abp/utils@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.0.1.tgz#57934383004a21172bf7e08130813c08946894fb" - integrity sha512-WLCWe7iJ8krxsz8Z7E+8GDaGZuG/6PZDdqPcMIh95opi0kvcLxb+mjPXXpiXdtFzW7O09a+NaNOxorsEFxjoKw== +"@abp/utils@~5.2.0-rc.2": + version "5.2.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.0-rc.2.tgz#1280059ff3e948ae0827eaf06d916e5a90f8907b" + integrity sha512-/mo4dSXPkhCEbqyKunuURcF1cEzuJqRTPOGpjSrjDwOgymVSWp/AqqjJPBXuc4qrMfB4q9y+Iod5nslXp2cXeA== dependencies: just-compare "^1.3.0" -"@fortawesome/fontawesome-free@^5.13.0": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.1.tgz#c53b4066edae16cd1fd669f687baf031b45fb9d6" - integrity sha512-D819f34FLHeBN/4xvw0HR0u7U2G7RqjPSggXqf7LktsxWQ48VAfGwvMrhcVuaZV2fF069c/619RdgCCms0DHhw== +"@fortawesome/fontawesome-free@^5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" + integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== abbrev@1: version "1.1.1" @@ -391,12 +390,7 @@ bootstrap-datepicker@^1.9.0: dependencies: jquery ">=1.7.1 <4.0.0" -bootstrap-v4-rtl@4.6.0-1: - version "4.6.0-1" - resolved "https://registry.yarnpkg.com/bootstrap-v4-rtl/-/bootstrap-v4-rtl-4.6.0-1.tgz#8fc502e800308fb725151128dd288df1c027cd8e" - integrity sha512-ChcbO5JeEQx6/Yz40YZLq3A4RIWcCmCCiRpweF5wg32/Q8CfWrwDNpcDTJ2SU+aSAewUJoCSzf/tRxhAgnZuog== - -bootstrap@^5.1.0: +bootstrap@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34" integrity sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q== @@ -603,25 +597,18 @@ d@1: dependencies: es5-ext "^0.10.9" -datatables.net-bs5@^1.10.25: - version "1.11.3" - resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-1.11.3.tgz#939d0e66fbf518718a519534a88fc88cd29405b0" - integrity sha512-u0tosKUR1XNpXzxOOt2NInnNYayt7GQoG+OM1xPRhdkZ7ZBD4oNF8S0aKve8yvSUq/ZwTMh4WJeh80GdmrJAdQ== +datatables.net-bs5@^1.11.4: + version "1.11.5" + resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-1.11.5.tgz#593608d54aeb7f91bcbd80bde304155ba3795663" + integrity sha512-1zyh972GtuK1uAb9h8nP3jJ7f/3UgCDq69LAaZS2bVd4mEHECJ6vrZLacxrkOHOs/q/H3v5sEMeZ46vXz8ox4w== dependencies: - datatables.net ">=1.10.25" + datatables.net ">=1.11.3" jquery ">=1.7" -datatables.net@>=1.10.25: - version "1.11.3" - resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.11.3.tgz#80e691036efcd62467558ee64c07dd566cb761b4" - integrity sha512-VMj5qEaTebpNurySkM6jy6sGpl+s6onPK8xJhYr296R/vUBnz1+id16NVqNf9z5aR076OGcpGHCuiTuy4E05oQ== - dependencies: - jquery ">=1.7" - -datatables.net@^1.10.21: - version "1.10.21" - resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.10.21.tgz#f1d35c8e5c3eb7f5caef39e80cd5b836a8c77103" - integrity sha512-/bSZtxmf3GTpYcvEmwZ8q26I1yhSx8qklR2B+s1K8+/51UW/zc2zTYwJMqr/Z+iCYixAc00ildj4g2x0Qamolw== +datatables.net@>=1.11.3, datatables.net@^1.11.4: + version "1.11.5" + resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.11.5.tgz#858a69953a01e1d5b18786769802117b04b8e3c9" + integrity sha512-nlFst2xfwSWaQgaOg5sXVG3cxYC0tH8E8d65289w9ROgF2TmLULOOpcdMpyxxUim/qEwVSEem42RjkTWEpr3eA== dependencies: jquery ">=1.7" @@ -1375,12 +1362,12 @@ jquery-mousewheel@>=3.0.6: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" -jquery-validation-unobtrusive@^3.2.11: - version "3.2.11" - resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.11.tgz#175ee46380385a0e33ed320f255fad321f68f9f5" - integrity sha512-3FQPllaWdD+Aq55zJLGSW39+eXPDz1HhwAvrSwYi8zHQ8DVcu5IJ1HVeTiCl0BnCnrIBvfFU3zEB/DrGdcoRIQ== +jquery-validation-unobtrusive@^3.2.12: + version "3.2.12" + resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.12.tgz#1d52841f653e516525c251e494b042e664dad8af" + integrity sha512-kPixGhVcuat7vZXngGFfSIksy4VlzZcHyRgnBIZdsfVneCU+D5sITC8T8dD/9c9K/Q+qkMlgp7ufJHz93nKSuQ== dependencies: - jquery ">=1.8" + jquery "^3.5.1" jquery-validation ">=1.16" jquery-validation@>=1.16: @@ -1389,12 +1376,12 @@ jquery-validation@>=1.16: dependencies: jquery "^1.7 || ^2.0 || ^3.1" -jquery-validation@^1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.19.2.tgz#c602831b0d8c5881400af424e872757ce241eff9" - integrity sha512-yHaAqOGaAB7+p2u5lpzhhQVt3CBMUw3fHcuCJ7nXmXz0LWLHPN7yOhwnocp5nrn2SmnXR1jpV+whx2j1kLz1tQ== +jquery-validation@^1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.19.3.tgz#50b350eba8b02bcfd119ba15f199487b7eb64086" + integrity sha512-iXxCS5W7STthSTMFX/NDZfWHBLbJ1behVK3eAgHXAV8/0vRa9M4tiqHvJMr39VGWHMGdlkhrtrkBuaL2UlE8yw== -jquery@>=1.12.0, jquery@>=1.7, jquery@>=1.7.2, jquery@>=1.8, "jquery@^1.7 || ^2.0 || ^3.1": +jquery@>=1.12.0, jquery@>=1.7, jquery@>=1.7.2, "jquery@^1.7 || ^2.0 || ^3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" @@ -1403,7 +1390,7 @@ jquery@>=1.12.0, jquery@>=1.7, jquery@>=1.7.2, jquery@>=1.8, "jquery@^1.7 || ^2. resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== -jquery@~3.6.0: +jquery@^3.5.1, jquery@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== @@ -1497,15 +1484,15 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -luxon@^1.24.1: - version "1.24.1" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.24.1.tgz#a8383266131ed4eaed4b5f430f96f3695403a52a" - integrity sha512-CgnIMKAWT0ghcuWFfCWBnWGOddM0zu6c4wZAWmD0NN7MZTnro0+833DF6tJep+xlxRPg4KtsYEHYLfTMBQKwYg== +luxon@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.3.1.tgz#f276b1b53fd9a740a60e666a541a7f6dbed4155a" + integrity sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA== make-iterator@^1.0.0: version "1.0.1" @@ -2356,10 +2343,10 @@ sver-compat@^1.5.0: es6-iterator "^2.0.1" es6-symbol "^3.1.1" -sweetalert2@^11.0.18: - version "11.3.3" - resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.3.3.tgz#92ca0408380de8f29180788ce7ed5d5faf799cea" - integrity sha512-10Keqbmjng/+XpkpSOQ6dttpztl7XNohjnpC6bX6XFgm0WpRXM81YE0wmonGYOP6uyzd76vpfnZS04PdVvO31Q== +sweetalert2@^11.3.6: + version "11.4.6" + resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.4.6.tgz#c17ae901150c8a89ea85b93cefe5c4791f32e68a" + integrity sha512-7UDJV8etrJQ6vJGh88k7D63qBKtwEl8JV7zIxmO2Frp8ZGQDgQQC6f9ivqiVwLRxoEyfxsn/v3T6Zykk7/vlEg== tar@^4: version "4.4.10" From 2c9b725554b280bea262941e8a5c8b3bc7210343 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 23 Mar 2022 12:15:17 +0300 Subject: [PATCH 052/242] Fix CmsKit Tests --- .../Blogs/BlogPostPublicAppService_Tests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs index 2301941920..f7a1ad3e7c 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs @@ -26,7 +26,7 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase [Fact] public async Task GetListAsync_ShouldWorkProperly_WithExistingBlog() { - var blogPosts = await blogPostAppService.GetListAsync(cmsKitTestData.BlogSlug, new PagedAndSortedResultRequestDto { MaxResultCount = 2 }); + var blogPosts = await blogPostAppService.GetListAsync(cmsKitTestData.BlogSlug, new BlogPostGetListInput { MaxResultCount = 2 }); blogPosts.ShouldNotBeNull(); blogPosts.TotalCount.ShouldBe(2); From fe34681006020edd9a8cbc2a6d36c63be84cf55a Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 23 Mar 2022 12:15:35 +0300 Subject: [PATCH 053/242] Add simple test for GetAuthorsHasBlogPosts --- .../Blogs/BlogPostRepository_Test.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs index 0479ce75b2..4d696e916d 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs @@ -145,4 +145,14 @@ public abstract class BlogPostRepository_Test : CmsKitTestBase x.Id == testData.User1Id); + } } From df12120c4323c48f909f0ff7ee3ccfb30868b75f Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 23 Mar 2022 12:27:24 +0300 Subject: [PATCH 054/242] Fix MongoDB query for GetAuthorsHasBlogPosts --- .../MongoDB/Blogs/MongoBlogPostRepository.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index a2bae9e317..3b04f46fb6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -104,7 +104,19 @@ public class MongoBlogPostRepository : MongoDbRepository> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default) { - var queryable = (await GetQueryableAsync()).Select(x => x.Author).Distinct(); + var blogPostQueryable = (await GetQueryableAsync()); + + var usersQueryable = (await GetDbContextAsync()).Collection().AsQueryable(); + + var queryable = blogPostQueryable + .Join( + usersQueryable, + o => o.AuthorId, + i => i.Id, + (blogPost, user) => new { blogPost, user }) + .Select(s => s.user) + .Distinct(); + return await AsyncExecuter.ToListAsync(queryable, GetCancellationToken(cancellationToken)); } } From c81536a91ab28fd3e2de9dca396e8e93a2108cda Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Wed, 23 Mar 2022 16:26:25 +0300 Subject: [PATCH 055/242] open link in new tab quick fix --- .../AbpIoLocalization/Www/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 2f2b4c8481..dbdd8b47ef 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -183,7 +183,7 @@ "InstallABPCLIInfo": "ABP CLI is the fastest way to start a new solution with the ABP framework. Install the ABP CLI using a command line window:", "DifferentLevelOfNamespaces": "You can use different levels of namespaces; e.g. BookStore, Acme.BookStore or Acme.Retail.BookStore.", "ABPCLIExamplesInfo": "The new command creates a layered MVC application with Entity Framework Core as the database provider. However, it has additional options.", - "SeeCliDocumentForMoreInformation": "Check out the ABP CLI document for more options or select the \"Direct Download\" tab above.", + "SeeCliDocumentForMoreInformation": "Check out the ABP CLI document for more options or select the \"Direct Download\" tab above.", "Optional": "Optional", "LocalFrameworkRef": "Keep the local project reference for the framework packages.", "BlobStoring": "BLOB Storing", From a676ab306760fbc2484db971ccbfe7c1d242e27b Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Wed, 23 Mar 2022 22:40:20 +0300 Subject: [PATCH 056/242] rename GetAuthorsHasBlogPosts as GetAuthorsHasBlogPostsAsync --- .../Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs | 2 +- .../Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs | 2 +- .../ClientProxies/BlogPostPublicClientProxy.Generated.cs | 4 ++-- .../Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs | 4 ++-- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index 7f2b50c2a5..d411869bd2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -13,5 +13,5 @@ public interface IBlogPostPublicAppService : IApplicationService Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); - Task> GetAuthorsHasBlogPosts(); + Task> GetAuthorsHasBlogPostsAsync(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index 12543b0ed4..4d2af29f2d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -46,7 +46,7 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub ObjectMapper.Map, List>(blogPosts)); } - public virtual async Task> GetAuthorsHasBlogPosts() + public virtual async Task> GetAuthorsHasBlogPostsAsync() { var authors = await BlogPostRepository.GetAuthorsHasBlogPosts(); return ObjectMapper.Map, List>(authors); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index 62a79cf6a5..9cc926515d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -35,8 +35,8 @@ public partial class BlogPostPublicClientProxy : ClientProxyBase> GetAuthorsHasBlogPosts() + public virtual async Task> GetAuthorsHasBlogPostsAsync() { - return await RequestAsync>(nameof(GetAuthorsHasBlogPosts)); + return await RequestAsync>(nameof(GetAuthorsHasBlogPostsAsync)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index 6db900c6ad..a08ccdfa95 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -39,8 +39,8 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub } [HttpGet] - public virtual Task> GetAuthorsHasBlogPosts() + public virtual Task> GetAuthorsHasBlogPostsAsync() { - return BlogPostPublicAppService.GetAuthorsHasBlogPosts(); + return BlogPostPublicAppService.GetAuthorsHasBlogPostsAsync(); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index 92c4ff235c..c9dc49931d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -49,6 +49,6 @@ public class IndexModel : CmsKitPublicPageModelBase AuthorId = AuthorId }); - Authors = await BlogPostPublicAppService.GetAuthorsHasBlogPosts(); + Authors = await BlogPostPublicAppService.GetAuthorsHasBlogPostsAsync(); } } From 2e9a25dc0628a55a2af309b28da8d592c5cd2a45 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Wed, 23 Mar 2022 22:42:28 +0300 Subject: [PATCH 057/242] add [NotNullAttribute] --- .../Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs | 2 +- .../Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index d411869bd2..02b6d2a5f4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -9,7 +9,7 @@ namespace Volo.CmsKit.Public.Blogs; public interface IBlogPostPublicAppService : IApplicationService { - Task> GetListAsync(string blogSlug, BlogPostGetListInput input); + Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input); Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index 4d2af29f2d..62a970cf2f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -34,7 +34,7 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub return ObjectMapper.Map(blogPost); } - public virtual async Task> GetListAsync(string blogSlug, BlogPostGetListInput input) + public virtual async Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input) { var blog = await BlogRepository.GetBySlugAsync(blogSlug); From ae27b07a77f8b6157195f11da9be634687c98439 Mon Sep 17 00:00:00 2001 From: Musa Demir <48536631+demirmusa@users.noreply.github.com> Date: Wed, 23 Mar 2022 22:43:17 +0300 Subject: [PATCH 058/242] Update modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs Co-authored-by: Enis Necipoglu --- .../Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index 6db900c6ad..b3ba981b43 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -39,6 +39,7 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub } [HttpGet] + [Route("authors") public virtual Task> GetAuthorsHasBlogPosts() { return BlogPostPublicAppService.GetAuthorsHasBlogPosts(); From 0cd4c2bbf546bf8857e3448871079d554513a863 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Wed, 23 Mar 2022 23:14:53 +0300 Subject: [PATCH 059/242] allow filtering by user for GetCountAsync function --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 2 +- .../Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs | 1 + .../Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs | 2 ++ .../Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs | 2 ++ .../Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs | 2 +- 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index fbea1d81c7..58ea5b9b83 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -92,7 +92,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId, input.MaxResultCount, input.SkipCount, input.Sorting); - var count = await BlogPostRepository.GetCountAsync(input.Filter); + var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId); var dtoList = blogPosts.Select(x => { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index 6e650113d3..fed0eed037 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -12,6 +12,7 @@ public interface IBlogPostRepository : IBasicRepository Task GetCountAsync( string filter = null, Guid? blogId = null, + Guid? authorId = null, CancellationToken cancellationToken = default); Task> GetListAsync( diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index cbd8fa3cfe..cfc39a62c7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -41,10 +41,12 @@ public class EfCoreBlogPostRepository : EfCoreRepository GetCountAsync( string filter = null, Guid? blogId = null, + Guid? authorId = null, CancellationToken cancellationToken = default) { var queryable = (await GetDbSetAsync()) .WhereIf(blogId.HasValue, x => x.BlogId == blogId) + .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) .WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); var count = await queryable.CountAsync(GetCancellationToken(cancellationToken)); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index 3b04f46fb6..5f72246d93 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -42,6 +42,7 @@ public class MongoBlogPostRepository : MongoDbRepository GetCountAsync( string filter = null, Guid? blogId = null, + Guid? authorId = null, CancellationToken cancellationToken = default) { var token = GetCancellationToken(cancellationToken); @@ -49,6 +50,7 @@ public class MongoBlogPostRepository : MongoDbRepository>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) .WhereIf>(blogId.HasValue, x => x.BlogId == blogId) + .WhereIf>(authorId.HasValue, x => x.AuthorId == authorId) .CountAsync(GetCancellationToken(cancellationToken)); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index 62a970cf2f..a9121a5c2b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -42,7 +42,7 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub input.SkipCount, input.Sorting); return new PagedResultDto( - await BlogPostRepository.GetCountAsync(blogId: blog.Id), + await BlogPostRepository.GetCountAsync(blogId: blog.Id, authorId: input.AuthorId), ObjectMapper.Map, List>(blogPosts)); } From 859d7ceb218419a2ab5b789e80e3654f260d2b7c Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Wed, 23 Mar 2022 23:15:12 +0300 Subject: [PATCH 060/242] Test user filter --- .../Blogs/BlogPostPublicAppService_Tests.cs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs index f7a1ad3e7c..64725fc700 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Entities; using Volo.CmsKit.Public.Blogs; +using Volo.CmsKit.Users; using Xunit; namespace Volo.CmsKit.Blogs; @@ -17,10 +18,20 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase private readonly CmsKitTestData cmsKitTestData; + private readonly ICmsUserRepository userRepository; + + private readonly IBlogRepository blogRepository; + private readonly IBlogPostRepository blogPostRepository; + + private readonly BlogPostManager blogPostManager; public BlogPostPublicAppService_Tests() { blogPostAppService = GetRequiredService(); cmsKitTestData = GetRequiredService(); + userRepository = GetRequiredService(); + blogRepository = GetRequiredService(); + blogPostManager = GetRequiredService(); + blogPostRepository = GetRequiredService(); } [Fact] @@ -62,4 +73,49 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase exception.EntityType.ShouldBe(typeof(Blog)); } + + [Fact] + public async Task GetListAsync_ShouldFilterByUser() + { + var user2 = await userRepository.GetAsync(cmsKitTestData.User2Id); + var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id); + + var blogPost = await blogPostManager.CreateAsync( + user2, + blog, + cmsKitTestData.BlogPost_1_Title + "by user2", + cmsKitTestData.BlogPost_1_Slug + "by user2", + "Short desc 1", + "Blog Post 1 Content" + ); + + await blogPostRepository.InsertAsync(blogPost); + + //should get all not filtered by user + var blogPosts = await blogPostAppService.GetListAsync(cmsKitTestData.BlogSlug, + new BlogPostGetListInput {}); + + blogPosts.ShouldNotBeNull(); + blogPosts.TotalCount.ShouldBe(3); + blogPosts.Items.ShouldNotBeEmpty(); + blogPosts.Items.Count.ShouldBe(3); + + //should get only one filtered by user + blogPosts = await blogPostAppService.GetListAsync(cmsKitTestData.BlogSlug, + new BlogPostGetListInput {AuthorId = user2.Id}); + + blogPosts.ShouldNotBeNull(); + blogPosts.TotalCount.ShouldBe(1); + blogPosts.Items.ShouldNotBeEmpty(); + blogPosts.Items.Count.ShouldBe(1); + + //should get filtered by user1 + blogPosts = await blogPostAppService.GetListAsync(cmsKitTestData.BlogSlug, + new BlogPostGetListInput {AuthorId = cmsKitTestData.User1Id}); + + blogPosts.ShouldNotBeNull(); + blogPosts.TotalCount.ShouldBe(2); + blogPosts.Items.ShouldNotBeEmpty(); + blogPosts.Items.Count.ShouldBe(2); + } } From d5dc276f590da9f9ccbdabf60b2173c701ef84fa Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Thu, 24 Mar 2022 17:44:34 +0300 Subject: [PATCH 061/242] unit test added trx --- nupkg/unit_test.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nupkg/unit_test.ps1 b/nupkg/unit_test.ps1 index 6f53d6c738..07cdfe3655 100644 --- a/nupkg/unit_test.ps1 +++ b/nupkg/unit_test.ps1 @@ -4,7 +4,7 @@ foreach($solution in $solutions) { $solutionFolder = Join-Path $rootFolder $solution Set-Location $solutionFolder - dotnet test --no-build + dotnet test --no-build --logger trx -} \ No newline at end of file +} From 9834f1e4182b3029a35f4430dd288cdcf68aba56 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 02:34:50 +0300 Subject: [PATCH 062/242] add status to BlogPost --- .../CmsKit/Admin/Blogs/BlogPostListDto.cs | 3 +++ .../Admin/Blogs/BlogPostAdminAppService.cs | 16 +++++++------ .../Volo/CmsKit/Blogs/BlogPostStatus.cs | 7 ++++++ .../Volo/CmsKit/Blogs/BlogPost.cs | 19 +++++++++++++-- .../Volo/CmsKit/Blogs/BlogPostManager.cs | 24 ++++++++++--------- .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 2 ++ .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 12 ++++++---- 7 files changed, 59 insertions(+), 24 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostListDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostListDto.cs index 0953bf2c00..fc8cbc9e0e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostListDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostListDto.cs @@ -1,6 +1,7 @@ using System; using Volo.Abp.Application.Dtos; using Volo.Abp.Auditing; +using Volo.CmsKit.Blogs; namespace Volo.CmsKit.Admin.Blogs; @@ -24,4 +25,6 @@ public class BlogPostListDto : EntityDto, IHasCreationTime, IHasModificati public DateTime CreationTime { get; set; } public DateTime? LastModificationTime { get; set; } + + public BlogPostStatus? Status { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 58ea5b9b83..9968f6610c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -42,13 +42,15 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe var blog = await BlogRepository.GetAsync(input.BlogId); var blogPost = await BlogPostManager.CreateAsync( - author, - blog, - input.Title, - input.Slug, - input.ShortDescription, - input.Content, - input.CoverImageMediaId); + author, + blog, + input.Title, + input.Slug, + BlogPostStatus.Draft, + input.ShortDescription, + input.Content, + input.CoverImageMediaId + ); await BlogPostRepository.InsertAsync(blogPost); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs new file mode 100644 index 0000000000..e0a2385d7e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs @@ -0,0 +1,7 @@ +namespace Volo.CmsKit.Blogs; + +public enum BlogPostStatus +{ + Draft, + Published +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs index faf6c4bcb6..5116d0a95e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs @@ -29,7 +29,9 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant public Guid AuthorId { get; set; } public virtual CmsUser Author { get; set; } - + + public virtual BlogPostStatus Status { get; set; } + protected BlogPost() { } @@ -43,7 +45,9 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant [CanBeNull] string shortDescription = null, [CanBeNull] string content = null, [CanBeNull] Guid? coverImageMediaId = null, - [CanBeNull] Guid? tenantId = null) : base(id) + [CanBeNull] Guid? tenantId = null, + [CanBeNull] BlogPostStatus? state = null + ) : base(id) { TenantId = tenantId; BlogId = blogId; @@ -53,6 +57,7 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant SetShortDescription(shortDescription); SetContent(content); CoverImageMediaId = coverImageMediaId; + Status = state ?? BlogPostStatus.Draft; } public virtual void SetTitle(string title) @@ -76,4 +81,14 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant { Content = Check.Length(content, nameof(content), BlogPostConsts.MaxContentLength); } + + public virtual void SetDraft() + { + Status = BlogPostStatus.Draft; + } + + public virtual void SetPublished() + { + Status = BlogPostStatus.Published; + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs index a19643308d..9e21078707 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs @@ -30,6 +30,7 @@ public class BlogPostManager : DomainService [NotNull] Blog blog, [NotNull] string title, [NotNull] string slug, + [NotNull] BlogPostStatus status, [CanBeNull] string shortDescription = null, [CanBeNull] string content = null, [CanBeNull] Guid? coverImageMediaId = null) @@ -40,17 +41,18 @@ public class BlogPostManager : DomainService Check.NotNullOrEmpty(slug, nameof(slug)); var blogPost = new BlogPost( - GuidGenerator.Create(), - blog.Id, - author.Id, - title, - slug, - shortDescription, - content, - coverImageMediaId, - CurrentTenant.Id - ); - + GuidGenerator.Create(), + blog.Id, + author.Id, + title, + slug, + shortDescription, + content, + coverImageMediaId, + CurrentTenant.Id, + status + ); + await CheckSlugExistenceAsync(blog.Id, blogPost.Slug); return blogPost; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index fed0eed037..d73512a204 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -13,12 +13,14 @@ public interface IBlogPostRepository : IBasicRepository string filter = null, Guid? blogId = null, Guid? authorId = null, + BlogPostStatus? statusFilter = null, CancellationToken cancellationToken = default); Task> GetListAsync( string filter = null, Guid? blogId = null, Guid? authorId = null, + BlogPostStatus? statusFilter = null, int maxResultCount = int.MaxValue, int skipCount = 0, string sorting = null, diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index cfc39a62c7..cc78ffa698 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -42,12 +42,14 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.BlogId == blogId) - .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) - .WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); + .WhereIf(blogId.HasValue, x => x.BlogId == blogId) + .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) + .WhereIf(statusFilter.HasValue, x => x.Status == statusFilter) + .WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); var count = await queryable.CountAsync(GetCancellationToken(cancellationToken)); return count; @@ -57,6 +59,7 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.BlogId == blogId) .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) - .WhereIf(authorId.HasValue, x => x.AuthorId == authorId); + .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) + .WhereIf(statusFilter.HasValue, x => x.Status == statusFilter); queryable = queryable.OrderBy(sorting.IsNullOrEmpty() ? $"{nameof(BlogPost.CreationTime)} desc" : sorting); From c756673a26e00204e86e85fd28d1209c97bfe757 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 02:35:36 +0300 Subject: [PATCH 063/242] add migration --- ...324203918_Added_BlogPostStatus.Designer.cs | 2118 +++++++++++++++++ .../20220324203918_Added_BlogPostStatus.cs | 26 + .../UnifiedDbContextModelSnapshot.cs | 3 + 3 files changed, 2147 insertions(+) create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.Designer.cs create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.Designer.cs new file mode 100644 index 0000000000..d04ca4c0ed --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.Designer.cs @@ -0,0 +1,2118 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +#nullable disable + +namespace Volo.CmsKit.Migrations +{ + [DbContext(typeof(UnifiedDbContext))] + [Migration("20220324203918_Added_BlogPostStatus")] + partial class Added_BlogPostStatus + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContainerId") + .HasColumnType("uniqueidentifier"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("varbinary(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("ContainerId"); + + b.HasIndex("TenantId", "ContainerId", "Name"); + + b.ToTable("AbpBlobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AbpBlobContainers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.Blog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Slug") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("CmsBlogs", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogFeature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("BlogId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("FeatureName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.HasKey("Id"); + + b.ToTable("CmsBlogFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorId") + .HasColumnType("uniqueidentifier"); + + b.Property("BlogId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("nvarchar(max)"); + + b.Property("CoverImageMediaId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ShortDescription") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Slug") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.HasIndex("Slug", "BlogId"); + + b.ToTable("CmsBlogPosts", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Comments.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("RepliedCommentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Text") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "RepliedCommentId"); + + b.HasIndex("TenantId", "EntityType", "EntityId"); + + b.ToTable("CmsComments", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.GlobalResources.GlobalResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2147483647) + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CmsGlobalResources", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.MediaDescriptors.MediaDescriptor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("MimeType") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Size") + .HasMaxLength(2147483647) + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("CmsMediaDescriptors", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Menus.MenuItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CssClass") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ElementId") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Icon") + .HasColumnType("nvarchar(max)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("PageId") + .HasColumnType("uniqueidentifier"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("Target") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("Id"); + + b.ToTable("CmsMenuItems", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Pages.Page", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .HasMaxLength(2147483647) + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Script") + .HasColumnType("nvarchar(max)"); + + b.Property("Slug") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Style") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Slug"); + + b.ToTable("CmsPages", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Ratings.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("StarCount") + .HasColumnType("smallint"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "EntityType", "EntityId", "CreatorId"); + + b.ToTable("CmsRatings", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Reactions.UserReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ReactionName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "EntityType", "EntityId", "ReactionName"); + + b.HasIndex("TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName"); + + b.ToTable("CmsUserReactions", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Tags.EntityTag", b => + { + b.Property("EntityId") + .HasColumnType("nvarchar(450)"); + + b.Property("TagId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("EntityId", "TagId"); + + b.HasIndex("TenantId", "EntityId", "TagId"); + + b.ToTable("CmsEntityTags", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Tags.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("CmsTags", (string)null); + }); + + modelBuilder.Entity("Volo.CmsKit.Users.CmsUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Email"); + + b.HasIndex("TenantId", "UserName"); + + b.ToTable("CmsUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => + { + b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null) + .WithMany() + .HasForeignKey("ContainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.CmsKit.Blogs.BlogPost", b => + { + b.HasOne("Volo.CmsKit.Users.CmsUser", "Author") + .WithMany() + .HasForeignKey("AuthorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.cs new file mode 100644 index 0000000000..8624383a73 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Volo.CmsKit.Migrations +{ + public partial class Added_BlogPostStatus : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Status", + table: "CmsBlogPosts", + type: "int", + nullable: false, + defaultValue: 0); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Status", + table: "CmsBlogPosts"); + } + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 29bd29f91c..3299179fcb 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -1341,6 +1341,9 @@ namespace Volo.CmsKit.Migrations .HasMaxLength(256) .HasColumnType("nvarchar(256)"); + b.Property("Status") + .HasColumnType("int"); + b.Property("TenantId") .HasColumnType("uniqueidentifier") .HasColumnName("TenantId"); From 5697171ee1a672cfc99304df5e77f44423d0e29a Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 02:39:31 +0300 Subject: [PATCH 064/242] add publish --- .../Admin/Blogs/BlogPostGetListInput.cs | 7 ++-- .../Admin/Blogs/IBlogPostAdminAppService.cs | 3 ++ ...CmsKitAdminPermissionDefinitionProvider.cs | 2 ++ .../Permissions/CmsKitAdminPermissions.cs | 1 + .../Admin/Blogs/BlogPostAdminAppService.cs | 11 ++++++- .../BlogPostAdminClientProxy.Generated.cs | 9 +++++ .../Admin/Blogs/BlogPostAdminController.cs | 9 +++++ .../Pages/CmsKit/BlogPosts/Create.cshtml | 11 +++++-- .../Pages/CmsKit/BlogPosts/Create.cshtml.cs | 16 +++++++-- .../Pages/CmsKit/BlogPosts/create.js | 21 ++++++++++++ .../Pages/CmsKit/BlogPosts/index.js | 33 +++++++++++++++++-- .../client-proxies/cms-kit-admin-proxy.js | 10 +++++- .../CmsKit/Localization/Resources/en.json | 9 ++++- .../CmsKit/Localization/Resources/tr.json | 9 ++++- .../MongoDB/Blogs/MongoBlogPostRepository.cs | 7 ++-- .../Public/Blogs/BlogPostPublicAppService.cs | 2 +- .../CmsKitDataSeedContributor.cs | 2 ++ 17 files changed, 147 insertions(+), 15 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs index 3b2d4c2c93..f136fe6562 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs @@ -1,5 +1,6 @@ using System; using Volo.Abp.Application.Dtos; +using Volo.CmsKit.Blogs; namespace Volo.CmsKit.Admin.Blogs; @@ -8,6 +9,8 @@ public class BlogPostGetListInput : PagedAndSortedResultRequestDto public string Filter { get; set; } public Guid? BlogId { get; set; } - + public Guid? AuthorId { get; set; } -} + + public BlogPostStatus? Status { get; set; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index 314b7a1def..06617fea37 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Volo.Abp.Application.Services; namespace Volo.CmsKit.Admin.Blogs; @@ -12,4 +13,6 @@ public interface IBlogPostAdminAppService CreateBlogPostDto, UpdateBlogPostDto> { + Task PublishAsync(Guid id); + } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs index eb733cc36f..b89b38d43a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs @@ -55,6 +55,8 @@ public class CmsKitAdminPermissionDefinitionProvider : PermissionDefinitionProvi .RequireGlobalFeatures(typeof(BlogsFeature)); blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete")) .RequireGlobalFeatures(typeof(BlogsFeature)); + blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Publish, L("Permission:BlogPostManagement.Publish")) + .RequireGlobalFeatures(typeof(BlogsFeature)); var menuManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Menus.Default, L("Permission:MenuManagement")) .RequireGlobalFeatures(typeof(MenuFeature)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs index 49fa7c8ffc..b5d2a8eaa6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs @@ -51,6 +51,7 @@ public class CmsKitAdminPermissions public const string Create = Default + ".Create"; public const string Update = Default + ".Update"; public const string Delete = Default + ".Delete"; + public const string Publish = Default + ".Publish"; } public static class Menus diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 9968f6610c..ed3d7693a3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -92,6 +92,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe var blogs = (await BlogRepository.GetListAsync()).ToDictionary(x => x.Id); var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId, + statusFilter: input.Status, input.MaxResultCount, input.SkipCount, input.Sorting); var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId); @@ -112,4 +113,12 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { await BlogPostRepository.DeleteAsync(id); } -} + + [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] + public virtual async Task PublishAsync(Guid id) + { + var blogPost = await BlogPostRepository.GetAsync(id); + blogPost.SetPublished(); + } + +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index 560ba4e2de..93e16e3172 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -55,4 +55,13 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase
+
@@ -84,6 +87,10 @@ - + + @if ((await AuthorizationService.AuthorizeAsync(CmsKitAdminPermissions.BlogPosts.Publish)).Succeeded) + { + + } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs index 08d4d24b37..3e0fcd30b0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs @@ -31,9 +31,17 @@ public class CreateModel : CmsKitAdminPageModel { var dto = ObjectMapper.Map(ViewModel); - var created = await BlogPostAdminAppService.CreateAsync(dto); + BlogPostDto createResult; + if (ViewModel.Status == BlogPostStatus.Published) + { + createResult = await BlogPostAdminAppService.CreateAndPublishAsync(dto); + } + else + { + createResult = await BlogPostAdminAppService.CreateAsync(dto); + } - return new OkObjectResult(created); + return new OkObjectResult(createResult); } [AutoMap(typeof(CreateBlogPostDto), ReverseMap = true)] @@ -65,5 +73,9 @@ public class CreateModel : CmsKitAdminPageModel [HiddenInput] public Guid? CoverImageMediaId { get; set; } + + [HiddenInput] + [DynamicFormIgnore] + public BlogPostStatus Status { get; set; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js index eba7f51654..b94e8b2353 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js @@ -2,13 +2,20 @@ $(function () { var l = abp.localization.getResource("CmsKit"); + var blogPostStatus = { + Draft: 0, + Published: 1 + }; + var $selectBlog = $('#BlogSelectionSelect'); var $formCreate = $('#form-blog-post-create'); var $title = $('#ViewModel_Title'); var $shortDescription = $('#ViewModel_ShortDescription'); var $coverImage = $('#ViewModel_CoverImageMediaId'); var $url = $('#ViewModel_Slug'); + var $status = $('#ViewModel_Status'); var $buttonSubmit = $('#button-blog-post-create'); + var $buttonPublish = $('#button-blog-post-publish'); var $pageContentInput = $('#ViewModel_Content'); var $tagsInput = $('.tag-editor-form input[name=tags]'); var $fileInput = $('#BlogPostCoverImage'); @@ -59,9 +66,23 @@ $(function () { $buttonSubmit.click(function (e) { e.preventDefault(); + $status.val(blogPostStatus.Draft); submitCoverImage(); }); + $buttonPublish.click(function (e) { + abp.message.confirm( + l('BlogPostPublishConfirmationMessage', $title.val()), + function (isConfirmed) { + if (isConfirmed) { + e.preventDefault(); + $status.val(blogPostStatus.Published); + submitCoverImage(); + } + } + ); + }); + function submitEntityTags(blogPostId) { var tags = $tagsInput.val().split(',').map(x => x.trim()).filter(x => x); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js index 60d0de3cb5..9f3402d23a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js @@ -1,7 +1,11 @@ $(function () { var l = abp.localization.getResource("CmsKit"); - + var blogPostStatus = { + Draft: 0, + Published: 1 + }; + var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; var getFilter = function () { @@ -33,6 +37,23 @@ $(function () { location.href = "BlogPosts/Update/" + data.record.id } }, + { + text: l('Publish'), + visible: function(data) { + return data?.status !== blogPostStatus.Published && abp.auth.isGranted('CmsKit.BlogPosts.Publish'); + }, + confirmMessage: function (data) { + return l("BlogPostPublishConfirmationMessage", data.record.title) + }, + action: function (data) { + blogsService + .publish(data.record.id) + .then(function () { + dataTable.ajax.reload(); + abp.notify.success(l('SuccessfullyPublished')); + }); + } + }, { text: l('Delete'), visible: abp.auth.isGranted('CmsKit.BlogPosts.Delete'), @@ -71,7 +92,15 @@ $(function () { orderable: true, data: 'creationTime', dataFormat: "datetime" - } + }, + { + title: l("Status"), + orderable: true, + data: "status", + render: function (data) { + return l("CmsKit.BlogPost.Status." + data); + } + }, ] })); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 0a1424d92a..f4c08efff2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -378,7 +378,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.getList = function(input, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'authorId', value: input.authorId }, { name: 'status', value: input.status }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', type: 'GET' }, ajaxParams)); }; @@ -391,6 +391,14 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.publish = function(id, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/publish/' + id + '', + type: 'POST', + dataType: null + }, ajaxParams)); + }; + })(); })(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 0dd826480d..9e8bb49d2e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -85,6 +85,7 @@ "Permission:BlogPostManagement.Create": "Create", "Permission:BlogPostManagement.Delete": "Delete", "Permission:BlogPostManagement.Update": "Update", + "Permission:BlogPostManagement.Publish": "Publish", "Permission:CmsKit": "CmsKit", "Permission:Comments": "Comment Management", "Permission:Comments.Delete": "Delete", @@ -164,6 +165,12 @@ "GlobalResources": "Global Resources", "Script": "Script", "Style": "Style", - "SavedSuccessfully": "Saved successfully" + "SavedSuccessfully": "Saved successfully", + "CmsKit.BlogPost.Status.0": "Draft", + "CmsKit.BlogPost.Status.1": "Published", + "BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?", + "SuccessfullyPublished": "Successfully published!", + "Draft": "Draft", + "Publish": "Publish", } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 95ef414c17..e1367ab204 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -85,6 +85,7 @@ "Permission:BlogPostManagement.Create": "Oluşturma", "Permission:BlogPostManagement.Delete": "Silme", "Permission:BlogPostManagement.Update": "Güncelleme", + "Permission:BlogPostManagement.Publish": "Yayınlama", "Permission:CmsKit": "CmsKit", "Permission:Comments": "Yorum Yönetimi", "Permission:Comments.Delete": "Silmek", @@ -163,6 +164,12 @@ "GlobalResources": "Global Kaynaklar", "Script": "Script", "Style": "Style", - "SavedSuccessfully": "Başarıyla kaydedildi" + "SavedSuccessfully": "Başarıyla kaydedildi", + "CmsKit.BlogPost.Status.0": "Taslak", + "CmsKit.BlogPost.Status.1": "Yayınlandı", + "BlogPostPublishConfirmationMessage": "\"{0}\" başlıklı gönderiyi yayınlamak istediğinize emin misiniz?", + "SuccessfullyPublished": "Başarıyla yayınlandı", + "Draft": "Taslak olarak kaydet", + "Publish": "Yayınla", } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index 1db7fee75e..65a8bf9c13 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -43,6 +43,7 @@ public class MongoBlogPostRepository : MongoDbRepository>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) .WhereIf>(blogId.HasValue, x => x.BlogId == blogId) .WhereIf>(authorId.HasValue, x => x.AuthorId == authorId) + .WhereIf>(statusFilter.HasValue, x => x.Status == statusFilter) .CountAsync(cancellationToken); - } public virtual async Task> GetListAsync( string filter = null, Guid? blogId = null, Guid? authorId = null, + BlogPostStatus? statusFilter = null, int maxResultCount = int.MaxValue, int skipCount = 0, string sorting = null, @@ -73,7 +75,8 @@ public class MongoBlogPostRepository : MongoDbRepository x.BlogId == blogId) .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) - .WhereIf(authorId.HasValue, x => x.AuthorId == authorId); + .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) + .WhereIf(statusFilter.HasValue, x => x.Status == statusFilter); queryable = queryable.OrderBy(sorting.IsNullOrEmpty() ? $"{nameof(BlogPost.CreationTime)} desc" : sorting); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index a9121a5c2b..76232c69a3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -38,7 +38,7 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub { var blog = await BlogRepository.GetBySlugAsync(blogSlug); - var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, input.MaxResultCount, + var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, BlogPostStatus.Published, input.MaxResultCount, input.SkipCount, input.Sorting); return new PagedResultDto( diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 13414b4573..af5ee0754a 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -367,6 +367,7 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende blog, _cmsKitTestData.BlogPost_1_Title, _cmsKitTestData.BlogPost_1_Slug, + BlogPostStatus.Published, "Short desc 1", "Blog Post 1 Content"))).Id; @@ -377,6 +378,7 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende blog, _cmsKitTestData.BlogPost_2_Title, _cmsKitTestData.BlogPost_2_Slug, + BlogPostStatus.Published, "Short desc 2", "Blog Post 2 Content"))).Id; } From 6b4dcecb6695db7f4a4b492ab152301328aa18a2 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 02:40:18 +0300 Subject: [PATCH 065/242] add create and publish --- .../CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs | 2 ++ .../Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 10 ++++++++++ .../BlogPostAdminClientProxy.Generated.cs | 7 +++++++ .../Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs | 8 ++++++++ .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 8 ++++++++ 5 files changed, 35 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index 06617fea37..d90d5211c4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -15,4 +15,6 @@ public interface IBlogPostAdminAppService { Task PublishAsync(Guid id); + + Task CreateAndPublishAsync(CreateBlogPostDto input); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index ed3d7693a3..d666b8e5d6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -121,4 +121,14 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.SetPublished(); } + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] + public virtual async Task CreateAndPublishAsync(CreateBlogPostDto input) + { + var blogPost = await CreateAsync(input); + await CurrentUnitOfWork.SaveChangesAsync(); + + await PublishAsync(blogPost.Id); + return blogPost; + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index 93e16e3172..b0d733cc8c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -64,4 +64,11 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase CreateAndPublishAsync(CreateBlogPostDto input) + { + return await RequestAsync(nameof(CreateAndPublishAsync), new ClientProxyRequestTypeValue + { + { typeof(CreateBlogPostDto), input } + }); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index f7304a5613..eedd8e5074 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -70,4 +70,12 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS return BlogPostAdminAppService.PublishAsync(id); } + [HttpPost] + [Route("createandpublish")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] + public virtual Task CreateAndPublishAsync(CreateBlogPostDto input) + { + return BlogPostAdminAppService.CreateAndPublishAsync(input); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index f4c08efff2..7513ae8956 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -399,6 +399,14 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.createAndPublish = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/createandpublish', + type: 'POST', + data: JSON.stringify(input) + }, ajaxParams)); + }; + })(); })(); From 425beff41db63833b4ad2f3078e385c8d92a14a8 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 02:42:11 +0300 Subject: [PATCH 066/242] add draft --- .../Admin/Blogs/IBlogPostAdminAppService.cs | 1 + .../Admin/Blogs/BlogPostAdminAppService.cs | 7 +++++++ .../BlogPostAdminClientProxy.Generated.cs | 8 ++++++++ .../Admin/Blogs/BlogPostAdminController.cs | 8 ++++++++ .../Pages/CmsKit/BlogPosts/index.js | 17 +++++++++++++++++ .../client-proxies/cms-kit-admin-proxy.js | 8 ++++++++ .../Volo/CmsKit/Localization/Resources/en.json | 1 + .../Volo/CmsKit/Localization/Resources/tr.json | 1 + 8 files changed, 51 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index d90d5211c4..d8f74d6d66 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -15,6 +15,7 @@ public interface IBlogPostAdminAppService { Task PublishAsync(Guid id); + Task DraftAsync(Guid id); Task CreateAndPublishAsync(CreateBlogPostDto input); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index d666b8e5d6..2635935efe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -121,6 +121,13 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.SetPublished(); } + [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] + public virtual async Task DraftAsync(Guid id) + { + var blogPost = await BlogPostRepository.GetAsync(id); + blogPost.SetDraft(); + } + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] public virtual async Task CreateAndPublishAsync(CreateBlogPostDto input) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index b0d733cc8c..25d8bcf9fd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -64,6 +64,14 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase CreateAndPublishAsync(CreateBlogPostDto input) { return await RequestAsync(nameof(CreateAndPublishAsync), new ClientProxyRequestTypeValue diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index eedd8e5074..ccc2e4fd25 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -70,6 +70,14 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS return BlogPostAdminAppService.PublishAsync(id); } + [HttpPost] + [Route("draft/{id}")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] + public virtual Task DraftAsync(Guid id) + { + return BlogPostAdminAppService.DraftAsync(id); + } + [HttpPost] [Route("createandpublish")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js index 9f3402d23a..8b941f84b5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js @@ -54,6 +54,23 @@ $(function () { }); } }, + { + text: l('Draft'), + visible: function(data) { + return data?.status !== blogPostStatus.Draft && abp.auth.isGranted('CmsKit.BlogPosts.Update'); + }, + confirmMessage: function (data) { + return l("BlogPostDraftConfirmationMessage", data.record.title) + }, + action: function (data) { + blogsService + .draft(data.record.id) + .then(function () { + dataTable.ajax.reload(); + abp.notify.success(l('SuccessfullySaved')); + }); + } + }, { text: l('Delete'), visible: abp.auth.isGranted('CmsKit.BlogPosts.Delete'), diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 7513ae8956..aafdf7d245 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -399,6 +399,14 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.draft = function(id, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/draft/' + id + '', + type: 'POST', + dataType: null + }, ajaxParams)); + }; + volo.cmsKit.admin.blogs.blogPostAdmin.createAndPublish = function(input, ajaxParams) { return abp.ajax($.extend(true, { url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/createandpublish', diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 9e8bb49d2e..1083826bf7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -172,5 +172,6 @@ "SuccessfullyPublished": "Successfully published!", "Draft": "Draft", "Publish": "Publish", + "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index e1367ab204..67ca5eeafd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -171,5 +171,6 @@ "SuccessfullyPublished": "Başarıyla yayınlandı", "Draft": "Taslak olarak kaydet", "Publish": "Yayınla", + "BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?" } } From 4a78cc14b5c0bb6abca19bb4cbe60e212b4cd9e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 25 Mar 2022 09:37:39 +0300 Subject: [PATCH 067/242] Update discord server link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d7b7e51a7..ebba20da41 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Love ABP Framework? **Please give a star** to this repository :star: ## Discord Channel -You can use this link to join the ABP Community Discord Server: https://discord.gg/uVGt6hyhcm +You can use this link to join the ABP Community Discord Server: https://discord.gg/abp ## ABP Commercial From dca9f2965bcca342c226dc8a6cc302ee311aa76c Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 25 Mar 2022 09:45:29 +0300 Subject: [PATCH 068/242] Add new localizations for admin website --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 023a4b18ed..9f8e88f180 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -380,6 +380,7 @@ "PurchaseItems": "Purchase Items", "SuccessfullyUpdated": "Successfully updated", "SuccessfullyAdded": "Successfully added", - "PurchaseState": "Purchase State" + "PurchaseState": "Purchase State", + "ShowBetweenDayCount": "Show Between Days" } } \ No newline at end of file From c24446f7b7a975c2c95ced6b07816f16a134ebfa Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 10:06:43 +0300 Subject: [PATCH 069/242] Add BlogPostStatus to BlogPostDto --- .../Volo/CmsKit/Admin/Blogs/BlogPostDto.cs | 3 +++ .../Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 1 + 2 files changed, 4 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs index 6ea2fddd90..3e109a9eed 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs @@ -2,6 +2,7 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; +using Volo.CmsKit.Blogs; namespace Volo.CmsKit.Admin.Blogs; @@ -25,4 +26,6 @@ public class BlogPostDto : EntityDto, IHasCreationTime, IHasModificationTi public DateTime? LastModificationTime { get; set; } public string ConcurrencyStamp { get; set; } + + public BlogPostStatus Status { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 2635935efe..7e1c11bbcd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -136,6 +136,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe await CurrentUnitOfWork.SaveChangesAsync(); await PublishAsync(blogPost.Id); + blogPost.Status = BlogPostStatus.Published; return blogPost; } } \ No newline at end of file From e7928ff76acfa3bc2908db7c73c244eb62645e1a Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 10:07:47 +0300 Subject: [PATCH 070/242] Use status filter in GetCountAsync method in public blog post GetAllListAsync --- .../Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index 76232c69a3..aa893f41c8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -42,7 +42,7 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub input.SkipCount, input.Sorting); return new PagedResultDto( - await BlogPostRepository.GetCountAsync(blogId: blog.Id, authorId: input.AuthorId), + await BlogPostRepository.GetCountAsync(blogId: blog.Id, statusFilter: BlogPostStatus.Published, authorId: input.AuthorId), ObjectMapper.Map, List>(blogPosts)); } From 0b282f88ac12091e1c205256c22dc7222e08ef1f Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 10:09:12 +0300 Subject: [PATCH 071/242] fix tests --- .../Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs index 40f552dfdb..5120138282 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs @@ -41,7 +41,7 @@ public class BlogPostManager_Tests : CmsKitDomainTestBase var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id); - var blogPost = await blogPostManager.CreateAsync(author, blog, title, slug); + var blogPost = await blogPostManager.CreateAsync(author, blog, title, slug, BlogPostStatus.Published); blogPost.Id.ShouldNotBe(Guid.Empty); blogPost.Title.ShouldBe(title); @@ -57,7 +57,7 @@ public class BlogPostManager_Tests : CmsKitDomainTestBase var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id); await Should.ThrowAsync(async () => - await blogPostManager.CreateAsync(author, blog, "Any New Title", cmsKitTestData.BlogPost_1_Slug)); + await blogPostManager.CreateAsync(author, blog, "Any New Title", cmsKitTestData.BlogPost_1_Slug, BlogPostStatus.Published)); } [Fact] From 39239d7c5e983f0bcfba359d8b81f960bbcee82e Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 10:13:13 +0300 Subject: [PATCH 072/242] add tests --- .../Blogs/BlogPostAdminAppService_Tests.cs | 82 ++++++++++++ .../Blogs/BlogPostPublicAppService_Tests.cs | 61 +++++++++ .../Blogs/BlogPostRepository_Test.cs | 121 +++++++++++++++++- 3 files changed, 263 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs index 1910e3b925..bc5d6b2a5e 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs @@ -156,4 +156,86 @@ public class BlogPostAdminAppService_Tests : CmsKitApplicationTestBase exception.EntityType.ShouldBe(typeof(BlogPost)); exception.Id.ShouldBe(cmsKitTestData.Page_2_Id); } + + [Fact] + public async Task PublishAsync_ShouldWorkProperly() + { + var newPost = await CreateBlogPost(); + newPost.Status.ShouldBe(BlogPostStatus.Draft); + + await blogPostAdminAppService.PublishAsync(newPost.Id); + var post = await blogPostAdminAppService.GetAsync(newPost.Id); + post.Status.ShouldBe(BlogPostStatus.Published); + } + + [Fact] + public async Task DraftAsync_ShouldWorkProperly() + { + var newPost = await CreateBlogPost(); + newPost.Status.ShouldBe(BlogPostStatus.Draft); + + await blogPostAdminAppService.PublishAsync(newPost.Id); + var post = await blogPostAdminAppService.GetAsync(newPost.Id); + post.Status.ShouldBe(BlogPostStatus.Published); + + await blogPostAdminAppService.DraftAsync(newPost.Id); + post = await blogPostAdminAppService.GetAsync(newPost.Id); + post.Status.ShouldBe(BlogPostStatus.Draft); + } + + [Fact] + public async Task CreateAndPublishAsync_ShouldWorkProperly() + { + var title = "My awesome new Post"; + var slug = "my-awesome-new-post"; + var shortDescription = "This blog is all about awesomeness 🤗!"; + var content = "Another blog post shared on internet"; + + var created = await blogPostAdminAppService.CreateAndPublishAsync(new CreateBlogPostDto + { + BlogId = cmsKitTestData.Blog_Id, + Title = title, + Slug = slug, + ShortDescription = shortDescription, + Content = content + }); + + created.Id.ShouldNotBe(Guid.Empty); + created.Status.ShouldBe(BlogPostStatus.Published); + + var blogPost = await blogPostRepository.GetAsync(created.Id); + + blogPost.Title.ShouldBe(title); + blogPost.Slug.ShouldBe(slug); + blogPost.ShortDescription.ShouldBe(shortDescription); + blogPost.Content.ShouldBe(content); + blogPost.Status.ShouldBe(BlogPostStatus.Published); + } + + private async Task CreateBlogPost() + { + var title = "My awesome new Post"; + var slug = "my-awesome-new-post"; + var shortDescription = "This blog is all about awesomeness 🤗!"; + var content = "Another blog post shared on internet"; + + var created = await blogPostAdminAppService.CreateAsync(new CreateBlogPostDto + { + BlogId = cmsKitTestData.Blog_Id, + Title = title, + Slug = slug, + ShortDescription = shortDescription, + Content = content + }); + + created.Id.ShouldNotBe(Guid.Empty); + + var blogPost = await blogPostRepository.GetAsync(created.Id); + + blogPost.Title.ShouldBe(title); + blogPost.Slug.ShouldBe(slug); + blogPost.ShortDescription.ShouldBe(shortDescription); + blogPost.Content.ShouldBe(content); + return created; + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs index 64725fc700..677e1ac086 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs @@ -85,6 +85,7 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase blog, cmsKitTestData.BlogPost_1_Title + "by user2", cmsKitTestData.BlogPost_1_Slug + "by user2", + BlogPostStatus.Published, "Short desc 1", "Blog Post 1 Content" ); @@ -118,4 +119,64 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase blogPosts.Items.ShouldNotBeEmpty(); blogPosts.Items.Count.ShouldBe(2); } + + [Fact] + public async Task GetListAsync_ShouldNotGet_UnPublishedItems() + { + var user2 = await userRepository.GetAsync(cmsKitTestData.User2Id); + var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id); + + var draftBlogPost1 = await blogPostManager.CreateAsync( + user2, + blog, + cmsKitTestData.BlogPost_1_Title + "draft1", + cmsKitTestData.BlogPost_1_Slug + "draft1", + BlogPostStatus.Draft, + "Short desc 1", + "Blog Post 1 Content" + ); + + var draftBlogPost2 = await blogPostManager.CreateAsync( + user2, + blog, + cmsKitTestData.BlogPost_1_Title + "draft2", + cmsKitTestData.BlogPost_1_Slug + "draft2", + BlogPostStatus.Draft, + "Short desc 1", + "Blog Post 1 Content" + ); + + var publishedBlogPost1 = await blogPostManager.CreateAsync( + user2, + blog, + cmsKitTestData.BlogPost_1_Title + "published1", + cmsKitTestData.BlogPost_1_Slug + "published1", + BlogPostStatus.Published, + "Short desc 1", + "Blog Post 1 Content" + ); + + await blogPostRepository.InsertAsync(draftBlogPost1); + await blogPostRepository.InsertAsync(draftBlogPost2); + await blogPostRepository.InsertAsync(publishedBlogPost1); + + //should get all not filtered by user + var blogPosts = await blogPostAppService.GetListAsync(cmsKitTestData.BlogSlug, + new BlogPostGetListInput {}); + + blogPosts.ShouldNotBeNull(); + blogPosts.TotalCount.ShouldBe(3); + blogPosts.Items.ShouldNotBeEmpty(); + blogPosts.Items.Count.ShouldBe(3); + blogPosts.Items.Any(x => x.Id == draftBlogPost1.Id).ShouldBeFalse(); + blogPosts.Items.Any(x => x.Id == draftBlogPost2.Id).ShouldBeFalse(); + blogPosts.Items.Any(x => x.Id == publishedBlogPost1.Id).ShouldBeTrue(); + + var allItemsFromRepository = await blogPostRepository.GetListAsync(); + allItemsFromRepository.ShouldNotBeNull(); + allItemsFromRepository.Count.ShouldBe(5);//3 new added 2 already existing + allItemsFromRepository.Any(x => x.Id == draftBlogPost1.Id).ShouldBeTrue(); + allItemsFromRepository.Any(x => x.Id == draftBlogPost2.Id).ShouldBeTrue(); + allItemsFromRepository.Any(x => x.Id == publishedBlogPost1.Id).ShouldBeTrue(); + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs index 4d696e916d..37ec33b83c 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; using Volo.Abp.Domain.Entities; using Volo.Abp.Modularity; +using Volo.CmsKit.Users; using Xunit; namespace Volo.CmsKit.Blogs; @@ -15,11 +16,16 @@ public abstract class BlogPostRepository_Test : CmsKitTestBase(); blogPostRepository = GetRequiredService(); + blogPostManager = GetRequiredService(); + userRepository = GetRequiredService(); + blogRepository = GetRequiredService(); } [Fact] @@ -155,4 +161,117 @@ public abstract class BlogPostRepository_Test : CmsKitTestBase x.Id == testData.User1Id); } + + [Fact] + public async Task ShouldCreateItem_WithDraftStatus() + { + var user2 = await userRepository.GetAsync(testData.User2Id); + var blog = await blogRepository.GetAsync(testData.Blog_Id); + + var draftPost = await blogPostManager.CreateAsync( + user2, + blog, + testData.BlogPost_1_Title + "draft", + testData.BlogPost_1_Slug + "draft", + BlogPostStatus.Draft, + "Short desc 1", + "Blog Post 1 Content" + ); + + + await blogPostRepository.InsertAsync(draftPost); + + var draftPostFromDb = await blogPostRepository.GetAsync(draftPost.Id); + + draftPostFromDb.Title.ShouldBe(draftPost.Title); + draftPostFromDb.Slug.ShouldBe(draftPost.Slug); + draftPostFromDb.ShortDescription.ShouldBe(draftPost.ShortDescription); + draftPostFromDb.Content.ShouldBe(draftPost.Content); + draftPostFromDb.Status.ShouldBe(BlogPostStatus.Draft); + } + + [Fact] + public async Task ShouldCreateItem_WithPublishedStatus() + { + var user2 = await userRepository.GetAsync(testData.User2Id); + var blog = await blogRepository.GetAsync(testData.Blog_Id); + + var publishedPost = await blogPostManager.CreateAsync( + user2, + blog, + testData.BlogPost_1_Title + "published", + testData.BlogPost_1_Slug + "published", + BlogPostStatus.Published, + "Short desc 1", + "Blog Post 1 Content" + ); + + await blogPostRepository.InsertAsync(publishedPost); + + var publishedPostFromDb = await blogPostRepository.GetAsync(publishedPost.Id); + + publishedPostFromDb.Title.ShouldBe(publishedPost.Title); + publishedPostFromDb.Slug.ShouldBe(publishedPost.Slug); + publishedPostFromDb.ShortDescription.ShouldBe(publishedPost.ShortDescription); + publishedPostFromDb.Content.ShouldBe(publishedPost.Content); + publishedPostFromDb.Status.ShouldBe(BlogPostStatus.Published); + } + + [Fact] + public async Task GetListAsync_ShouldFilter_ByStatus() + { + var user2 = await userRepository.GetAsync(testData.User2Id); + var blog = await blogRepository.GetAsync(testData.Blog_Id); + + var draftPost = await blogPostManager.CreateAsync( + user2, + blog, + testData.BlogPost_1_Title + "draft", + testData.BlogPost_1_Slug + "draft", + BlogPostStatus.Draft, + "Short desc 1", + "Blog Post 1 Content" + ); + + var publishedPost = await blogPostManager.CreateAsync( + user2, + blog, + testData.BlogPost_1_Title + "published", + testData.BlogPost_1_Slug + "published", + BlogPostStatus.Published, + "Short desc 1", + "Blog Post 1 Content" + ); + + await blogPostRepository.InsertAsync(draftPost); + await blogPostRepository.InsertAsync(publishedPost); + + var draftPostFromDb = await blogPostRepository.GetAsync(draftPost.Id); + + draftPostFromDb.Title.ShouldBe(draftPost.Title); + draftPostFromDb.Slug.ShouldBe(draftPost.Slug); + draftPostFromDb.ShortDescription.ShouldBe(draftPost.ShortDescription); + draftPostFromDb.Content.ShouldBe(draftPost.Content); + draftPostFromDb.Status.ShouldBe(BlogPostStatus.Draft); + + var publishedPostFromDb = await blogPostRepository.GetAsync(publishedPost.Id); + + publishedPostFromDb.Title.ShouldBe(publishedPost.Title); + publishedPostFromDb.Slug.ShouldBe(publishedPost.Slug); + publishedPostFromDb.ShortDescription.ShouldBe(publishedPost.ShortDescription); + publishedPostFromDb.Content.ShouldBe(publishedPost.Content); + publishedPostFromDb.Status.ShouldBe(BlogPostStatus.Published); + + var draftPosts = await blogPostRepository.GetListAsync(null, statusFilter: BlogPostStatus.Draft); + draftPosts.ShouldNotBeNull(); + draftPosts.Count.ShouldBe(1); + draftPosts.Any(x => x.Id == draftPost.Id).ShouldBeTrue(); + draftPosts.Any(x => x.Id == publishedPost.Id).ShouldBeFalse(); + + var publishedPosts = await blogPostRepository.GetListAsync(null, statusFilter: BlogPostStatus.Published); + publishedPosts.ShouldNotBeNull(); + publishedPosts.Count.ShouldBe(3);//1 new added 2 already existing + publishedPosts.Any(x => x.Id == draftPost.Id).ShouldBeFalse(); + publishedPosts.Any(x => x.Id == publishedPost.Id).ShouldBeTrue(); + } } From b8eb61cdec3ca833f773726f39158b31ad2c3694 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 16:00:10 +0300 Subject: [PATCH 073/242] Implements send to admin approval to publish --- .../Admin/Blogs/IBlogPostAdminAppService.cs | 8 +++++-- .../Admin/Blogs/BlogPostAdminAppService.cs | 18 ++++++++++++++++ .../BlogPostAdminClientProxy.Generated.cs | 16 ++++++++++++++ .../Admin/Blogs/BlogPostAdminController.cs | 16 ++++++++++++++ .../Pages/CmsKit/BlogPosts/Create.cshtml | 5 ++++- .../Pages/CmsKit/BlogPosts/Create.cshtml.cs | 4 ++++ .../Pages/CmsKit/BlogPosts/create.js | 17 ++++++++++++++- .../Pages/CmsKit/BlogPosts/index.js | 21 ++++++++++++++++++- .../client-proxies/cms-kit-admin-proxy.js | 16 ++++++++++++++ .../Volo/CmsKit/Blogs/BlogPostStatus.cs | 3 ++- .../CmsKit/Localization/Resources/en.json | 8 ++++++- .../CmsKit/Localization/Resources/tr.json | 8 ++++++- .../Volo/CmsKit/Blogs/BlogPost.cs | 5 +++++ 13 files changed, 137 insertions(+), 8 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index d8f74d6d66..061f9094b8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -14,8 +14,12 @@ public interface IBlogPostAdminAppService UpdateBlogPostDto> { Task PublishAsync(Guid id); - + Task DraftAsync(Guid id); - + Task CreateAndPublishAsync(CreateBlogPostDto input); + + Task SendToReviewAsync(Guid id); + + Task CreateAndSendToReviewAsync(CreateBlogPostDto input); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 7e1c11bbcd..b512406454 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -139,4 +139,22 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.Status = BlogPostStatus.Published; return blogPost; } + + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual async Task SendToReviewAsync(Guid id) + { + var blogPost = await BlogPostRepository.GetAsync(id); + blogPost.SetWaitingForReview(); + } + + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual async Task CreateAndSendToReviewAsync(CreateBlogPostDto input) + { + var blogPost = await CreateAsync(input); + await CurrentUnitOfWork.SaveChangesAsync(); + + await SendToReviewAsync(blogPost.Id); + blogPost.Status = BlogPostStatus.WaitingForReview; + return blogPost; + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index 25d8bcf9fd..c3f94e1992 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -79,4 +79,20 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase CreateAndSendToReviewAsync(CreateBlogPostDto input) + { + return await RequestAsync(nameof(CreateAndSendToReviewAsync), new ClientProxyRequestTypeValue + { + { typeof(CreateBlogPostDto), input } + }); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index ccc2e4fd25..0efb2bf2d5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -86,4 +86,20 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.CreateAndPublishAsync(input); } + + [HttpPost] + [Route("sendtoreview/{id}")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual Task SendToReviewAsync(Guid id) + { + return BlogPostAdminAppService.SendToReviewAsync(id); + } + + [HttpPost] + [Route("createandsendtoreview")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] + public virtual Task CreateAndSendToReviewAsync(CreateBlogPostDto input) + { + return BlogPostAdminAppService.CreateAndSendToReviewAsync(input); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml index 70b17ea9ad..eefc59e849 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml @@ -87,10 +87,13 @@ - + @if ((await AuthorizationService.AuthorizeAsync(CmsKitAdminPermissions.BlogPosts.Publish)).Succeeded) { + }else + { + } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs index 3e0fcd30b0..a76385491a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs @@ -36,6 +36,10 @@ public class CreateModel : CmsKitAdminPageModel { createResult = await BlogPostAdminAppService.CreateAndPublishAsync(dto); } + else if (ViewModel.Status == BlogPostStatus.WaitingForReview) + { + createResult = await BlogPostAdminAppService.CreateAndSendToReviewAsync(dto); + } else { createResult = await BlogPostAdminAppService.CreateAsync(dto); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js index b94e8b2353..adc2e53c85 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js @@ -4,7 +4,8 @@ $(function () { var blogPostStatus = { Draft: 0, - Published: 1 + Published: 1, + SendToReview: 2 }; var $selectBlog = $('#BlogSelectionSelect'); @@ -16,6 +17,7 @@ $(function () { var $status = $('#ViewModel_Status'); var $buttonSubmit = $('#button-blog-post-create'); var $buttonPublish = $('#button-blog-post-publish'); + var $buttonSendToReview = $('#button-blog-post-send-to-review'); var $pageContentInput = $('#ViewModel_Content'); var $tagsInput = $('.tag-editor-form input[name=tags]'); var $fileInput = $('#BlogPostCoverImage'); @@ -83,6 +85,19 @@ $(function () { ); }); + $buttonSendToReview.click(function (e) { + abp.message.confirm( + l('BlogPostSendToReviewConfirmationMessage', $title.val()), + function (isConfirmed) { + if (isConfirmed) { + e.preventDefault(); + $status.val(blogPostStatus.SendToReview); + submitCoverImage(); + } + } + ); + }); + function submitEntityTags(blogPostId) { var tags = $tagsInput.val().split(',').map(x => x.trim()).filter(x => x); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js index 8b941f84b5..a813a612ea 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js @@ -3,7 +3,8 @@ $(function () { var l = abp.localization.getResource("CmsKit"); var blogPostStatus = { Draft: 0, - Published: 1 + Published: 1, + SendToReview: 2 }; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; @@ -54,6 +55,24 @@ $(function () { }); } }, + { + text: l('SendToReview'), + visible: function(data) { + return data?.status === blogPostStatus.Draft && + !abp.auth.isGranted('CmsKit.BlogPosts.Publish'); + }, + confirmMessage: function (data) { + return l("BlogPostPublishConfirmationMessage", data.record.title) + }, + action: function (data) { + blogsService + .sendToReview(data.record.id) + .then(function () { + dataTable.ajax.reload(); + abp.notify.success(l('BlogPostSendToReviewSuccessMessage', data.record.title)); + }); + } + }, { text: l('Draft'), visible: function(data) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index aafdf7d245..4c97f154a8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -415,6 +415,22 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.sendToReview = function(id, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/sendtoreview/' + id + '', + type: 'POST', + dataType: null + }, ajaxParams)); + }; + + volo.cmsKit.admin.blogs.blogPostAdmin.createAndSendToReview = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/createandsendtoreview', + type: 'POST', + data: JSON.stringify(input) + }, ajaxParams)); + }; + })(); })(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs index e0a2385d7e..2d849e9d93 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs @@ -3,5 +3,6 @@ public enum BlogPostStatus { Draft, - Published + Published, + WaitingForReview } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 1083826bf7..48dc92ce92 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -168,10 +168,16 @@ "SavedSuccessfully": "Saved successfully", "CmsKit.BlogPost.Status.0": "Draft", "CmsKit.BlogPost.Status.1": "Published", + "CmsKit.BlogPost.Status.2": "Waiting for review", "BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?", "SuccessfullyPublished": "Successfully published!", "Draft": "Draft", "Publish": "Publish", - "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?" + "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?", + "BlogPostSendToReviewConfirmationMessage": "Are you sure to send the blog post \"{0}\" to admin review for publishing?", + "SaveAsDraft": "Save as draft", + "SendToReview": "Send to review", + "SendToReviewToPublish": "Send to review to publish", + "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 67ca5eeafd..38d8243ad6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -167,10 +167,16 @@ "SavedSuccessfully": "Başarıyla kaydedildi", "CmsKit.BlogPost.Status.0": "Taslak", "CmsKit.BlogPost.Status.1": "Yayınlandı", + "CmsKit.BlogPost.Status.2": "İnceleme Bekliyor", "BlogPostPublishConfirmationMessage": "\"{0}\" başlıklı gönderiyi yayınlamak istediğinize emin misiniz?", "SuccessfullyPublished": "Başarıyla yayınlandı", "Draft": "Taslak olarak kaydet", "Publish": "Yayınla", - "BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?" + "BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?", + "BlogPostSendToReviewConfirmationMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine göndermek istediğinize emin misiniz?", + "SaveAsDraft": "Taslak olarak kaydet", + "SendToReview": "İncelemeye gönder", + "SendToReviewToPublish": "Yayınlamak için admin incelemesine gönder", + "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs index 5116d0a95e..cca45bf4fe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs @@ -91,4 +91,9 @@ public class BlogPost : FullAuditedAggregateRoot, IMultiTenant { Status = BlogPostStatus.Published; } + + public virtual void SetWaitingForReview() + { + Status = BlogPostStatus.WaitingForReview; + } } From 4784e3e7656faae625560e2de2f922ec93e4908b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 25 Mar 2022 16:24:25 +0300 Subject: [PATCH 074/242] Get user's name, surname and phone number from external login, if available. --- .../Claims/AbpClaimActionCollectionExtensions.cs | 14 ++++++++++++++ .../Pages/Account/Login.cshtml.cs | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Microsoft/AspNetCore/Authentication/OAuth/Claims/AbpClaimActionCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Microsoft/AspNetCore/Authentication/OAuth/Claims/AbpClaimActionCollectionExtensions.cs index 01dc489c54..2aedea2608 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Microsoft/AspNetCore/Authentication/OAuth/Claims/AbpClaimActionCollectionExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Microsoft/AspNetCore/Authentication/OAuth/Claims/AbpClaimActionCollectionExtensions.cs @@ -13,6 +13,20 @@ public static class AbpClaimActionCollectionExtensions claimActions.DeleteClaim("name"); claimActions.RemoveDuplicate(AbpClaimTypes.UserName); } + + if (AbpClaimTypes.Name != "given_name") + { + claimActions.MapJsonKey(AbpClaimTypes.Name, "given_name"); + claimActions.DeleteClaim("given_name"); + claimActions.RemoveDuplicate(AbpClaimTypes.Name); + } + + if (AbpClaimTypes.SurName != "family_name") + { + claimActions.MapJsonKey(AbpClaimTypes.SurName, "family_name"); + claimActions.DeleteClaim("family_name"); + claimActions.RemoveDuplicate(AbpClaimTypes.SurName); + } if (AbpClaimTypes.Email != "email") { diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs index fe94f47415..5ec85d4078 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs @@ -277,6 +277,18 @@ public class LoginModel : AccountPageModel CheckIdentityErrors(await UserManager.SetEmailAsync(user, emailAddress)); CheckIdentityErrors(await UserManager.AddLoginAsync(user, info)); CheckIdentityErrors(await UserManager.AddDefaultRolesAsync(user)); + + user.Name = info.Principal.FindFirstValue(AbpClaimTypes.Name); + user.Surname = info.Principal.FindFirstValue(AbpClaimTypes.SurName); + + var phoneNumber = info.Principal.FindFirstValue(AbpClaimTypes.PhoneNumber); + if (!phoneNumber.IsNullOrWhiteSpace()) + { + var phoneNumberConfirmed = string.Equals(info.Principal.FindFirstValue(AbpClaimTypes.PhoneNumberVerified), "true", StringComparison.InvariantCultureIgnoreCase); + user.SetPhoneNumber(phoneNumber, phoneNumberConfirmed); + } + + await UserManager.UpdateAsync(user); return user; } From 7d190a3d9ff2011b136551851f9c416d82a8ef62 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 16:47:02 +0300 Subject: [PATCH 075/242] shows users with publish permission that they have blog posts waiting for review --- .../Admin/Blogs/IBlogPostAdminAppService.cs | 2 ++ .../Admin/Blogs/BlogPostAdminAppService.cs | 6 ++++ .../BlogPostAdminClientProxy.Generated.cs | 5 +++ .../Admin/Blogs/BlogPostAdminController.cs | 10 +++++- .../Pages/CmsKit/BlogPosts/Index.cshtml | 7 +++- .../Pages/CmsKit/BlogPosts/index.js | 34 +++++++++++++++++-- .../client-proxies/cms-kit-admin-proxy.js | 7 ++++ .../CmsKit/Localization/Resources/en.json | 3 +- .../CmsKit/Localization/Resources/tr.json | 3 +- .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 2 ++ .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 6 ++++ .../MongoDB/Blogs/MongoBlogPostRepository.cs | 8 +++++ 12 files changed, 87 insertions(+), 6 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index 061f9094b8..5b7868627f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -22,4 +22,6 @@ public interface IBlogPostAdminAppService Task SendToReviewAsync(Guid id); Task CreateAndSendToReviewAsync(CreateBlogPostDto input); + + Task HasBlogPostWaitingForReviewAsync(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index b512406454..1fef52f0c8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -157,4 +157,10 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.Status = BlogPostStatus.WaitingForReview; return blogPost; } + + [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] + public async Task HasBlogPostWaitingForReviewAsync() + { + return await BlogPostRepository.HasBlogPostWaitingForReviewAsync(); + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index c3f94e1992..974d0a279b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -95,4 +95,9 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase HasBlogPostWaitingForReviewAsync() + { + return await RequestAsync(nameof(HasBlogPostWaitingForReviewAsync)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index 0efb2bf2d5..b48350a361 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -102,4 +102,12 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.CreateAndSendToReviewAsync(input); } -} + + [HttpGet] + [Route("hasblogpostwaitingforreview")] + [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] + public virtual Task HasBlogPostWaitingForReviewAsync() + { + return BlogPostAdminAppService.HasBlogPostWaitingForReviewAsync(); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml index 9eeb977e84..e9e882098a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml @@ -27,6 +27,11 @@ @await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new {pageName = typeof(IndexModel).FullName}) } + + +
@@ -43,4 +48,4 @@ - + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js index a813a612ea..1e3b898225 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js @@ -8,11 +8,18 @@ $(function () { }; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; - + var _statusFilter; var getFilter = function () { - return { + var filter = { filter: $('#CmsKitBlogPostsWrapper input.page-search-filter-text').val() }; + + if (_statusFilter) { + filter.status = _statusFilter; + _statusFilter = null; + } + + return filter; }; var dataTable = $("#BlogPostsTable").DataTable(abp.libs.datatables.normalizeConfiguration({ @@ -52,6 +59,7 @@ $(function () { .then(function () { dataTable.ajax.reload(); abp.notify.success(l('SuccessfullyPublished')); + checkHasBlogPostWaitingForReview(); }); } }, @@ -87,6 +95,7 @@ $(function () { .then(function () { dataTable.ajax.reload(); abp.notify.success(l('SuccessfullySaved')); + checkHasBlogPostWaitingForReview(); }); } }, @@ -149,4 +158,25 @@ $(function () { e.preventDefault(); window.location.href = "BlogPosts/Create" }); + + $('#button-show-waiting-for-review').on('click', function (e) { + e.preventDefault(); + _statusFilter = blogPostStatus.SendToReview; + dataTable.ajax.reload(); + }); + + function checkHasBlogPostWaitingForReview(){ + if (!abp.auth.isGranted('CmsKit.BlogPosts.Publish')){ + $('#alertHasBlogPostWaitingForReview').hide(); + } + + blogsService.hasBlogPostWaitingForReview().then(function (result) { + if (result) { + $('#alertHasBlogPostWaitingForReview').show('fast'); + } else { + $('#alertHasBlogPostWaitingForReview').hide('fast'); + } + }); + } + checkHasBlogPostWaitingForReview(); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 4c97f154a8..754efd41b5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -431,6 +431,13 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.hasBlogPostWaitingForReview = function(ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/hasblogpostwaitingforreview', + type: 'GET' + }, ajaxParams)); + }; + })(); })(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 48dc92ce92..eeb81b7447 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -178,6 +178,7 @@ "SaveAsDraft": "Save as draft", "SendToReview": "Send to review", "SendToReviewToPublish": "Send to review to publish", - "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing." + "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.", + "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 38d8243ad6..3dad725d5b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -177,6 +177,7 @@ "SaveAsDraft": "Taslak olarak kaydet", "SendToReview": "İncelemeye gönder", "SendToReviewToPublish": "Yayınlamak için admin incelemesine gönder", - "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi." + "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi.", + "HasBlogPostWaitingForReviewMessage": "Yayınlanmak için onay bekleyen blog postlar var! Listelemek için tıklayın." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index d73512a204..aa1b2e134a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -31,4 +31,6 @@ public interface IBlogPostRepository : IBasicRepository Task GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default); + + Task HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index cc78ffa698..a5d36e2f01 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -109,4 +109,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.Author).Distinct() .ToListAsync(GetCancellationToken(cancellationToken)); } + + public virtual async Task HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index 65a8bf9c13..8a8cf70d57 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -125,4 +125,12 @@ public class MongoBlogPostRepository : MongoDbRepository HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default) + { + cancellationToken = GetCancellationToken(cancellationToken); + + return await (await GetMongoQueryableAsync(cancellationToken)) + .AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, cancellationToken); + } } From df34d665e923b217e0b5a2d815de6759b3b80de7 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 17:14:18 +0300 Subject: [PATCH 076/242] implements filter by status to index page --- .../Pages/CmsKit/BlogPosts/Index.cshtml | 13 +++++++++++-- .../Pages/CmsKit/BlogPosts/index.js | 11 ++++++----- .../Volo/CmsKit/Localization/Resources/en.json | 4 +++- .../Volo/CmsKit/Localization/Resources/tr.json | 4 +++- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml index e9e882098a..a3f8c7b37a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml @@ -5,6 +5,7 @@ @using Volo.CmsKit.Admin.Web.Pages @using Volo.CmsKit.Admin.Web.Menus @using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar +@using Volo.CmsKit.Blogs @inherits CmsKitAdminPageBase @@ -27,7 +28,6 @@ @await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new {pageName = typeof(IndexModel).FullName}) } - @@ -36,7 +36,16 @@
- + + + + @await Component.InvokeAsync(typeof(AbpPageSearchBoxViewComponent)) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js index 1e3b898225..73e19a178a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js @@ -1,6 +1,8 @@ $(function () { var l = abp.localization.getResource("CmsKit"); + var $statusFilter = $("#StatusSelect"); + var blogPostStatus = { Draft: 0, Published: 1, @@ -8,15 +10,14 @@ $(function () { }; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; - var _statusFilter; + var getFilter = function () { var filter = { filter: $('#CmsKitBlogPostsWrapper input.page-search-filter-text').val() }; - if (_statusFilter) { - filter.status = _statusFilter; - _statusFilter = null; + if ($statusFilter.val()) { + filter.status = $statusFilter.val(); } return filter; @@ -161,7 +162,7 @@ $(function () { $('#button-show-waiting-for-review').on('click', function (e) { e.preventDefault(); - _statusFilter = blogPostStatus.SendToReview; + $statusFilter.val(blogPostStatus.SendToReview); dataTable.ajax.reload(); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index eeb81b7447..d81c3a8c89 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -179,6 +179,8 @@ "SendToReview": "Send to review", "SendToReviewToPublish": "Send to review to publish", "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.", - "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list." + "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list.", + "SelectAStatus": "Select a status", + "Status": "Status" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 3dad725d5b..975c644224 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -178,6 +178,8 @@ "SendToReview": "İncelemeye gönder", "SendToReviewToPublish": "Yayınlamak için admin incelemesine gönder", "BlogPostSendToReviewSuccessMessage": "\"{0}\" başlıklı gönderiyi yayınlamak için admin incelemesine gönderildi.", - "HasBlogPostWaitingForReviewMessage": "Yayınlanmak için onay bekleyen blog postlar var! Listelemek için tıklayın." + "HasBlogPostWaitingForReviewMessage": "Yayınlanmak için onay bekleyen blog postlar var! Listelemek için tıklayın.", + "SelectAStatus": "Durum seçin", + "Status": "Durum" } } From 973b5789c8cabc211298f65a3b7f3ae6ba9b816f Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 17:38:43 +0300 Subject: [PATCH 077/242] move changes to dev based branch moved from https://github.com/abpframework/abp/pull/12064 --- .../Admin/Blogs/IBlogPostAdminAppService.cs | 2 ++ .../Admin/Blogs/BlogPostAdminAppService.cs | 23 +++++++++++++++++-- .../BlogPostAdminClientProxy.Generated.cs | 8 +++++++ .../Admin/Blogs/BlogPostAdminController.cs | 8 +++++++ .../Pages/CmsKit/BlogPosts/Update.cshtml | 18 +++++++++------ .../Pages/CmsKit/BlogPosts/update.js | 18 ++++++++++++++- .../client-proxies/cms-kit-admin-proxy.js | 8 +++++++ .../CmsKit/Localization/Resources/en.json | 3 ++- .../CmsKit/Localization/Resources/tr.json | 3 ++- 9 files changed, 79 insertions(+), 12 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index 314b7a1def..23562020d4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Volo.Abp.Application.Services; namespace Volo.CmsKit.Admin.Blogs; @@ -12,4 +13,5 @@ public interface IBlogPostAdminAppService CreateBlogPostDto, UpdateBlogPostDto> { + Task RemoveCoverImageAsync(Guid id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 83899199f0..d463f8dcb1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -6,6 +6,7 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.GlobalFeatures; using Volo.Abp.Users; +using Volo.CmsKit.Admin.MediaDescriptors; using Volo.CmsKit.Blogs; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; @@ -22,16 +23,20 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe protected IBlogRepository BlogRepository { get; } protected ICmsUserLookupService UserLookupService { get; } + protected IMediaDescriptorAdminAppService MediaDescriptorAdminAppService { get; } + public BlogPostAdminAppService( BlogPostManager blogPostManager, IBlogPostRepository blogPostRepository, IBlogRepository blogRepository, - ICmsUserLookupService userLookupService) + ICmsUserLookupService userLookupService, + IMediaDescriptorAdminAppService mediaDescriptorAdminAppService) { BlogPostManager = blogPostManager; BlogPostRepository = blogPostRepository; BlogRepository = blogRepository; UserLookupService = userLookupService; + MediaDescriptorAdminAppService = mediaDescriptorAdminAppService; } [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] @@ -109,4 +114,18 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { await BlogPostRepository.DeleteAsync(id); } -} + + [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] + public virtual async Task RemoveCoverImageAsync(Guid id) + { + var blogPost = await BlogPostRepository.GetAsync(id); + if (blogPost?.CoverImageMediaId == null) + { + return; + } + + await MediaDescriptorAdminAppService.DeleteAsync(blogPost.CoverImageMediaId.Value); + + blogPost.CoverImageMediaId = null; + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index 560ba4e2de..0f201fb469 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -55,4 +55,12 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase
- @if (Model.ViewModel.CoverImageMediaId != null) - { - -
- } - - +
+ @if (Model.ViewModel.CoverImageMediaId != null) + { + +
+ +
+ } +
+ +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js index 5902dc111b..65e9c89146 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js @@ -10,6 +10,7 @@ $(function () { var $blogPostIdInput = $('#Id'); var $tagsInput = $('.tag-editor-form input[name=tags]'); var $fileInput = $('#BlogPostCoverImage'); + var $buttonRemoveCoverImage = $('#button-remove-cover-image'); var UPPY_FILE_ID = "uppy-upload-file"; @@ -152,7 +153,6 @@ $(function () { } } - // ----------------------------------- var fileUploadUri = "/api/cms-kit-admin/media/blogpost"; var fileUriPrefix = "/api/cms-kit/media/"; @@ -225,4 +225,20 @@ $(function () { } }); } + + $buttonRemoveCoverImage.on('click', function () { + abp.message.confirm( + l('RemoveCoverImageConfirmationMessage'), + function (isConfirmed) { + if (isConfirmed) { + volo.cmsKit.admin.blogs.blogPostAdmin + .removeCoverImage($blogPostIdInput.val()) + .then(function () { + $coverImage.val(null); + $('#CurrentCoverImageArea').remove(); + }); + } + } + ); + }); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 0a1424d92a..9bce6416a3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -391,6 +391,14 @@ }, ajaxParams)); }; + volo.cmsKit.admin.blogs.blogPostAdmin.removeCoverImage = function(id, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/removeCoverImage/' + id + '', + type: 'DELETE', + dataType: null + }, ajaxParams)); + }; + })(); })(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 0dd826480d..8cbd7ef946 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -164,6 +164,7 @@ "GlobalResources": "Global Resources", "Script": "Script", "Style": "Style", - "SavedSuccessfully": "Saved successfully" + "SavedSuccessfully": "Saved successfully", + "RemoveCoverImageConfirmationMessage": "Are you sure to remove the cover image?" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 95ef414c17..90b10f153c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -163,6 +163,7 @@ "GlobalResources": "Global Kaynaklar", "Script": "Script", "Style": "Style", - "SavedSuccessfully": "Başarıyla kaydedildi" + "SavedSuccessfully": "Başarıyla kaydedildi", + "RemoveCoverImageConfirmationMessage": "Kapak resmini kaldırmak istediğinize emin misiniz?" } } From f08f00ad279d0fe299f5d377e914f48759213ca5 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 17:44:16 +0300 Subject: [PATCH 078/242] change route requested in https://github.com/abpframework/abp/pull/12064#discussion_r835134372 --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs | 2 +- .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index 5492633078..0dbf8ec10d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -63,7 +63,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpDelete] - [Route("removeCoverImage/{id}")] + [Route("{id}/cover-image")] [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] public Task RemoveCoverImageAsync(Guid id) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 9bce6416a3..2cb7d2ab98 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -393,7 +393,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.removeCoverImage = function(id, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/removeCoverImage/' + id + '', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/cover-image', type: 'DELETE', dataType: null }, ajaxParams)); From 484e4952dba54aeba09d62c83fc1c160c749a42d Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 17:46:47 +0300 Subject: [PATCH 079/242] add localization --- .../Volo/CmsKit/Localization/Resources/en.json | 3 ++- .../Volo/CmsKit/Localization/Resources/tr.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 8cbd7ef946..43f620bfd9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -165,6 +165,7 @@ "Script": "Script", "Style": "Style", "SavedSuccessfully": "Saved successfully", - "RemoveCoverImageConfirmationMessage": "Are you sure to remove the cover image?" + "RemoveCoverImageConfirmationMessage": "Are you sure to remove the cover image?", + "RemoveCoverImage": "Remove the cover image" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 90b10f153c..527e119a2e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -164,6 +164,7 @@ "Script": "Script", "Style": "Style", "SavedSuccessfully": "Başarıyla kaydedildi", - "RemoveCoverImageConfirmationMessage": "Kapak resmini kaldırmak istediğinize emin misiniz?" + "RemoveCoverImageConfirmationMessage": "Kapak resmini kaldırmak istediğinize emin misiniz?", + "RemoveCoverImage": "Kapak resmini kaldır" } } From 03e790547fbc0fb02589edb216218b657d9367d5 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 17:52:37 +0300 Subject: [PATCH 080/242] update blog post when it's status changed It is required for MongoDb. It is requested in https://github.com/abpframework/abp/pull/12073#discussion_r835100870 --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 7e1c11bbcd..acb7620472 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -119,6 +119,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { var blogPost = await BlogPostRepository.GetAsync(id); blogPost.SetPublished(); + await BlogPostRepository.UpdateAsync(blogPost); } [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] @@ -126,6 +127,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { var blogPost = await BlogPostRepository.GetAsync(id); blogPost.SetDraft(); + await BlogPostRepository.UpdateAsync(blogPost); } [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] From 7aa9b086d2e300ee3e413e916fa5d5380e6a1f8f Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:00:32 +0300 Subject: [PATCH 081/242] use kebab-case in route --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs | 2 +- .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index ccc2e4fd25..1ae18e01c5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -79,7 +79,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpPost] - [Route("createandpublish")] + [Route("create-and-publish")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] public virtual Task CreateAndPublishAsync(CreateBlogPostDto input) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index aafdf7d245..e7de57cb09 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -409,7 +409,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.createAndPublish = function(input, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/createandpublish', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-publish', type: 'POST', data: JSON.stringify(input) }, ajaxParams)); From d58c40f1eec1886ee85e4e0d562a02c8f8c86aeb Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:07:07 +0300 Subject: [PATCH 082/242] update blog post when it's status changed --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 8c8caecb76..e0af645131 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -147,6 +147,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { var blogPost = await BlogPostRepository.GetAsync(id); blogPost.SetWaitingForReview(); + await BlogPostRepository.UpdateAsync(blogPost); } [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] From 6a7ea6a0ffd6ac6c58bb2f7f40f2f385615c9b46 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:11:34 +0300 Subject: [PATCH 083/242] use kebap case in route --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs | 6 +++--- .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index f285e3a542..85f53bed42 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -88,7 +88,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpPost] - [Route("sendtoreview/{id}")] + [Route("{id}/send-to-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] public virtual Task SendToReviewAsync(Guid id) { @@ -96,7 +96,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpPost] - [Route("createandsendtoreview")] + [Route("create-and-send-to-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] public virtual Task CreateAndSendToReviewAsync(CreateBlogPostDto input) { @@ -104,7 +104,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpGet] - [Route("hasblogpostwaitingforreview")] + [Route("has-blogpost-waiting-for-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] public virtual Task HasBlogPostWaitingForReviewAsync() { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index af615bfb86..f424c921ee 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -417,7 +417,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.sendToReview = function(id, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/sendtoreview/' + id + '', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/send-to-review', type: 'POST', dataType: null }, ajaxParams)); @@ -425,7 +425,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.createAndSendToReview = function(input, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/createandsendtoreview', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-send-to-review', type: 'POST', data: JSON.stringify(input) }, ajaxParams)); @@ -433,7 +433,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.hasBlogPostWaitingForReview = function(ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/hasblogpostwaitingforreview', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/has-blogpost-waiting-for-review', type: 'GET' }, ajaxParams)); }; From 3dfa70bbef30fb2d048e25ff4a41c43730113e7d Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:15:08 +0300 Subject: [PATCH 084/242] change route --- .../Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs | 4 ++-- .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index 1ae18e01c5..fe30fd481c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -63,7 +63,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpPost] - [Route("publish/{id}")] + [Route("{id}/publish")] [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] public virtual Task PublishAsync(Guid id) { @@ -71,7 +71,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS } [HttpPost] - [Route("draft/{id}")] + [Route("{id}/draft")] [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] public virtual Task DraftAsync(Guid id) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index e7de57cb09..6215960b6c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -393,7 +393,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.publish = function(id, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/publish/' + id + '', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/publish', type: 'POST', dataType: null }, ajaxParams)); @@ -401,7 +401,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.draft = function(id, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/draft/' + id + '', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/draft', type: 'POST', dataType: null }, ajaxParams)); From 62d5bab0715a697ec8d80557acff66b66d85c7c2 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:16:31 +0300 Subject: [PATCH 085/242] add forgetten localization key --- .../Volo/CmsKit/Localization/Resources/en.json | 3 ++- .../Volo/CmsKit/Localization/Resources/tr.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 1083826bf7..af0bc386d6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -172,6 +172,7 @@ "SuccessfullyPublished": "Successfully published!", "Draft": "Draft", "Publish": "Publish", - "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?" + "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?", + "SelectAnAuthor": "Select an author" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 67ca5eeafd..7842224900 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -171,6 +171,7 @@ "SuccessfullyPublished": "Başarıyla yayınlandı", "Draft": "Taslak olarak kaydet", "Publish": "Yayınla", - "BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?" + "BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?", + "SelectAnAuthor": "Bir yazar seçin" } } From d7d0bc42a6afbba71a703661f4ef444df0c39c1e Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Fri, 25 Mar 2022 18:20:31 +0300 Subject: [PATCH 086/242] list author only has published posts --- .../Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs | 4 +++- .../Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index cc78ffa698..0c1f748f10 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -106,7 +106,9 @@ public class EfCoreBlogPostRepository : EfCoreRepository> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default) { - return await (await GetDbContextAsync()).BlogPosts.Select(x => x.Author).Distinct() + return await (await GetDbContextAsync()).BlogPosts + .Where(x => x.Status == BlogPostStatus.Published) + .Select(x => x.Author).Distinct() .ToListAsync(GetCancellationToken(cancellationToken)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index 65a8bf9c13..a57c0973ce 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -110,9 +110,12 @@ public class MongoBlogPostRepository : MongoDbRepository> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default) { - var blogPostQueryable = (await GetQueryableAsync()); + cancellationToken = GetCancellationToken(cancellationToken); + + var blogPostQueryable = (await GetQueryableAsync()) + .Where(x => x.Status == BlogPostStatus.Published); - var usersQueryable = (await GetDbContextAsync()).Collection().AsQueryable(); + var usersQueryable = (await GetDbContextAsync(cancellationToken)).Collection().AsQueryable(); var queryable = blogPostQueryable .Join( @@ -123,6 +126,6 @@ public class MongoBlogPostRepository : MongoDbRepository s.user) .Distinct(); - return await AsyncExecuter.ToListAsync(queryable, GetCancellationToken(cancellationToken)); + return await AsyncExecuter.ToListAsync(queryable, cancellationToken); } } From a38d0001456975cf10422d5df2399560bc38d763 Mon Sep 17 00:00:00 2001 From: Musa Demir <48536631+demirmusa@users.noreply.github.com> Date: Fri, 25 Mar 2022 18:58:17 +0300 Subject: [PATCH 087/242] use form select for select item --- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index dbc0d699ef..4ae3c007c7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -25,7 +25,7 @@
- @foreach (var author in Model.Authors) { @@ -76,4 +76,4 @@ - \ No newline at end of file + From 50a11f2f53272250177072a099c34bcce6899923 Mon Sep 17 00:00:00 2001 From: Musa Demir <48536631+demirmusa@users.noreply.github.com> Date: Fri, 25 Mar 2022 19:01:49 +0300 Subject: [PATCH 088/242] use form select for select item --- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml index a3f8c7b37a..6587509d11 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml @@ -37,7 +37,7 @@
- @foreach (var status in (BlogPostStatus[]) Enum.GetValues(typeof(BlogPostStatus))) { @@ -57,4 +57,4 @@ - \ No newline at end of file + From a23509a3be61360e3d762bf5bdd6189807af4ed5 Mon Sep 17 00:00:00 2001 From: Roc Date: Mon, 28 Mar 2022 02:32:28 +0800 Subject: [PATCH 089/242] Update CultureHelper.cs --- .../src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs index d4d4a5bed0..dded0d794e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs @@ -57,8 +57,6 @@ public static class CultureHelper public static string GetBaseCultureName(string cultureName) { - return cultureName.Contains("-") - ? cultureName.Left(cultureName.IndexOf("-", StringComparison.Ordinal)) - : cultureName; + return new CultureInfo(cultureName).Parent.Name; } } From 5fac9c9d1d06db94212f27c99e7e4c7503e56d6b Mon Sep 17 00:00:00 2001 From: Roc Date: Mon, 28 Mar 2022 02:35:31 +0800 Subject: [PATCH 090/242] Update AbpLocalization_Tests.cs --- .../Abp/Localization/AbpLocalization_Tests.cs | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs index b8375485f7..6c4bdfff08 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs @@ -1,4 +1,4 @@ -using System.Globalization; +using System.Globalization; using System.Linq; using Microsoft.Extensions.Localization; using Shouldly; @@ -183,6 +183,60 @@ public class AbpLocalization_Tests : AbpIntegratedTest Date: Mon, 28 Mar 2022 13:35:17 +0800 Subject: [PATCH 091/242] Support for exporting generic interfaces. --- .../ExposeServicesAttribute.cs | 6 ++++- .../AutoRegistrationHelper_Tests.cs | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ExposeServicesAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ExposeServicesAttribute.cs index 72e7870125..286b9a8c76 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ExposeServicesAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ExposeServicesAttribute.cs @@ -15,7 +15,7 @@ public class ExposeServicesAttribute : Attribute, IExposedServiceTypesProvider public ExposeServicesAttribute(params Type[] serviceTypes) { - ServiceTypes = serviceTypes ?? new Type[0]; + ServiceTypes = serviceTypes ?? Type.EmptyTypes; } public Type[] GetExposedServiceTypes(Type targetType) @@ -49,6 +49,10 @@ public class ExposeServicesAttribute : Attribute, IExposedServiceTypesProvider foreach (var interfaceType in type.GetTypeInfo().GetInterfaces()) { var interfaceName = interfaceType.Name; + if (interfaceType.IsGenericType) + { + interfaceName = interfaceType.Name.Left(interfaceType.Name.IndexOf('`')); + } if (interfaceName.StartsWith("I")) { diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoRegistrationHelper_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoRegistrationHelper_Tests.cs index 3c7ccfbc6a..5d8716a70c 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoRegistrationHelper_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoRegistrationHelper_Tests.cs @@ -33,6 +33,21 @@ public class AutoRegistrationHelper_Tests exposedServices.ShouldContain(typeof(IDerivedService)); } + [Fact] + public void Should_Get_Conventional_Exposed_Generic_Types_By_Default() + { + //Act + var exposedServices = ExposedServiceExplorer.GetExposedServices(typeof(DefaultGenericService)); + + //Assert + exposedServices.Count.ShouldBe(4); + exposedServices.ShouldContain(typeof(IService)); + exposedServices.ShouldContain(typeof(IGenericService)); + exposedServices.ShouldContain(typeof(IGenericService)); + exposedServices.ShouldContain(typeof(DefaultGenericService)); + } + + public class DefaultDerivedService : IDerivedService { } @@ -50,4 +65,14 @@ public class AutoRegistrationHelper_Tests { } + + public interface IGenericService + { + + } + + public class DefaultGenericService : IService, IGenericService, IGenericService + { + + } } From a676e2ebbcb9faa3c7597a77d0660a35873ff209 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Mar 2022 09:37:27 +0300 Subject: [PATCH 092/242] CmsKit - Add AutoComplete Select for Author filtering --- .../Volo/CmsKit/Blogs/IBlogPostRepository.cs | 11 +- .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 27 ++- .../MongoDB/Blogs/MongoBlogPostRepository.cs | 31 ++- ...tFilteredPagedAndSortedResultRequestDto.cs | 8 + .../Public/Blogs/IBlogPostPublicAppService.cs | 7 +- .../Public/Blogs/BlogPostPublicAppService.cs | 19 +- .../BlogPostPublicClientProxy.Generated.cs | 18 +- ...obalResourcePublicClientProxy.Generated.cs | 27 +++ .../GlobalResourcePublicClientProxy.cs | 7 + .../ClientProxies/cms-kit-generate-proxy.json | 190 +++++++++++++++++- .../Public/Blogs/BlogPostPublicController.cs | 11 +- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 26 +-- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 14 +- 13 files changed, 353 insertions(+), 43 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.Generated.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs index fed0eed037..16c4f066a3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs @@ -28,5 +28,14 @@ public interface IBlogPostRepository : IBasicRepository Task GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); - Task> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default); + Task> GetAuthorsHasBlogPostsAsync( + int skipCount, + int maxResultCount, + string sorting, + string filter, + CancellationToken cancellationToken = default); + + Task GetAuthorsHasBlogPostsCountAsync(string filter, CancellationToken cancellationToken = default); + + Task GetAuthorHasBlogPostAsync(Guid id, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index cfc39a62c7..b7fce01be6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -7,6 +7,7 @@ using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using Volo.Abp; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.EntityFrameworkCore; @@ -100,9 +101,31 @@ public class EfCoreBlogPostRepository : EfCoreRepository> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default) + public async Task> GetAuthorsHasBlogPostsAsync(int skipCount, int maxResultCount, string sorting, string filter, CancellationToken cancellationToken = default) { - return await (await GetDbContextAsync()).BlogPosts.Select(x => x.Author).Distinct() + return await (await CreateAuthorsQueryableAsync()) + .Skip(skipCount) + .Take(maxResultCount) + .WhereIf(!filter.IsNullOrEmpty(), x => x.UserName.Contains(filter.ToLower())) + .OrderBy(sorting.IsNullOrEmpty() ? nameof(CmsUser.UserName) : sorting) .ToListAsync(GetCancellationToken(cancellationToken)); } + + public async Task GetAuthorsHasBlogPostsCountAsync(string filter, CancellationToken cancellationToken = default) + { + return await (await CreateAuthorsQueryableAsync()) + .WhereIf(!filter.IsNullOrEmpty(), x => x.UserName.Contains(filter.ToLower())) + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public async Task GetAuthorHasBlogPostAsync(Guid id, CancellationToken cancellationToken = default) + { + return await (await CreateAuthorsQueryableAsync()).FirstOrDefaultAsync(x => x.Id == id, GetCancellationToken(cancellationToken)) + ?? throw new EntityNotFoundException(typeof(CmsUser), id); + } + + private async Task> CreateAuthorsQueryableAsync() + { + return (await GetDbContextAsync()).BlogPosts.Select(x => x.Author).Distinct(); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index 1db7fee75e..84570810cd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -8,6 +8,7 @@ using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using Volo.Abp; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; using Volo.CmsKit.Blogs; @@ -105,13 +106,37 @@ public class MongoBlogPostRepository : MongoDbRepository x.BlogId == blogId && x.Slug.ToLower() == slug, cancellationToken); } - public async Task> GetAuthorsHasBlogPosts(CancellationToken cancellationToken = default) + public async Task> GetAuthorsHasBlogPostsAsync(int skipCount, int maxResultCount, string sorting, string filter, CancellationToken cancellationToken = default) + { + var queryable = (await CreateAuthorsQueryableAsync()) + .Skip(skipCount) + .Take(maxResultCount) + .OrderBy(sorting.IsNullOrEmpty() ? nameof(CmsUser.UserName) : sorting) + .WhereIf(!filter.IsNullOrEmpty(), x => x.UserName.Contains(filter.ToLower())); + + return await AsyncExecuter.ToListAsync(queryable, GetCancellationToken(cancellationToken)); + } + + public async Task GetAuthorsHasBlogPostsCountAsync(string filter, CancellationToken cancellationToken = default) + { + return await AsyncExecuter.CountAsync( + (await CreateAuthorsQueryableAsync()) + .WhereIf(!filter.IsNullOrEmpty(), x => x.UserName.Contains(filter.ToLower()))); + } + + public async Task GetAuthorHasBlogPostAsync(Guid id, CancellationToken cancellationToken = default) + { + return await AsyncExecuter.FirstOrDefaultAsync(await CreateAuthorsQueryableAsync(), x => x.Id == id) + ?? throw new EntityNotFoundException(typeof(CmsUser), id); + } + + private async Task> CreateAuthorsQueryableAsync() { var blogPostQueryable = (await GetQueryableAsync()); var usersQueryable = (await GetDbContextAsync()).Collection().AsQueryable(); - var queryable = blogPostQueryable + return blogPostQueryable .Join( usersQueryable, o => o.AuthorId, @@ -119,7 +144,5 @@ public class MongoBlogPostRepository : MongoDbRepository new { blogPost, user }) .Select(s => s.user) .Distinct(); - - return await AsyncExecuter.ToListAsync(queryable, GetCancellationToken(cancellationToken)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs new file mode 100644 index 0000000000..cb930ea37c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostFilteredPagedAndSortedResultRequestDto.cs @@ -0,0 +1,8 @@ +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Public.Blogs; + +public class BlogPostFilteredPagedAndSortedResultRequestDto : PagedAndSortedResultRequestDto +{ + public string Filter { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index 02b6d2a5f4..42161f884c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.CmsKit.Users; +using System; namespace Volo.CmsKit.Public.Blogs; @@ -12,6 +13,8 @@ public interface IBlogPostPublicAppService : IApplicationService Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input); Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); - - Task> GetAuthorsHasBlogPostsAsync(); + + Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input); + + Task GetAuthorHasBlogPostAsync(Guid id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index a9121a5c2b..fc9da1bffb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; @@ -15,7 +16,6 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub protected IBlogRepository BlogRepository { get; } protected IBlogPostRepository BlogPostRepository { get; } - public BlogPostPublicAppService( IBlogRepository blogRepository, @@ -46,9 +46,20 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub ObjectMapper.Map, List>(blogPosts)); } - public virtual async Task> GetAuthorsHasBlogPostsAsync() + public virtual async Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input) { - var authors = await BlogPostRepository.GetAuthorsHasBlogPosts(); - return ObjectMapper.Map, List>(authors); + var authors = await BlogPostRepository.GetAuthorsHasBlogPostsAsync(input.SkipCount, input.MaxResultCount, input.Sorting, input.Filter); + var authorDtos = ObjectMapper.Map, List>(authors); + + return new PagedResultDto( + await BlogPostRepository.GetAuthorsHasBlogPostsCountAsync(input.Filter), + authorDtos); + } + + public async Task GetAuthorHasBlogPostAsync(Guid id) + { + var author = await BlogPostRepository.GetAuthorHasBlogPostAsync(id); + + return ObjectMapper.Map(author); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index 9cc926515d..b1bbf6be07 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -1,6 +1,5 @@ // This file is automatically generated by ABP framework to use MVC Controllers from CSharp using System; -using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Http.Client; @@ -25,7 +24,7 @@ public partial class BlogPostPublicClientProxy : ClientProxyBase> GetListAsync(string blogSlug, BlogPostGetListInput input) { return await RequestAsync>(nameof(GetListAsync), new ClientProxyRequestTypeValue @@ -35,8 +34,19 @@ public partial class BlogPostPublicClientProxy : ClientProxyBase> GetAuthorsHasBlogPostsAsync() + public virtual async Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input) + { + return await RequestAsync>(nameof(GetAuthorsHasBlogPostsAsync), new ClientProxyRequestTypeValue + { + { typeof(BlogPostFilteredPagedAndSortedResultRequestDto), input } + }); + } + + public virtual async Task GetAuthorHasBlogPostAsync(Guid id) { - return await RequestAsync>(nameof(GetAuthorsHasBlogPostsAsync)); + return await RequestAsync(nameof(GetAuthorHasBlogPostAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), id } + }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.Generated.cs new file mode 100644 index 0000000000..d7354b9e87 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.Generated.cs @@ -0,0 +1,27 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Modeling; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client.ClientProxying; +using Volo.CmsKit.Public.GlobalResources; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.GlobalResources.ClientProxies; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IGlobalResourcePublicAppService), typeof(GlobalResourcePublicClientProxy))] +public partial class GlobalResourcePublicClientProxy : ClientProxyBase, IGlobalResourcePublicAppService +{ + public virtual async Task GetGlobalScriptAsync() + { + return await RequestAsync(nameof(GetGlobalScriptAsync)); + } + + public virtual async Task GetGlobalStyleAsync() + { + return await RequestAsync(nameof(GetGlobalStyleAsync)); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.cs new file mode 100644 index 0000000000..76549aec1e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/GlobalResourcePublicClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of GlobalResourcePublicClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Public.GlobalResources.ClientProxies; + +public partial class GlobalResourcePublicClientProxy +{ +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index 0387176b02..d39e795845 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -7,6 +7,8 @@ "Volo.CmsKit.Public.Tags.TagPublicController": { "controllerName": "TagPublic", "controllerGroupName": "TagPublic", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.CmsKit.Public.Tags.TagPublicController", "interfaces": [ { @@ -76,6 +78,8 @@ "Volo.CmsKit.Public.Reactions.ReactionPublicController": { "controllerName": "ReactionPublic", "controllerGroupName": "ReactionPublic", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.CmsKit.Public.Reactions.ReactionPublicController", "interfaces": [ { @@ -299,6 +303,8 @@ "Volo.CmsKit.Public.Ratings.RatingPublicController": { "controllerName": "RatingPublic", "controllerGroupName": "RatingPublic", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.CmsKit.Public.Ratings.RatingPublicController", "interfaces": [ { @@ -502,6 +508,8 @@ "Volo.CmsKit.Public.Pages.PagesPublicController": { "controllerName": "PagesPublic", "controllerGroupName": "PagesPublic", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.CmsKit.Public.Pages.PagesPublicController", "interfaces": [ { @@ -551,6 +559,8 @@ "Volo.CmsKit.Public.Menus.MenuItemPublicController": { "controllerName": "MenuItemPublic", "controllerGroupName": "MenuItemPublic", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.CmsKit.Public.Menus.MenuItemPublicController", "interfaces": [ { @@ -575,9 +585,55 @@ } } }, + "Volo.CmsKit.Public.GlobalResources.GlobalResourcePublicController": { + "controllerName": "GlobalResourcePublic", + "controllerGroupName": "GlobalResourcePublic", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourcePublicController", + "interfaces": [ + { + "type": "Volo.CmsKit.Public.GlobalResources.IGlobalResourcePublicAppService" + } + ], + "actions": { + "GetGlobalScriptAsync": { + "uniqueName": "GetGlobalScriptAsync", + "name": "GetGlobalScriptAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/global-resources/script", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto", + "typeSimple": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.GlobalResources.IGlobalResourcePublicAppService" + }, + "GetGlobalStyleAsync": { + "uniqueName": "GetGlobalStyleAsync", + "name": "GetGlobalStyleAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/global-resources/style", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto", + "typeSimple": "Volo.CmsKit.Public.GlobalResources.GlobalResourceDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.GlobalResources.IGlobalResourcePublicAppService" + } + } + }, "Volo.CmsKit.Public.Comments.CommentPublicController": { "controllerName": "CommentPublic", "controllerGroupName": "CommentPublic", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.CmsKit.Public.Comments.CommentPublicController", "interfaces": [ { @@ -818,6 +874,8 @@ "Volo.CmsKit.Public.Blogs.BlogPostPublicController": { "controllerName": "BlogPostPublic", "controllerGroupName": "BlogPostPublic", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.CmsKit.Public.Blogs.BlogPostPublicController", "interfaces": [ { @@ -899,9 +957,9 @@ }, { "name": "input", - "typeAsString": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto, Volo.Abp.Ddd.Application.Contracts", - "type": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", + "typeAsString": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput", + "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostGetListInput", "isOptional": false, "defaultValue": null } @@ -919,6 +977,30 @@ "bindingSourceId": "Path", "descriptorName": "" }, + { + "nameOnMethod": "input", + "name": "AuthorId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, { "nameOnMethod": "input", "name": "SkipCount", @@ -942,6 +1024,43 @@ "constraintTypes": null, "bindingSourceId": "ModelBinding", "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetAuthorsHasBlogPostsAsyncByInput": { + "uniqueName": "GetAuthorsHasBlogPostsAsyncByInput", + "name": "GetAuthorsHasBlogPostsAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/authors", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto, Volo.CmsKit.Public.Application.Contracts", + "type": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto", + "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostFilteredPagedAndSortedResultRequestDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" }, { "nameOnMethod": "input", @@ -954,11 +1073,72 @@ "constraintTypes": null, "bindingSourceId": "ModelBinding", "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" } ], "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetAuthorHasBlogPostAsyncById": { + "uniqueName": "GetAuthorHasBlogPostAsyncById", + "name": "GetAuthorHasBlogPostAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/authors/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.CmsKit.Users.CmsUserDto", + "typeSimple": "Volo.CmsKit.Users.CmsUserDto" }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index 8a788f7a34..9f43d65766 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -40,8 +40,15 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub [HttpGet] [Route("authors")] - public virtual Task> GetAuthorsHasBlogPostsAsync() + public Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input) { - return BlogPostPublicAppService.GetAuthorsHasBlogPostsAsync(); + return BlogPostPublicAppService.GetAuthorsHasBlogPostsAsync(input); + } + + [HttpGet] + [Route("authors/{id}")] + public Task GetAuthorHasBlogPostAsync(Guid id) + { + return BlogPostPublicAppService.GetAuthorHasBlogPostAsync(id); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 4ae3c007c7..32df5fb2fd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -24,19 +24,19 @@
- - + + @if(Model.SelectedAuthor != null) + { + }
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index c9dc49931d..c7f667382b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -20,16 +20,15 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public int CurrentPage { get; set; } = 1; - + [BindProperty(SupportsGet = true)] public Guid? AuthorId { get; set; } public PagedResultDto Blogs { get; private set; } public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString()); - - [BindProperty(SupportsGet = true)] - public List Authors { get; set; } + + public CmsUserDto SelectedAuthor { get; set; } protected IBlogPostPublicAppService BlogPostPublicAppService { get; } @@ -48,7 +47,10 @@ public class IndexModel : CmsKitPublicPageModelBase MaxResultCount = PageSize, AuthorId = AuthorId }); - - Authors = await BlogPostPublicAppService.GetAuthorsHasBlogPostsAsync(); + + if (AuthorId != null) + { + SelectedAuthor = await BlogPostPublicAppService.GetAuthorHasBlogPostAsync(AuthorId.Value); + } } } From 511540a2642e355b1a8bf7c3e78062abfc226563 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Mar 2022 09:50:07 +0300 Subject: [PATCH 093/242] Update resources --- .../Volo/CmsKit/Localization/Resources/en.json | 1 + .../Volo/CmsKit/Localization/Resources/tr.json | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 0dd826480d..0e201329ef 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -130,6 +130,7 @@ "SelectAll": "Select All", "Send": "Send", "SendMessage": "Send Message", + "SelectedAuthor": "Author", "ShortDescription": "Short description", "Slug": "Slug", "Source": "Source", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 95ef414c17..3f855f13a9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -129,6 +129,7 @@ "SelectAll": "Hepsini seç", "Send": "Gönder", "SendMessage": "Mesajı Gönder", + "SelectedAuthor": "Yazar", "ShortDescription": "Kısa açıklama", "Slug": "Etiket", "Source": "Kaynak", From 5723fd0a924a65f0acb3c8024845fa73bc6c19c7 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Mar 2022 09:53:45 +0300 Subject: [PATCH 094/242] Update tests --- .../test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs index 4d696e916d..c9cc6472fe 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs @@ -149,7 +149,7 @@ public abstract class BlogPostRepository_Test : CmsKitTestBase Date: Mon, 28 Mar 2022 18:15:07 +0300 Subject: [PATCH 095/242] Update en.json --- .../Commercial/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 8fa96b5ee2..446d165f21 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -503,6 +503,7 @@ "AdditionalNote": "Additional Note", "OnboardingTrainingFaqTitle": "Do you have ABP onboarding training?", "OnboardingTrainingFaqExplanation": "Yes, we have ABP Training Services to help you get your ABP project started fast. You will learn about ABP from an ABP core team member and you will get the skills to begin your ABP project. In the onboarding training, we will explain how to set up your development environment, install the required tools, create a fully functional CRUD page. The training will be live and the Zoom application will be used, and we are open to using other online meeting platforms. The language of the training will be English. You can also ask your questions about ABP during the sessions. A convenient time and date will be planned for both parties. To get more information, contact us at info@abp.io.", - "AddBasket": "Add to Basket" + "AddBasket": "Add to Basket", + "SendTrainingRequest": "Send Training Request" } } From e8a810ba4bd94bd1d4ca447ec4d8645354c75d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 29 Mar 2022 15:04:20 +0300 Subject: [PATCH 096/242] Check for null for receivedContext.TokenEndpointRequest --- .../DependencyInjection/AbpOpenIdConnectExtensions.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs index 02b292a984..894ba470a8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs @@ -57,8 +57,7 @@ public static class AbpOpenIdConnectExtensions if (receivedContext.Request.Cookies.ContainsKey(tenantKey)) { - receivedContext.TokenEndpointRequest.SetParameter(tenantKey, - receivedContext.Request.Cookies[tenantKey]); + receivedContext.TokenEndpointRequest?.SetParameter(tenantKey, receivedContext.Request.Cookies[tenantKey]); } } } From 45685fb58a92212266a6f286a11f47d811e304a9 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Tue, 29 Mar 2022 16:26:39 +0300 Subject: [PATCH 097/242] add scroll index to blog post page --- .../BlogPostScrollIndexFeature.cs | 17 ++ .../GlobalFeatures/GlobalCmsKitFeatures.cs | 3 + .../CmsKit/Localization/Resources/en.json | 4 +- .../CmsKit/Localization/Resources/tr.json | 4 +- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 167 +++++++++-------- .../Pages/Public/CmsKit/Blogs/blogPost.css | 17 ++ .../Pages/Public/CmsKit/Blogs/blogpost.js | 46 +++++ .../Public/CmsKit/Blogs/bootstrap-toc.css | 60 +++++++ .../Public/CmsKit/Blogs/bootstrap-toc.js | 168 ++++++++++++++++++ 9 files changed, 414 insertions(+), 72 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/BlogPostScrollIndexFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost.js create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.js diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/BlogPostScrollIndexFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/BlogPostScrollIndexFeature.cs new file mode 100644 index 0000000000..9f03f973e1 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/BlogPostScrollIndexFeature.cs @@ -0,0 +1,17 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures; + + +[GlobalFeatureName(Name)] +public class BlogPostScrollIndexFeature : GlobalFeature +{ + public const string Name = "CmsKit.BlogPost.ScrollIndex"; + + internal BlogPostScrollIndexFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit) + { + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index 9c07101616..6a7ca3245a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -26,6 +26,8 @@ public class GlobalCmsKitFeatures : GlobalModuleFeatures public MenuFeature Menu => GetFeature(); public GlobalResourcesFeature GlobalResources => GetFeature(); + + public BlogPostScrollIndexFeature BlogPostScrollIndex => GetFeature(); public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) : base(featureManager) @@ -40,5 +42,6 @@ public class GlobalCmsKitFeatures : GlobalModuleFeatures AddFeature(new CmsUserFeature(this)); AddFeature(new MenuFeature(this)); AddFeature(new GlobalResourcesFeature(this)); + AddFeature(new BlogPostScrollIndexFeature(this)); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 0dd826480d..2634099fd1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -164,6 +164,8 @@ "GlobalResources": "Global Resources", "Script": "Script", "Style": "Style", - "SavedSuccessfully": "Saved successfully" + "SavedSuccessfully": "Saved successfully", + "GoToTop": "Go to top", + "InThisDocument": "In this document" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 95ef414c17..00cc5303d4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -163,6 +163,8 @@ "GlobalResources": "Global Kaynaklar", "Script": "Script", "Style": "Style", - "SavedSuccessfully": "Başarıyla kaydedildi" + "SavedSuccessfully": "Başarıyla kaydedildi", + "GoToTop": "Yukarı Git", + "InThisDocument": "Bu belgede" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index d8c1f428da..90f16c18fd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -17,91 +17,118 @@ @inject IMarkdownToHtmlRenderer MarkdownRenderer @section styles{ - - - - + + + + + } @section scripts{ - - - - + + + + + + } @{ string dummyImageSource = "https://dummyimage.com/1280x720/a3a3a3/fff.png?text=" + Model.BlogPost.Title; + var isScrollIndexEnabled = GlobalFeatureManager.Instance.IsEnabled(); } - - - - -
-

@Model.BlogPost.Title

-

- @@@Model.BlogPost.Author?.UserName - @Model.BlogPost.CreationTime -

+
+
+ + + + +
+

@Model.BlogPost.Title

+

+ @@@Model.BlogPost.Author?.UserName + @Model.BlogPost.CreationTime +

- @if(!Model.BlogPost.Content.IsNullOrEmpty()) - { - @Html.Raw(await MarkdownRenderer.RenderAsync(Model.BlogPost.Content)) - } + @if (!Model.BlogPost.Content.IsNullOrEmpty()) + { + @Html.Raw(await MarkdownRenderer.RenderAsync(Model.BlogPost.Content)) + } -

- @if (Model.BlogPost.LastModificationTime != null) - { - @L["LastModification"].Value : @Model.BlogPost.LastModificationTime - } -

-
+

+ @if (Model.BlogPost.LastModificationTime != null) + { + @L["LastModification"].Value : @Model.BlogPost.LastModificationTime + } +

+
- @if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (Model.TagsFeature?.IsEnabled == true) - { - @await Component.InvokeAsync(typeof(TagViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) - } - } -
-
+ @if (GlobalFeatureManager.Instance.IsEnabled()) + { + if (Model.TagsFeature?.IsEnabled == true) + { + @await Component.InvokeAsync(typeof(TagViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) + } + } +
+ - - - @if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (Model.ReactionsFeature?.IsEnabled == true) - { - @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new + + + @if (GlobalFeatureManager.Instance.IsEnabled()) { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) - } - } - - - @if (GlobalFeatureManager.Instance.IsEnabled()) - { - if (Model.RatingsFeature?.IsEnabled == true) - { - @await Component.InvokeAsync(typeof(RatingViewComponent), new + if (Model.ReactionsFeature?.IsEnabled == true) + { + @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) + } + } + + + @if (GlobalFeatureManager.Instance.IsEnabled()) { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() - }) - } - } - - - - + if (Model.RatingsFeature?.IsEnabled == true) + { + @await Component.InvokeAsync(typeof(RatingViewComponent), new + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.BlogPost.Id.ToString() + }) + } + } + + + + +
+ @if (isScrollIndexEnabled) + { +
+
+
@L["InThisDocument"]
+ + + +
+
+ } + +
@if (GlobalFeatureManager.Instance.IsEnabled()) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css index 98c4a3100d..d09be3150d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogPost.css @@ -20,4 +20,21 @@ span.area-title { } .popover { min-width: 276px; +} + +#scroll-index { + position: sticky; + top: 20px; +} + +#scroll-index .scroll-top-btn.showup{ + display: block; +} + +#scroll-index .scroll-top-btn{ + display: none; + font-size: .85em; + color: #aaa; + text-decoration: none; + padding-left: 18px; } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost.js new file mode 100644 index 0000000000..603649e2c9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost.js @@ -0,0 +1,46 @@ +$(function () { + var $myNav = $('#blog-post-sticky-index'); + var $scrollToTopBtn = $('.scroll-top-btn'); + + window.Toc.helpers.createNavList = function () { + return $(''); + }; + + window.Toc.helpers.createChildNavList = function ($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }; + + window.Toc.helpers.generateNavEl = function (anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $(''); + $li.append($a); + return $li; + }; + + Toc.init($myNav); + + $('body').scrollspy({ + target: $myNav, + }); + + $scrollToTopBtn.click(function () { + $('html, body').animate({scrollTop: 0}, 'fast'); + }); + + // When the user scrolls down 20px from the top of the document, show the button + window.onscroll = function () { + scrollFunction() + }; + + function scrollFunction() { + if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) { + $scrollToTopBtn.addClass('showup'); + } else { + $scrollToTopBtn.removeClass('showup'); + } + } +}); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css new file mode 100644 index 0000000000..b15e18ee85 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.css @@ -0,0 +1,60 @@ +/*! + * Bootstrap Table of Contents v<%= version %> (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ + +/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ + +/* All levels of nav */ +nav[data-toggle='toc'] .nav > li > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; +} +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; +} +nav[data-toggle='toc'] .nav-link.active, +nav[data-toggle='toc'] .nav-link.active:hover, +nav[data-toggle='toc'] .nav-link.active:focus { + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; +} + +/* Nav: second level (shown on .active) */ +nav[data-toggle='toc'] .nav-link + ul { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} + +nav[data-toggle='toc'] .nav .nav > li > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; +} +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 29px; +} +nav[data-toggle='toc'] .nav .nav > li > .active, +nav[data-toggle='toc'] .nav .nav > li > .active:hover, +nav[data-toggle='toc'] .nav .nav > li > .active:focus { + padding-left: 28px; + font-weight: 500; +} + +nav[data-toggle='toc'] .nav-link.active + ul { + display: block; +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.js new file mode 100644 index 0000000000..13a4d1f6a5 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/bootstrap-toc.js @@ -0,0 +1,168 @@ +/*! + * Bootstrap Table of Contents v1.0.0 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +(function ($) { + 'use strict'; + + window.Toc = { + helpers: { + // return all matching elements in the set, or their descendants + findOrFilter: function ($el, selector) { + // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ + // http://stackoverflow.com/a/12731439/358804 + var $descendants = $el.find(selector); + return $el + .filter(selector) + .add($descendants) + .filter(':not([data-toc-skip])'); + }, + + generateUniqueIdBase: function (el) { + var text = $(el).text(); + var anchor = text + .trim() + .toLowerCase() + .replace(/[^A-Za-z0-9]+/g, '-'); + return anchor || el.tagName.toLowerCase(); + }, + + generateUniqueId: function (el) { + var anchorBase = this.generateUniqueIdBase(el); + for (var i = 0; ; i++) { + var anchor = anchorBase; + if (i > 0) { + // add suffix + anchor += '-' + i; + } + // check if ID already exists + if (!document.getElementById(anchor)) { + return anchor; + } + } + }, + + generateAnchor: function (el) { + if (el.id) { + return el.id; + } else { + var anchor = this.generateUniqueId(el); + el.id = anchor; + return anchor; + } + }, + + createNavList: function () { + return $(''); + }, + + createChildNavList: function ($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }, + + generateNavEl: function (anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $('
  • '); + $li.append($a); + return $li; + }, + + generateNavItem: function (headingEl) { + var anchor = this.generateAnchor(headingEl); + var $heading = $(headingEl); + var text = $heading.data('toc-text') || $heading.text(); + return this.generateNavEl(anchor, text); + }, + + // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). + getTopLevel: function ($scope) { + for (var i = 1; i <= 6; i++) { + var $headings = this.findOrFilter($scope, 'h' + i); + if ($headings.length > 1) { + return i; + } + } + + return 1; + }, + + // returns the elements for the top level, and the next below it + getHeadings: function ($scope, topLevel) { + var topSelector = 'h' + topLevel; + + var secondaryLevel = topLevel + 1; + var secondarySelector = 'h' + secondaryLevel; + + return this.findOrFilter( + $scope, + topSelector + ',' + secondarySelector + ); + }, + + getNavLevel: function (el) { + return parseInt(el.tagName.charAt(1), 10); + }, + + populateNav: function ($topContext, topLevel, $headings) { + var $context = $topContext; + var $prevNav; + + var helpers = this; + $headings.each(function (i, el) { + var $newNav = helpers.generateNavItem(el); + var navLevel = helpers.getNavLevel(el); + + // determine the proper $context + if (navLevel === topLevel) { + // use top level + $context = $topContext; + } else if ($prevNav && $context === $topContext) { + // create a new level of the tree and switch to it + $context = helpers.createChildNavList($prevNav); + } // else use the current $context + + $context.append($newNav); + + $prevNav = $newNav; + }); + }, + + parseOps: function (arg) { + var opts; + if (arg.jquery) { + opts = { + $nav: arg, + }; + } else { + opts = arg; + } + opts.$scope = opts.$scope || $(document.body); + return opts; + }, + }, + + // accepts a jQuery object, or an options object + init: function (opts) { + opts = this.helpers.parseOps(opts); + + // ensure that the data attribute is in place for styling + opts.$nav.attr('data-toggle', 'toc'); + + var $topContext = this.helpers.createChildNavList(opts.$nav); + var topLevel = this.helpers.getTopLevel(opts.$scope); + var $headings = this.helpers.getHeadings(opts.$scope, topLevel); + this.helpers.populateNav($topContext, topLevel, $headings); + }, + }; + + $(function () { + $('nav[data-toggle="toc"]').each(function (i, el) { + var $nav = $(el); + Toc.init($nav); + }); + }); +})(jQuery); From db9a022d1aad8c48156d5a01a14a1f5906323e2d Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Tue, 29 Mar 2022 23:55:11 +0300 Subject: [PATCH 098/242] import scroll index style and js file if feature enabled --- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index 2c29649dd3..d28a57889e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -16,28 +16,40 @@ @inject IMarkdownToHtmlRenderer MarkdownRenderer + +@{ + string dummyImageSource = "https://dummyimage.com/1280x720/a3a3a3/fff.png?text=" + Model.BlogPost.Title; + var isScrollIndexEnabled = GlobalFeatureManager.Instance.IsEnabled(); +} + @section styles{ + @if (isScrollIndexEnabled) + { + + + + } - } @section scripts{ + @if (isScrollIndexEnabled) + { + + + + } + - } -@{ - string dummyImageSource = "https://dummyimage.com/1280x720/a3a3a3/fff.png?text=" + Model.BlogPost.Title; - var isScrollIndexEnabled = GlobalFeatureManager.Instance.IsEnabled(); -} -
    From 7e0b99201881ba6ddf85ac27199b035e0391fdb6 Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Wed, 30 Mar 2022 00:12:57 +0300 Subject: [PATCH 099/242] use setting CoverImageMediaId to null and remove cover image in the update request --- .../Admin/Blogs/IBlogPostAdminAppService.cs | 1 - .../Admin/Blogs/BlogPostAdminAppService.cs | 21 ++++++------------- .../BlogPostAdminClientProxy.Generated.cs | 8 ------- .../Admin/Blogs/BlogPostAdminController.cs | 8 ------- .../Pages/CmsKit/BlogPosts/update.js | 8 ++----- 5 files changed, 8 insertions(+), 38 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index 23562020d4..14704a26ad 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -13,5 +13,4 @@ public interface IBlogPostAdminAppService CreateBlogPostDto, UpdateBlogPostDto> { - Task RemoveCoverImageAsync(Guid id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index ba346b752e..3c79e6220b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -69,8 +69,13 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.SetShortDescription(input.ShortDescription); blogPost.SetContent(input.Content); blogPost.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); + + if (blogPost.CoverImageMediaId != null && input.CoverImageMediaId == null) + { + await MediaDescriptorAdminAppService.DeleteAsync(blogPost.CoverImageMediaId.Value); + } blogPost.CoverImageMediaId = input.CoverImageMediaId; - + if (blogPost.Slug != input.Slug) { await BlogPostManager.SetSlugUrlAsync(blogPost, input.Slug); @@ -115,18 +120,4 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { await BlogPostRepository.DeleteAsync(id); } - - [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] - public virtual async Task RemoveCoverImageAsync(Guid id) - { - var blogPost = await BlogPostRepository.GetAsync(id); - if (blogPost?.CoverImageMediaId == null) - { - return; - } - - await MediaDescriptorAdminAppService.DeleteAsync(blogPost.CoverImageMediaId.Value); - - blogPost.CoverImageMediaId = null; - } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs index 0f201fb469..560ba4e2de 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs @@ -55,12 +55,4 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase Date: Wed, 30 Mar 2022 00:18:34 +0300 Subject: [PATCH 100/242] code clean --- .../Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs | 1 - .../Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs | 2 +- .../wwwroot/client-proxies/cms-kit-admin-proxy.js | 8 -------- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs index 14704a26ad..314b7a1def 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs @@ -1,5 +1,4 @@ using System; -using System.Threading.Tasks; using Volo.Abp.Application.Services; namespace Volo.CmsKit.Admin.Blogs; diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 3c79e6220b..d78571ba21 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -64,7 +64,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe public virtual async Task UpdateAsync(Guid id, UpdateBlogPostDto input) { var blogPost = await BlogPostRepository.GetAsync(id); - + blogPost.SetTitle(input.Title); blogPost.SetShortDescription(input.ShortDescription); blogPost.SetContent(input.Content); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 2cb7d2ab98..0a1424d92a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -391,14 +391,6 @@ }, ajaxParams)); }; - volo.cmsKit.admin.blogs.blogPostAdmin.removeCoverImage = function(id, ajaxParams) { - return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/cover-image', - type: 'DELETE', - dataType: null - }, ajaxParams)); - }; - })(); })(); From 69e2be7ba99d66c151ccfd7a05b42c827aae7994 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Mar 2022 11:30:34 +0800 Subject: [PATCH 101/242] Identity: Enhancements for Blazor UI --- .../Layout/PageHeader.razor | 2 +- .../Components/AbpExtensibleDataGrid.razor | 1 + .../Pages/Identity/RoleManagement.razor.cs | 5 ++++- .../Pages/Identity/UserManagement.razor | 6 ++++++ .../Pages/Identity/UserManagement.razor.cs | 15 +++++++++++++-- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor index e6959f1d3a..c9c704b471 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor @@ -7,7 +7,7 @@ @if(Options.Value.RenderPageTitle) { -

    @PageLayout.Title

    +
    @PageLayout.Title
    } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor index e7ea795eee..c674ec3612 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor @@ -11,6 +11,7 @@ CurrentPage="@CurrentPage" PageSize="@PageSize" Responsive="@Responsive" + Striped Class="@Class"> diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs index f14e5cef90..db5d7939d6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs @@ -64,7 +64,10 @@ public partial class RoleManagement new EntityAction { Text = L["Delete"], - Visible = (data) => HasDeletePermission, + Visible = (data) => + { + return HasDeletePermission && !data.As().IsStatic + }, Clicked = async (data) => await DeleteEntityAsync(data.As()), ConfirmationMessage = (data) => GetDeleteConfirmationMessage(data.As()) } diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index 2f632422c1..6fe89dd768 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -18,6 +18,12 @@ + + @L["Search"] + + + + @* ************************* DATA GRID ************************* *@ HasDeletePermission, + Visible = (data) => + { + return HasDeletePermission && CurrentUser.GetId() != data.As().Id; + }, Clicked = async (data) => await DeleteEntityAsync(data.As()), ConfirmationMessage = (data) => GetDeleteConfirmationMessage(data.As()) } @@ -180,7 +191,7 @@ public partial class UserManagement }, new TableColumn { - Title = L["Email"], + Title = L["EmailAddress"], Data = nameof(IdentityUserDto.Email), }, new TableColumn From c526630a38e067aa9bebaf52f9621fffc24076e7 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Mar 2022 11:41:00 +0800 Subject: [PATCH 102/242] Improved --- .../Pages/Identity/RoleManagement.razor.cs | 5 +---- .../Pages/Identity/UserManagement.razor.cs | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs index db5d7939d6..6a3052bea0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor.cs @@ -64,10 +64,7 @@ public partial class RoleManagement new EntityAction { Text = L["Delete"], - Visible = (data) => - { - return HasDeletePermission && !data.As().IsStatic - }, + Visible = (data) => HasDeletePermission && !data.As().IsStatic, Clicked = async (data) => await DeleteEntityAsync(data.As()), ConfirmationMessage = (data) => GetDeleteConfirmationMessage(data.As()) } diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs index dd754ed07f..462ce6ec72 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs @@ -162,10 +162,7 @@ public partial class UserManagement new EntityAction { Text = L["Delete"], - Visible = (data) => - { - return HasDeletePermission && CurrentUser.GetId() != data.As().Id; - }, + Visible = (data) => HasDeletePermission && CurrentUser.GetId() != data.As().Id, Clicked = async (data) => await DeleteEntityAsync(data.As()), ConfirmationMessage = (data) => GetDeleteConfirmationMessage(data.As()) } From b12d8f71c993e34444bcffe8ae6d82be46de489d Mon Sep 17 00:00:00 2001 From: Musa Demir Date: Wed, 30 Mar 2022 09:37:16 +0300 Subject: [PATCH 103/242] load blogpost-scroll-index when it's feature is enabled --- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 2 +- .../CmsKit/Blogs/{blogpost.js => blogpost-scroll-index.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/{blogpost.js => blogpost-scroll-index.js} (100%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index d28a57889e..709d96182f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -40,13 +40,13 @@ { + } - } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost-scroll-index.js similarity index 100% rename from modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost.js rename to modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/blogpost-scroll-index.js From 7aad8e5a25940f06e227de90edd22cd13fe18a9f Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 30 Mar 2022 10:38:04 +0300 Subject: [PATCH 104/242] Make select clearable --- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 32df5fb2fd..060f0c5c95 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -28,6 +28,8 @@ + +
    + +
    diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml index 725a9610dd..db0dd8422e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml @@ -7,6 +7,7 @@ @using Volo.Abp.Localization @using Volo.Abp.ObjectExtending @using Volo.Abp.Data +@using Volo.Abp.Identity @model EditModalModel @inject IHtmlLocalizer L @inject IStringLocalizerFactory StringLocalizerFactory @@ -25,7 +26,16 @@ - +
    + +
    + + +
    + +
    diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml index 1f7f338ba4..48ad716306 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml @@ -19,6 +19,7 @@ @section styles { + } @section scripts { diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.css b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.css new file mode 100644 index 0000000000..acdafe715a --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.css @@ -0,0 +1,7 @@ +/* + By default Microsoft Edge, adds password reveal button inside the password input. + https://docs.microsoft.com/en-us/microsoft-edge/web-platform/password-reveal + */ +::-ms-reveal { + display: none; +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js index 96ee7e5361..fcd3a72f52 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js @@ -2,12 +2,51 @@ var l = abp.localization.getResource('AbpIdentity'); var _identityUserAppService = volo.abp.identity.identityUser; - var _editModal = new abp.ModalManager( - abp.appPath + 'Identity/Users/EditModal' - ); - var _createModal = new abp.ModalManager( - abp.appPath + 'Identity/Users/CreateModal' - ); + + var togglePasswordVisibility = function () { + $("#PasswordVisibilityButton").click(function (e) { + var button = $(this); + var passwordInput = button.parent().find("input"); + if(!passwordInput) { + return; + } + + if(passwordInput.attr("type") === "password") { + passwordInput.attr("type", "text"); + } + else { + passwordInput.attr("type", "password"); + } + + var icon = button.find("i"); + if(icon) { + icon.toggleClass("fa-eye-slash").toggleClass("fa-eye"); + } + }); + } + + abp.modals.createUser = function () { + var initModal = function (publicApi, args) { + togglePasswordVisibility(); + }; + return { initModal: initModal }; + } + + abp.modals.editUser = function () { + var initModal = function (publicApi, args) { + togglePasswordVisibility(); + }; + return { initModal: initModal }; + } + + var _editModal = new abp.ModalManager({ + viewUrl: abp.appPath + 'Identity/Users/EditModal', + modalClass: "editUser" + }); + var _createModal = new abp.ModalManager({ + viewUrl: abp.appPath + 'Identity/Users/CreateModal', + modalClass: "createUser" + }); var _permissionsModal = new abp.ModalManager( abp.appPath + 'AbpPermissionManagement/PermissionManagementModal' ); @@ -44,9 +83,9 @@ }, { text: l('Delete'), - visible: abp.auth.isGranted( - 'AbpIdentity.Users.Delete' - ), + visible: function(data) { + return abp.auth.isGranted('AbpIdentity.Users.Delete') && abp.currentUser.id !== data.id; + }, confirmMessage: function (data) { return l( 'UserDeletionConfirmationMessage', diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs index 1c83245c63..6bee4b3c3d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AutoMapper; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Modularity; using Volo.Abp.SettingManagement.Web.Navigation; @@ -14,6 +15,7 @@ namespace Volo.Abp.SettingManagement.Web; [DependsOn( typeof(AbpSettingManagementApplicationContractsModule), + typeof(AbpAutoMapperModule), typeof(AbpAspNetCoreMvcUiThemeSharedModule), typeof(AbpSettingManagementDomainSharedModule) )] @@ -58,5 +60,11 @@ public class AbpSettingManagementWebModule : AbpModule { options.DisableModule(SettingManagementRemoteServiceConsts.ModuleName); }); + + context.Services.AddAutoMapperObjectMapper(); + Configure(options => + { + options.AddProfile(validate: true); + }); } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml index 974e316687..338c13f8a9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml @@ -1,14 +1,14 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.SettingManagement.Localization @inject IHtmlLocalizer L -@model Volo.Abp.SettingManagement.EmailSettingsDto +@model Volo.Abp.SettingManagement.UpdateEmailSettingsDto -
    +
    - - + + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js index a5b8288d41..c9871bb3d9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.js @@ -6,8 +6,12 @@ $("#EmailSettingsForm").on('submit', function (event) { event.preventDefault(); + + if(!$(this).valid()) { + return; + } + var form = $(this).serializeFormToObject(); - volo.abp.settingManagement.emailSettings.update(form).then(function (result) { $(document).trigger("AbpSettingSaved"); }); diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs index bd0e8d924e..f9c24e1369 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs @@ -16,8 +16,8 @@ public class EmailSettingGroupViewComponent : AbpViewComponent public virtual async Task InvokeAsync() { - var model = await EmailSettingsAppService.GetAsync(); - + var emailSettings = await EmailSettingsAppService.GetAsync(); + var model = ObjectMapper.Map(emailSettings); return View("~/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml", model); } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/SettingManagementWebAutoMapperProfile.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/SettingManagementWebAutoMapperProfile.cs new file mode 100644 index 0000000000..20ae382454 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/SettingManagementWebAutoMapperProfile.cs @@ -0,0 +1,11 @@ +using AutoMapper; + +namespace Volo.Abp.SettingManagement.Web; + +public class SettingManagementWebAutoMapperProfile : Profile +{ + public SettingManagementWebAutoMapperProfile() + { + CreateMap(); + } +} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj index c7cbc9c60b..b802865379 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj @@ -15,6 +15,7 @@ + From 2b514b8da898b63b21bc73c7b688f98e555b07e7 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Wed, 30 Mar 2022 14:42:35 +0300 Subject: [PATCH 109/242] PermissionManagement: Inform before removing all permissions --- .../Localization/Domain/en.json | 3 ++- .../PermissionManagementModal.cshtml | 2 +- .../permission-management-modal.js | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json index ba775f3ab0..98f3a60216 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/en.json @@ -5,6 +5,7 @@ "OnlyProviderPermissons": "Only this provider", "All": "All", "SelectAllInAllTabs": "Grant all permissions", - "SelectAllInThisTab": "Select all" + "SelectAllInThisTab": "Select all", + "RemoveAllPermissionsWarningMessage": "Are you sure you want to remove all permissions?" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml index adc5547693..31639bf136 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml @@ -9,7 +9,7 @@ Layout = null; } - + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js index c33106d884..09063b8c26 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js @@ -3,6 +3,8 @@ var abp = abp || {}; abp.modals = abp.modals || {}; abp.modals.PermissionManagement = function () { + var l = abp.localization.getResource("AbpPermissionManagement"); + function checkParents($tab, $checkBox) { var parentName = $checkBox .closest('.custom-checkbox') @@ -255,6 +257,26 @@ var abp = abp || {}; initSelectAllInThisTab(); setSelectAllInAllTabs(); + + var $form = $("#PermissionManagementForm"); + var $submitButton = $form.find("button[type='submit']"); + if($submitButton) { + $submitButton.click(function (e) { + e.preventDefault(); + + if(!$form.find("input:checked").length > 0) { + abp.message.confirm(l("RemoveAllPermissionsWarningMessage")) + .then(function (confirmed) { + if(!confirmed) { + return false; + } + }); + } + + $submitButton.submit(); + }); + } + }; }; })(jQuery); From 4cceac737d28d91a4470cbe06ea822fbedbcf9ed Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Wed, 30 Mar 2022 15:29:42 +0300 Subject: [PATCH 110/242] Update permission-management-modal.js --- .../permission-management-modal.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js index 09063b8c26..208047314c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js @@ -267,13 +267,14 @@ var abp = abp || {}; if(!$form.find("input:checked").length > 0) { abp.message.confirm(l("RemoveAllPermissionsWarningMessage")) .then(function (confirmed) { - if(!confirmed) { - return false; + if(confirmed) { + $form.submit(); } }); } - - $submitButton.submit(); + else { + $form.submit(); + } }); } From d484affc5b46dd7d7f88bc2a2a6af0bf01e08bd7 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 30 Mar 2022 20:24:42 +0300 Subject: [PATCH 111/242] Add document of date pipes --- docs/en/UI/Angular/DateTime-Format-Pipe.md | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 docs/en/UI/Angular/DateTime-Format-Pipe.md diff --git a/docs/en/UI/Angular/DateTime-Format-Pipe.md b/docs/en/UI/Angular/DateTime-Format-Pipe.md new file mode 100644 index 0000000000..4841ffe665 --- /dev/null +++ b/docs/en/UI/Angular/DateTime-Format-Pipe.md @@ -0,0 +1,29 @@ +# DateTime Format Pipes + +You can format date by Date pipe of angular. + +Example + +```html + {{today | date 'dd/mm/yy'}} +``` + +ShortDate, ShortTime and ShortDateTime format data like angular's data pipe but easier. Also the pipes get format from config service by culture. + +# ShortDate Pipe + +```html + {{today | shortDatePipe }} +``` + +# ShortTime Pipe + +```html + {{today | shortTimePipe }} +``` + +# ShortDateTime Pipe + +```html + {{today | shortDateTimePipe }} +``` From 6f6993471d5fcf125729680b02e2cc252094355e Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 31 Mar 2022 10:05:56 +0800 Subject: [PATCH 112/242] Add `TimeZone` and `Queue` to `IHangfireBackgroundWorker`. Resolve #12095 --- .../Hangfire/HangfireBackgroundWorkerBase.cs | 13 ++++++++++++- .../Hangfire/HangfireBackgroundWorkerManager.cs | 7 ++++--- .../HangfirePeriodicBackgroundWorkerAdapter.cs | 2 +- .../Hangfire/IHangfireBackgroundWorker.cs | 7 ++++++- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs index 466fbe457f..dfeda11df8 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace Volo.Abp.BackgroundWorkers.Hangfire; @@ -7,6 +8,16 @@ public abstract class HangfireBackgroundWorkerBase : BackgroundWorkerBase, IHang public string RecurringJobId { get; set; } public string CronExpression { get; set; } + + public TimeZoneInfo TimeZone { get; set; } + + public string Queue { get; set; } public abstract Task DoWorkAsync(); + + protected HangfireBackgroundWorkerBase() + { + TimeZone = null; + Queue = "default"; + } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 89d6105967..b2cb275dab 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -40,12 +40,13 @@ public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingle var unProxyWorker = ProxyHelper.UnProxy(hangfireBackgroundWorker); if (hangfireBackgroundWorker.RecurringJobId.IsNullOrWhiteSpace()) { - RecurringJob.AddOrUpdate(() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), hangfireBackgroundWorker.CronExpression); + RecurringJob.AddOrUpdate(() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), + hangfireBackgroundWorker.CronExpression, hangfireBackgroundWorker.TimeZone, hangfireBackgroundWorker.Queue); } else { RecurringJob.AddOrUpdate(hangfireBackgroundWorker.RecurringJobId, () => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), - hangfireBackgroundWorker.CronExpression); + hangfireBackgroundWorker.CronExpression, hangfireBackgroundWorker.TimeZone, hangfireBackgroundWorker.Queue); } } else @@ -79,7 +80,7 @@ public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingle var adapterType = typeof(HangfirePeriodicBackgroundWorkerAdapter<>).MakeGenericType(ProxyHelper.GetUnProxiedType(worker)); var workerAdapter = Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker; - RecurringJob.AddOrUpdate(() => workerAdapter.DoWorkAsync(), GetCron(period.Value)); + RecurringJob.AddOrUpdate(() => workerAdapter.DoWorkAsync(), GetCron(period.Value), workerAdapter.TimeZone, workerAdapter.Queue); } return Task.CompletedTask; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs index 483210ace6..8fe24f10ed 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs @@ -17,7 +17,7 @@ public class HangfirePeriodicBackgroundWorkerAdapter : HangfireBackgrou _doWorkMethod = typeof(TWorker).GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic); } - public override async Task DoWorkAsync() + public async override Task DoWorkAsync() { var workerContext = new PeriodicBackgroundWorkerContext(ServiceProvider); var worker = ServiceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs index 0b8c89e95b..7402d8427a 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace Volo.Abp.BackgroundWorkers.Hangfire; @@ -7,6 +8,10 @@ public interface IHangfireBackgroundWorker : IBackgroundWorker string RecurringJobId { get; set; } string CronExpression { get; set; } + + TimeZoneInfo TimeZone { get; set; } + + string Queue { get; set; } Task DoWorkAsync(); } From f373329a935994cb071a99ba2f8d5be19485c463 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Thu, 31 Mar 2022 14:22:10 +0300 Subject: [PATCH 113/242] Improve EmailSettingGroupViewComponent --- .../EmailSettingGroup/Default.cshtml | 2 +- .../EmailSettingGroupViewComponent.cs | 38 ++++++++++++++++++- .../SettingManagementWebAutoMapperProfile.cs | 3 +- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml index 338c13f8a9..0a46e4f0fa 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml @@ -1,7 +1,7 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.SettingManagement.Localization @inject IHtmlLocalizer L -@model Volo.Abp.SettingManagement.UpdateEmailSettingsDto +@model Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup.EmailSettingGroupViewComponent.UpdateEmailSettingsViewModel diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs index f9c24e1369..b60823a621 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs @@ -1,6 +1,8 @@ -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Auditing; namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup; @@ -17,7 +19,39 @@ public class EmailSettingGroupViewComponent : AbpViewComponent public virtual async Task InvokeAsync() { var emailSettings = await EmailSettingsAppService.GetAsync(); - var model = ObjectMapper.Map(emailSettings); + var model = ObjectMapper.Map(emailSettings); return View("~/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml", model); } + + public class UpdateEmailSettingsViewModel + { + [MaxLength(256)] + public string SmtpHost { get; set; } + + [Range(1, 65535)] + public int SmtpPort { get; set; } + + [MaxLength(1024)] + public string SmtpUserName { get; set; } + + [MaxLength(1024)] + [DataType(DataType.Password)] + [DisableAuditing] + public string SmtpPassword { get; set; } + + [MaxLength(1024)] + public string SmtpDomain { get; set; } + + public bool SmtpEnableSsl { get; set; } + + public bool SmtpUseDefaultCredentials { get; set; } + + [MaxLength(1024)] + [Required] + public string DefaultFromAddress { get; set; } + + [MaxLength(1024)] + [Required] + public string DefaultFromDisplayName { get; set; } + } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/SettingManagementWebAutoMapperProfile.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/SettingManagementWebAutoMapperProfile.cs index 20ae382454..19e512da56 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/SettingManagementWebAutoMapperProfile.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/SettingManagementWebAutoMapperProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup; namespace Volo.Abp.SettingManagement.Web; @@ -6,6 +7,6 @@ public class SettingManagementWebAutoMapperProfile : Profile { public SettingManagementWebAutoMapperProfile() { - CreateMap(); + CreateMap(); } } \ No newline at end of file From 86657e22580542ab704347dfbd1a2e4c8f7ac7b7 Mon Sep 17 00:00:00 2001 From: braim23 <94292623+braim23@users.noreply.github.com> Date: Thu, 31 Mar 2022 15:03:48 +0300 Subject: [PATCH 114/242] Adding the Purchase Order Localization --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 9f8e88f180..18c5524d1f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -381,6 +381,7 @@ "SuccessfullyUpdated": "Successfully updated", "SuccessfullyAdded": "Successfully added", "PurchaseState": "Purchase State", - "ShowBetweenDayCount": "Show Between Days" + "ShowBetweenDayCount": "Show Between Days", + "PurchaseOrder": "Purchase Order" } } \ No newline at end of file From 55d96e41558fc6ecb7b1c95e0fe55eba65582a9c Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 31 Mar 2022 20:26:36 +0800 Subject: [PATCH 115/242] Fix localization problem --- .../AbpSettingManagementDomainSharedModule.cs | 5 +++- .../AbpSettingManagementWebModule.cs | 8 ++++++ .../EmailSettingGroup/Default.cshtml | 26 ++++++++++--------- .../EmailSettingGroupViewComponent.cs | 9 +++++++ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/AbpSettingManagementDomainSharedModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/AbpSettingManagementDomainSharedModule.cs index 012133e10b..7e19e63a2f 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/AbpSettingManagementDomainSharedModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/AbpSettingManagementDomainSharedModule.cs @@ -3,6 +3,7 @@ using Volo.Abp.Modularity; using Volo.Abp.Localization; using Volo.Abp.SettingManagement.Localization; using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.SettingManagement; @@ -23,7 +24,9 @@ public class AbpSettingManagementDomainSharedModule : AbpModule { options.Resources .Add("en") - .AddVirtualJson("/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement"); + .AddBaseTypes( + typeof(AbpValidationResource) + ).AddVirtualJson("/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement"); }); } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs index 6bee4b3c3d..61874c0b6b 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs @@ -1,10 +1,12 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AutoMapper; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement.Localization; using Volo.Abp.SettingManagement.Web.Navigation; using Volo.Abp.SettingManagement.Web.Pages.SettingManagement; using Volo.Abp.SettingManagement.Web.Settings; @@ -23,6 +25,11 @@ public class AbpSettingManagementWebModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { + context.Services.PreConfigure(options => + { + options.AddAssemblyResource(typeof(AbpSettingManagementResource), typeof(AbpSettingManagementWebModule).Assembly); + }); + PreConfigure(mvcBuilder => { mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpSettingManagementWebModule).Assembly); @@ -31,6 +38,7 @@ public class AbpSettingManagementWebModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { + Configure(options => { options.MenuContributors.Add(new SettingManagementMainMenuContributor()); diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml index 0a46e4f0fa..e5d20309f6 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml @@ -7,22 +7,24 @@
    - - - - - - + + + + + +
    - - - + + +
    -
    +
    - @L["Save"] + + @L["Save"] +
    - + \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs index b60823a621..83458b28e2 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/EmailSettingGroupViewComponent.cs @@ -26,32 +26,41 @@ public class EmailSettingGroupViewComponent : AbpViewComponent public class UpdateEmailSettingsViewModel { [MaxLength(256)] + [Display(Name = "SmtpHost")] public string SmtpHost { get; set; } [Range(1, 65535)] + [Display(Name = "SmtpPort")] public int SmtpPort { get; set; } [MaxLength(1024)] + [Display(Name = "SmtpUserName")] public string SmtpUserName { get; set; } [MaxLength(1024)] [DataType(DataType.Password)] [DisableAuditing] + [Display(Name = "SmtpPassword")] public string SmtpPassword { get; set; } [MaxLength(1024)] + [Display(Name = "SmtpDomain")] public string SmtpDomain { get; set; } + [Display(Name = "SmtpEnableSsl")] public bool SmtpEnableSsl { get; set; } + [Display(Name = "SmtpUseDefaultCredentials")] public bool SmtpUseDefaultCredentials { get; set; } [MaxLength(1024)] [Required] + [Display(Name = "DefaultFromAddress")] public string DefaultFromAddress { get; set; } [MaxLength(1024)] [Required] + [Display(Name = "DefaultFromDisplayName")] public string DefaultFromDisplayName { get; set; } } } From 8d24bb661aed4eefc0c07f095772d3a645b5fe16 Mon Sep 17 00:00:00 2001 From: rqx110 Date: Sat, 2 Apr 2022 09:06:34 +0800 Subject: [PATCH 116/242] make show blazor ui message alert extendable --- .../Components/UiMessageAlert.razor.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs index f0c8fa8aff..d913a966b0 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs @@ -94,7 +94,12 @@ public partial class UiMessageAlert : ComponentBase, IDisposable Options = e.Options; Callback = e.Callback; - await InvokeAsync(ModalRef.Show); + await ShowMessageAlert(); + } + + protected virtual Task ShowMessageAlert() + { + return InvokeAsync(ModalRef.Show); } public void Dispose() From 3b25e359a3fdce21cb4e7f0281a15187169f7d05 Mon Sep 17 00:00:00 2001 From: rqx110 Date: Sat, 2 Apr 2022 10:02:41 +0800 Subject: [PATCH 117/242] uses async/await instead of return task --- .../Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs index d913a966b0..c7fe013b3c 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs @@ -97,9 +97,9 @@ public partial class UiMessageAlert : ComponentBase, IDisposable await ShowMessageAlert(); } - protected virtual Task ShowMessageAlert() + protected virtual async Task ShowMessageAlert() { - return InvokeAsync(ModalRef.Show); + await InvokeAsync(ModalRef.Show); } public void Dispose() From f14853785eb0043f9227b13ab0628e333924e5ae Mon Sep 17 00:00:00 2001 From: braim23 <94292623+braim23@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:41:41 +0300 Subject: [PATCH 118/242] Update SolutionModuleAdder.cs --- .../Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs index 310e613035..e7ab27613e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs @@ -100,7 +100,7 @@ public class SolutionModuleAdder : ITransientDependency Check.NotNull(solutionFile, nameof(solutionFile)); Check.NotNull(moduleName, nameof(moduleName)); - await PublishEventAsync(1, "Retriving module info..."); + await PublishEventAsync(1, "Retrieving module info..."); var module = await GetModuleInfoAsync(moduleName, newTemplate, newProTemplate); From ce45aea0b2fc53462bf26e5e449b3acc675781ed Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 4 Apr 2022 17:45:54 +0800 Subject: [PATCH 119/242] Some enhancements for Blazor UI --- .../Pages/Identity/UserManagement.razor | 35 ++++++++---- .../Pages/Identity/UserManagement.razor.cs | 17 +++++- .../PermissionManagementModal.razor.cs | 9 +++ .../EmailSettingGroupViewComponent.razor | 6 +- .../EmailSettingGroupViewComponent.razor.cs | 56 +++++++++++++++++-- ...ettingManagementBlazorAutoMapperProfile.cs | 4 +- 6 files changed, 108 insertions(+), 19 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index 6fe89dd768..5b67c74784 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -89,11 +89,18 @@ @L["DisplayName:Password"] - - - - - + + + + + + + + + + + + @@ -203,11 +210,19 @@ @L["DisplayName:Password"] - - - - - + + + + + + + + + + + + + diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs index 462ce6ec72..db9a718949 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor.cs @@ -39,7 +39,8 @@ public partial class UserManagement protected PageToolbar Toolbar { get; } = new(); private List UserManagementTableColumns => TableColumns.Get(); - + private TextRole _passwordTextRole = TextRole.Password; + public UserManagement() { ObjectMapperContext = typeof(AbpIdentityBlazorModule); @@ -90,6 +91,7 @@ public partial class UserManagement IsAssigned = x.IsDefault }).ToArray(); + ChangePasswordTextRole(TextRole.Password); return base.OpenCreateModalAsync(); } @@ -115,6 +117,7 @@ public partial class UserManagement IsAssigned = userRoleNames.Contains(x.Name) }).ToArray(); + ChangePasswordTextRole(TextRole.Password); await base.OpenEditModalAsync(entity); } catch (Exception ex) @@ -211,6 +214,18 @@ public partial class UserManagement return base.SetToolbarItemsAsync(); } + + protected virtual void ChangePasswordTextRole(TextRole? textRole) + { + if (textRole == null) + { + ChangePasswordTextRole(_passwordTextRole == TextRole.Password ? TextRole.Text: TextRole.Password); + } + else + { + _passwordTextRole = textRole.Value; + } + } } public class AssignedRoleViewModel diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs index 2a908140b5..6683690002 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs @@ -122,6 +122,7 @@ public partial class PermissionManagementModal { try { + var updateDto = new UpdatePermissionsDto { Permissions = _groups @@ -129,6 +130,14 @@ public partial class PermissionManagementModal .Select(p => new UpdatePermissionDto { IsGranted = p.IsGranted, Name = p.Name }) .ToArray() }; + + if (!updateDto.Permissions.Any(x => x.IsGranted)) + { + if (!await Message.Confirm(L["RemoveAllPermissionsWarningMessage"].Value)) + { + return; + } + } await PermissionAppService.UpdateAsync(_providerName, _providerKey, updateDto); diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor index 6037231df0..36d5857776 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor @@ -5,12 +5,12 @@ @if (EmailSettings != null) {
    - + - @L["DefaultFromDisplayName"] + @L["DefaultFromDisplayName"] * @@ -20,7 +20,7 @@ - @L["DefaultFromAddress"] + @L["DefaultFromAddress"] * diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs index 9e5638bfd9..1cd8ceeb1b 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs @@ -1,9 +1,11 @@ using System; +using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Blazorise; using Microsoft.AspNetCore.Components; using Volo.Abp.AspNetCore.Components.Messages; using Volo.Abp.AspNetCore.Components.Web.Configuration; +using Volo.Abp.Auditing; using Volo.Abp.SettingManagement.Localization; namespace Volo.Abp.SettingManagement.Blazor.Pages.SettingManagement.EmailSettingGroup; @@ -19,9 +21,9 @@ public partial class EmailSettingGroupViewComponent [Inject] protected IUiMessageService UiMessageService { get; set; } - protected EmailSettingsDto EmailSettings; + protected UpdateEmailSettingsViewModel EmailSettings; - protected Validations IdentitySettingValidation; + protected Validations EmailSettingValidation; public EmailSettingGroupViewComponent() { @@ -33,7 +35,7 @@ public partial class EmailSettingGroupViewComponent { try { - EmailSettings = await EmailSettingsAppService.GetAsync(); + EmailSettings = ObjectMapper.Map(await EmailSettingsAppService.GetAsync()); } catch (Exception ex) { @@ -45,7 +47,12 @@ public partial class EmailSettingGroupViewComponent { try { - await EmailSettingsAppService.UpdateAsync(ObjectMapper.Map(EmailSettings)); + if (!await EmailSettingValidation.ValidateAll()) + { + return; + } + + await EmailSettingsAppService.UpdateAsync(ObjectMapper.Map(EmailSettings)); await CurrentApplicationConfigurationCacheResetService.ResetAsync(); @@ -56,4 +63,45 @@ public partial class EmailSettingGroupViewComponent await HandleErrorAsync(ex); } } + + public class UpdateEmailSettingsViewModel + { + [MaxLength(256)] + [Display(Name = "SmtpHost")] + public string SmtpHost { get; set; } + + [Range(1, 65535)] + [Display(Name = "SmtpPort")] + public int SmtpPort { get; set; } + + [MaxLength(1024)] + [Display(Name = "SmtpUserName")] + public string SmtpUserName { get; set; } + + [MaxLength(1024)] + [DataType(DataType.Password)] + [DisableAuditing] + [Display(Name = "SmtpPassword")] + public string SmtpPassword { get; set; } + + [MaxLength(1024)] + [Display(Name = "SmtpDomain")] + public string SmtpDomain { get; set; } + + [Display(Name = "SmtpEnableSsl")] + public bool SmtpEnableSsl { get; set; } + + [Display(Name = "SmtpUseDefaultCredentials")] + public bool SmtpUseDefaultCredentials { get; set; } + + [MaxLength(1024)] + [Required] + [Display(Name = "DefaultFromAddress")] + public string DefaultFromAddress { get; set; } + + [MaxLength(1024)] + [Required] + [Display(Name = "DefaultFromDisplayName")] + public string DefaultFromDisplayName { get; set; } + } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs index d5309e0aff..38279c09d4 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/SettingManagementBlazorAutoMapperProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Volo.Abp.SettingManagement.Blazor.Pages.SettingManagement.EmailSettingGroup; namespace Volo.Abp.SettingManagement.Blazor; @@ -6,6 +7,7 @@ public class SettingManagementBlazorAutoMapperProfile : Profile { public SettingManagementBlazorAutoMapperProfile() { - CreateMap(); + CreateMap(); + CreateMap(); } } From e1a1519e0227f5b623193255dcc3a8e77ed2ef9f Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Tue, 5 Apr 2022 04:03:01 +0300 Subject: [PATCH 120/242] add migrate database ps --- templates/app-nolayers/aspnet-core/migrate-database.ps1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 templates/app-nolayers/aspnet-core/migrate-database.ps1 diff --git a/templates/app-nolayers/aspnet-core/migrate-database.ps1 b/templates/app-nolayers/aspnet-core/migrate-database.ps1 new file mode 100644 index 0000000000..3af47fcb21 --- /dev/null +++ b/templates/app-nolayers/aspnet-core/migrate-database.ps1 @@ -0,0 +1 @@ +dotnet run --migrate-database \ No newline at end of file From f56da4506f1cc981cc39810f7fef6b8a68fa0c6f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 5 Apr 2022 11:05:54 +0800 Subject: [PATCH 121/242] Update UserManagement.razor --- .../Pages/Identity/UserManagement.razor | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index 5b67c74784..fdd979b2a0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -19,10 +19,16 @@ - @L["Search"] - - - + + + + + + + + + + @* ************************* DATA GRID ************************* *@ - - - + @@ -213,16 +217,13 @@ - - - - + From f3893e3c2e3c54fd3ad747e589036de5e55bbecc Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Tue, 5 Apr 2022 09:44:21 +0300 Subject: [PATCH 122/242] Update MyProjectNameWebHostModule.cs --- .../MyProjectNameWebHostModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs index 95f2d69043..874e5a9eb5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs @@ -193,7 +193,7 @@ public class MyProjectNameWebHostModule : AbpModule options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}permission-management{0}src{0}Volo.Abp.PermissionManagement.Web", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}identity{0}src{0}Volo.Abp.Identity.Web", Path.DirectorySeparatorChar))); // - options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar))); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain.Shared", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Web", Path.DirectorySeparatorChar))); }); From 49e9491d3b103618757d65e0d32a26904f350047 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 5 Apr 2022 10:51:31 +0300 Subject: [PATCH 123/242] Add BlogFeatureDataSeedContributor --- .../Blogs/BlogFeatureDataSeedContributor.cs | 29 +++++++++++++++++++ .../Volo/CmsKit/Blogs/BlogFeatureManager.cs | 20 +++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs new file mode 100644 index 0000000000..b212e5e21a --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Volo.CmsKit.Blogs; + +public class BlogFeatureDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + private readonly BlogFeatureManager _blogFeatureManager; + private readonly IBlogRepository _blogRepository; + + public BlogFeatureDataSeedContributor( + BlogFeatureManager blogFeatureManager, + IBlogRepository blogRepository) + { + _blogFeatureManager = blogFeatureManager; + _blogRepository = blogRepository; + } + + public async Task SeedAsync(DataSeedContext context) + { + var blogs = await _blogRepository.GetListAsync(); + + foreach (var blog in blogs) + { + await _blogFeatureManager.SetDefaultsIfNotSetAsync(blog.Id); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs index 77a519daf3..f9dd101ef9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs @@ -44,4 +44,24 @@ public class BlogFeatureManager : DomainService await SetAsync(blogId, feature.FeatureName, isEnabled: true); } } + + public async Task SetIfNotSetAsync(Guid blogId, string featureName, bool isEnabled) + { + var blogFeature = await BlogFeatureRepository.FindAsync(blogId, featureName); + if (blogFeature == null) + { + var newBlogFeature = new BlogFeature(blogId, featureName, isEnabled); + await BlogFeatureRepository.InsertAsync(newBlogFeature); + } + } + + public async Task SetDefaultsIfNotSetAsync(Guid blogId) + { + var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId); + + foreach (var feature in defaultFeatures) + { + await SetIfNotSetAsync(blogId, feature.FeatureName, isEnabled: true); + } + } } From dad1f8505c8b91121b6ff0382e8fe101bfe97cad Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 5 Apr 2022 14:00:35 +0300 Subject: [PATCH 124/242] Add PWA Support to template --- .../Commands/ProjectCreationCommandBase.cs | 11 +++++ .../Building/Steps/RemoveFileStep.cs | 21 ++++++++ .../Templates/App/AppTemplateBase.cs | 18 +++++++ .../MyCompanyName.MyProjectName.Blazor.csproj | 6 +++ .../wwwroot/manifest.json | 21 ++++++++ .../wwwroot/service-worker.js | 4 ++ .../wwwroot/service-worker.published.js | 48 +++++++++++++++++++ 7 files changed, 129 insertions(+) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveFileStep.cs create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/manifest.json create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.js create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.published.js diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index d638a21f87..860147c584 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -48,6 +48,12 @@ public abstract class ProjectCreationCommandBase Logger.LogInformation("Preview: yes"); } + var pwa = commandLineArgs.Options.ContainsKey(Options.ProgressiveWebApp.Short); + if (pwa) + { + Logger.LogInformation("Progressive Web App: yes"); + } + var databaseProvider = GetDatabaseProvider(commandLineArgs); if (databaseProvider != DatabaseProvider.NotSpecified) { @@ -476,5 +482,10 @@ public abstract class ProjectCreationCommandBase { public const string Long = "preview"; } + + public static class ProgressiveWebApp + { + public const string Short = "pwa"; + } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveFileStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveFileStep.cs new file mode 100644 index 0000000000..203a927536 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveFileStep.cs @@ -0,0 +1,21 @@ +using System; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; + +public class RemoveFileStep : ProjectBuildPipelineStep +{ + private readonly string _filePath; + public RemoveFileStep(string filePath) + { + _filePath = filePath; + } + + public override void Execute(ProjectBuildContext context) + { + var fileToRemove = context.Files.Find(x => x.Name.EndsWith(_filePath)); + if (fileToRemove != null) + { + context.Files.Remove(fileToRemove); + } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 20b72cdc50..e232629e5a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -209,6 +209,15 @@ public abstract class AppTemplateBase : TemplateInfo { RemoveCmsKitDependenciesFromPackageJsonFiles(steps); } + + if (context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.ProgressiveWebApp.Short)) + { + context.Symbols.Add("PWA"); + } + else + { + RemovePwaFiles(steps); + } } protected static void RemoveCmsKitDependenciesFromPackageJsonFiles(List steps) @@ -238,6 +247,15 @@ public abstract class AppTemplateBase : TemplateInfo } } + protected static void RemovePwaFiles(List steps) + { + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.js")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.published.js")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/manifest.json")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-192.png")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-512.png")); + } + protected bool IsCmsKitSupportedForTargetVersion(ProjectBuildContext context) { if (string.IsNullOrWhiteSpace(context.BuildArgs.Version)) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 593ebf5868..32ab98eba9 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -29,4 +29,10 @@ + + + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/manifest.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/manifest.json new file mode 100644 index 0000000000..eefb83cb28 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "MyProjectName", + "short_name": "MyCompanyName.MyProjectName", + "start_url": "./", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#03173d", + "prefer_related_applications": false, + "icons": [ + { + "src": "icon-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "icon-192.png", + "type": "image/png", + "sizes": "192x192" + } + ] +} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.js b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.js new file mode 100644 index 0000000000..fe614daee0 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.js @@ -0,0 +1,4 @@ +// In development, always fetch from the network and do not enable offline support. +// This is because caching would make development more difficult (changes would not +// be reflected on the first load after each change). +self.addEventListener('fetch', () => { }); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.published.js b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.published.js new file mode 100644 index 0000000000..0d9986fce1 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.published.js @@ -0,0 +1,48 @@ +// Caution! Be sure you understand the caveats before publishing an application with +// offline support. See https://aka.ms/blazor-offline-considerations + +self.importScripts('./service-worker-assets.js'); +self.addEventListener('install', event => event.waitUntil(onInstall(event))); +self.addEventListener('activate', event => event.waitUntil(onActivate(event))); +self.addEventListener('fetch', event => event.respondWith(onFetch(event))); + +const cacheNamePrefix = 'offline-cache-'; +const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`; +const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ]; +const offlineAssetsExclude = [ /^service-worker\.js$/ ]; + +async function onInstall(event) { + console.info('Service worker: Install'); + + // Fetch and cache all matching items from the assets manifest + const assetsRequests = self.assetsManifest.assets + .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url))) + .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url))) + .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' })); + await caches.open(cacheName).then(cache => cache.addAll(assetsRequests)); +} + +async function onActivate(event) { + console.info('Service worker: Activate'); + + // Delete unused caches + const cacheKeys = await caches.keys(); + await Promise.all(cacheKeys + .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName) + .map(key => caches.delete(key))); +} + +async function onFetch(event) { + let cachedResponse = null; + if (event.request.method === 'GET') { + // For all navigation requests, try to serve index.html from cache + // If you need some URLs to be server-rendered, edit the following check to exclude those URLs + const shouldServeIndexHtml = event.request.mode === 'navigate'; + + const request = shouldServeIndexHtml ? 'index.html' : event.request; + const cache = await caches.open(cacheName); + cachedResponse = await cache.match(request); + } + + return cachedResponse || fetch(event.request); +} From f748c9375d55c46738d30ea1bbe0923df4427eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 5 Apr 2022 14:34:05 +0300 Subject: [PATCH 125/242] Blog post for 5.2 stable release. --- .../2022-04-05 v5_2_Release_Stable/POST.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md diff --git a/docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md b/docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md new file mode 100644 index 0000000000..3575fb396f --- /dev/null +++ b/docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md @@ -0,0 +1,49 @@ +# ABP.IO Platform 5.2 Final Has Been Released! + +[ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) 5.2 versions have been released today. + +## What's New With 5.2? + +Since all the new features are already explained in details with the [5.2 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published), I will not repeat all the details again. See the [RC Blog Post](https://blog.abp.io/abp/ABP.IO-Platform-5-2-RC-Has-Been-Published) for all the features and enhancements. + +## Creating New Solutions + +You can create a new solution with the ABP Framework version 5.2 by either using the `abp new` command or using the **direct download** tab on the [get started page](https://abp.io/get-started). + +> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for more. + +## How to Upgrade an Existing Solution + +### Install/Update the ABP CLI + +First of all, install the ABP CLI or upgrade to the latest version. + +If you haven't installed yet: + +```bash +dotnet tool install -g Volo.Abp.Cli +``` + +To update an existing installation: + +```bash +dotnet tool update -g Volo.Abp.Cli +``` + +### ABP UPDATE Command + +[ABP CLI](https://docs.abp.io/en/abp/latest/CLI) provides a handy command to update all the ABP related NuGet and NPM packages in your solution with a single command: + +```bash +abp update +``` + +Run this command in the root folder of your solution. + +## Migration Guide + +Check [the migration guide](https://docs.abp.io/en/abp/5.2/Migration-Guides/Abp-5_2) for the applications with the version 5.x upgrading to the version 5.2. + +## About the Next Version + +The next feature version will be 5.3. It is planned to release the 5.3 RC (Release Candidate) on May 03 and the final version on May 31, 2022. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). From aa89d0bb1fea74c8b94eda0af4fdbc29866ccc1a Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Tue, 5 Apr 2022 16:25:32 +0300 Subject: [PATCH 126/242] Add missing assets to index.html for blazor pwa support --- .../Building/Steps/TemplateCodeDeleteStep.cs | 6 +++++- .../MyCompanyName.MyProjectName.Blazor.csproj | 3 +++ .../wwwroot/icon-192.png | Bin 0 -> 2626 bytes .../wwwroot/icon-512.png | Bin 0 -> 6311 bytes .../wwwroot/index.html | 10 ++++++++++ 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-192.png create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-512.png diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs index 69dada9a8e..39186e900c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs @@ -8,7 +8,11 @@ public class TemplateCodeDeleteStep : ProjectBuildPipelineStep { foreach (var file in context.Files) { - if (file.Name.EndsWith(".cs") || file.Name.EndsWith(".csproj") || file.Name.EndsWith(".cshtml") || file.Name.EndsWith(".json")) + if (file.Name.EndsWith(".cs") || + file.Name.EndsWith(".csproj") || + file.Name.EndsWith(".cshtml") || + file.Name.EndsWith(".json") || + file.Name.EndsWith(".html")) { file.RemoveTemplateCode(context.Symbols); file.RemoveTemplateCodeMarkers(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 32ab98eba9..93f45f455d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -5,6 +5,9 @@ net6.0 true + + service-worker-assets.js + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-192.png b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..166f56da7612ea74df6a297154c8d281a4f28a14 GIT binary patch literal 2626 zcmV-I3cdA-P)v0A9xRwxP|bki~~&uFk>U z#P+PQh zyZ;-jwXKqnKbb6)@RaxQz@vm={%t~VbaZrdbaZrdbaeEeXj>~BG?&`J0XrqR#sSlO zg~N5iUk*15JibvlR1f^^1czzNKWvoJtc!Sj*G37QXbZ8LeD{Fzxgdv#Q{x}ytfZ5q z+^k#NaEp>zX_8~aSaZ`O%B9C&YLHb(mNtgGD&Kezd5S@&C=n~Uy1NWHM`t07VQP^MopUXki{2^#ryd94>UJMYW|(#4qV`kb7eD)Q=~NN zaVIRi@|TJ!Rni8J=5DOutQ#bEyMVr8*;HU|)MEKmVC+IOiDi9y)vz=rdtAUHW$yjt zrj3B7v(>exU=IrzC<+?AE=2vI;%fafM}#ShGDZx=0Nus5QHKdyb9pw&4>4XCpa-o?P(Gnco1CGX|U> z$f+_tA3+V~<{MU^A%eP!8R*-sD9y<>Jc7A(;aC5hVbs;kX9&Sa$JMG!W_BLFQa*hM zri__C@0i0U1X#?)Y=)>JpvTnY6^s;fu#I}K9u>OldV}m!Ch`d1Vs@v9 zb}w(!TvOmSzmMBa9gYvD4xocL2r0ds6%Hs>Z& z#7#o9PGHDmfG%JQq`O5~dt|MAQN@2wyJw_@``7Giyy(yyk(m8U*kk5$X1^;3$a3}N^Lp6hE5!#8l z#~NYHmKAs6IAe&A;bvM8OochRmXN>`D`{N$%#dZCRxp4-dJ?*3P}}T`tYa3?zz5BA zTu7uE#GsDpZ$~j9q=Zq!LYjLbZPXFILZK4?S)C-zE1(dC2d<7nO4-nSCbV#9E|E1MM|V<9>i4h?WX*r*ul1 z5#k6;po8z=fdMiVVz*h+iaTlz#WOYmU^SX5#97H~B32s-#4wk<1NTN#g?LrYieCu> zF7pbOLR;q2D#Q`^t%QcY06*X-jM+ei7%ZuanUTH#9Y%FBi*Z#22({_}3^=BboIsbg zR0#jJ>9QR8SnmtSS6x($?$}6$x+q)697#m${Z@G6Ujf=6iO^S}7P`q8DkH!IHd4lB zDzwxt3BHsPAcXFFY^Fj}(073>NL_$A%v2sUW(CRutd%{G`5ow?L`XYSO*Qu?x+Gzv zBtR}Y6`XF4xX7)Z04D+fH;TMapdQFFameUuHL34NN)r@aF4RO%x&NApeWGtr#mG~M z6sEIZS;Uj1HB1*0hh=O@0q1=Ia@L>-tETu-3n(op+97E z#&~2xggrl(LA|giII;RwBlX2^Q`B{_t}gxNL;iB11gEPC>v` zb4SJ;;BFOB!{chn>?cCeGDKuqI0+!skyWTn*k!WiPNBf=8rn;@y%( znhq%8fj2eAe?`A5mP;TE&iLEmQ^xV%-kmC-8mWao&EUK_^=GW-Y3z ksi~={si~={skwfB0gq6itke#r1ONa407*qoM6N<$g11Kq@c;k- literal 0 HcmV?d00001 diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-512.png b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..c2dd4842dc93df73c322218ee03eca142a19a338 GIT binary patch literal 6311 zcmV;Y7+B|tP)SXufPd5Ix6kc7K;%njMy_o-9lc5dH(-`j+Q5JCtcgb+dqA%qY@2qAtDg>+@U|JPy00FBJiUlTQ zK|ch>Gwc9k#$pXdTjMG;8I=Y75I~W81{l;4uOKqU-2vuw#I8bQB5h#6DK|)WHHFA1 zrE&=^CWT>7acWr^rvb2IbpUeUqG^H8hmT$ z?=EK$r04CJ`v+$zr5K&-orRY}#8@*uM;WjH?riq2{|jyUHUs|de)byv3Mc3|7hbQP zBgS~0wbQg4^4E@#tdw>VtlM1p!-IqKy}u1;ya3+UBZX9k&UFF| z3cv;Q!!Pa~AXn4*}u8@O-d7wW7mLlcB-K`>jrQUZZ7ry}h+5z&BJPvyd zhMaB(m;Z5hEp~oX}ZdDmHNmn=Rkw}{H2#KV`J2uT|&rLB5c7+6qO$CWW zESg~7m;|d~fu+P_J+?j#gGl76zW3Z)=Tz7HB7+4ped^wG{^xOT9R(J={|*lnZh-ll zfr%!r55zPmb}a-hS{5m=%8HUc{{N|fYf!WS#(Kbquk_A9fw?BOF9b$jD!n5sWGR=w zTFR;H3!Qe7J9FOxD}mBGa#0iRoM+trs)ipr3I!WrECgmIHQ$}r0AqFFCe6$FS{nc_ zKxl&C&?ay}CZ+uRP}8d)w$8{H6hQJf_7-k{LO#FuH}fdm0Cz&*K@EcEHvtrGfVoWZ zU-g0W_k~cr0fvr1A;|rELV)58FmDr-p2Y3=PWefkrZ;B*4hC2VGl9hA_|8ng+5nXq z-~gQr@CY!}>-Ekwuj};zTR64`m;;ABxEU|9Nn)gByJr5e=ucvf?fadZweLF1i%cwCTQ1$ z_x2B1FFBK#A_BWQm$B!>9$oaSDANZ+^Tgmj$q9O612-4;X2p3ZWS;Kt|#p$~1CNLxuo-04!NB zTp|?Ew^FSae<-6Pthr|aUMjTUyAE8m-P6EG7ws3bDs(6Bg z${XMza$1yxSM)Ce9ukB`ch~^)F7DkkGSWFSGV=Mrb%g4oCq}11_ziIR)4%89<>=>e zMCpZ=)JX)%$lx}N9;nF9fp{Pyfpm+3YqbwQyZ^gkORTNG(-SxigaxtY>GyAcZ`hF* zK858uHA6o1-^7PQ(6FX|5BWQgv(nH7T3GL{QC@#6F4hk&N4P+oihN>v6;7m4pR_D> zaDjeKQ`GM@Z;K~oiM#Z%*(@@koKd;9<6C5c ziHTNlr@^uZ*5PN>Jg!XTqfn?r-n8*9phn{XRD6y-5aC@wmu;FWV%P%-+67cIipB(} z_1a1g@Ro8{bo!x@!JOf zVlL>OiX6SJ3pQU&x9Dxil?Yo9moYvz8(pSzOH&;r(wstr@@zeHWD35zoRVtNCPV@H zs*om9o5;qL(=fiI4TL^g21UsCIv#U8Afh&|WJdm_s<5Xq4^8pc`v`5y) z${=5$9>^~DQ&KXf92JPLKCp(0%O`{uy~=4*W`yXLNQ7CCr-UATR_PN~$33hMR9(P* z$fO~(7zO#5&I$O~33(r}1FEse=Z2~_of4>Ff1GtjyH?e3PDfLHIwjD;wuM_J<73L8 zi{lM7G9^<239=lfhNRu@4nY4Own)+eRS4_*{Z;jW;Wq$&4-6Ca2=PLA*fbB28-*qF zL1hJ1O<*ZvGzOa>T>b!_Z3Qb~#aAc%P6-zlgfptVuC_z39X(|IffkE%$SJL!h zf)u$OJyTISne)XNGS(bmvSTGymkygOSJhDNUJzO&Ua*M`0&PVoA@!B*@wD&7@?t;~nPlZ)*_v)m>L|$o>?15`L>MabbdP5#KL`I;+5opbwH?-meI3fsU{s(;st;a zpi-{gwpD;!0<3uoJS0FW%>kiujRz|_J>6HdG^GRpSOg?*J%vEdCuUYDUab!RKyU!u z26neh0dfp1Z$JU)Gw}#m>=_W(LJPqPvv3%Ior2;3P;Z{+PXW_ec7P|vb3mkV2*@3k zP;RJCP^}!efWvb@XbkAmEGOM*FaeL0CksK&EDiz5$WIBqiab2<=IeU>U>LFNBgb4q5^VN3jS<8G!NGFu?L}abCWrD1hgHWnR-$wWU|7 z#9MqxrGj__grScV42{JB6(~*7d0UeOjqoVOg%WIO^&!`uXTPJO35R>CP6uJRmEyVOS)iOLF4nuELR zX@3Mfcj+0gd>jCk>Lq^;Sm@C%nh#Br8#!1ZAXf1~z#@-uaIp{$0Ofh$0Cx^p>`@sg zTXR4S{|1i$e+LB7S!X)Mcc25hg+B*m4)Jhi9AeF|1Kz^F!6U%m0dI+>bYQ(E&X?DQkF%EDe!3H3}%>lWX9k7&e0A0Ep5(tPo!>%v!9Dp6b zN9)>b@48qARN}`0j!G~HfqVP&hA>RSfW3Yu*Po}B ziB$%?5{u0SU-y)1Pd`lvH1N-A>#>^Qt6<~j24|{DPn{Rj0Wd+J^$MKPJMEncLowM` zg$_%>w^W03H-3%X?ji`xyj6-NxOzxk#=U%~KGHdi08gNn0N#q}eBD)&`dyno*@N;K z9p6L%P6&imnnPsz%po!>^lf^}24I)sRdDnP5}%Zst5?8G2)@XF2NFyE0Fe6tgr~GG zb=M})FHTSB?QRW%$rGR|HLursTt-BnUJhe0?R%0)90lL1C!E?}Cw|Az}! zuREZ)0t=ox!P^|9#S3)>vb$&O`(x`|cy#bOc)GR#AhY0EV#H5AOa8Q-5^48Y2H>p+ zPm^PQ^X#$Yx2=03lvybtR1#sG1PFndRQ|Pl<^9j==e`JUrciK`uann((p$0e~w5q0upMUs|_$E#(0~ zuTBLXBkpwhITf)2{1QR@1rwNxYuk!j<+}&Gir;D=wwab(Jf@bq?g4otu{PIy>)Tu5 z?J^)OkZbmVA?R|-wPoDYmV#VQlq`^?t!%c9b}g1X003%93Jj$<*lze(;JBqWJaP)qrQ%lNhf<0#yZd)M68bbDLCmFVdC}V#1 z8Vx7x(M-e#8AsD*E|q==junbBnc_QfcnMTIoc)z!tc9^_#UtIEs4a#UsJTi z4aCdtLoL{yT>T9nMQ7JQ34|TUJt=N>8?(!vDO9BU67vg?P5=wQQv+gv4+vQr)~E>J zC~;%=9_KU&A9mKlTmk%2pmqM$wQDBsg^v?#CnU zu-)8aN`_|01G~l-v<73zvY;1$|27aBum&g(bSGTERpf`{A3K~V?2Y)^428&gU{)oa zEg_j?$N#=#^BvI=+U7Q}h}Nd*q}}k&i>YA#a6^9C+--?dC4|q@U>_ev%53{s`0q`S zt^3a2-TcT9L;(PQVf8dlub7B&su^GLk(lXO;^TlBYjH6%D-KAo8%tb9R>tRH5-cJT z;wvk0n03I$0qZMqlK8kdiNwEyO_<2+cvao~s;kHR&O&;s>UCAudry9Q?WlWXxR490 zGLA++T-C=X%FNw%m!&j;C=uDO0@d^N*7(_;ihX@`XmZZKK>z5SCu#{lThfV@#K+2#+?B&H|Q<7s5F7dSX7d1r13RY?qv-U9MQ!R6E4)I_f3 zBLH6%%n)gv(O3gaW+;_m-^7R=04_b`H-Gv~$ZtNdai!9~mcuB`I|zKTO1Y3TF+#~3 z!051Az{#Q(`*%S98ry|n)f9LQtQb-vPG_ zEq(djgUVv^0;IZV`!3|O{1bpm5SR~O!-;@x13*_tRRN+u6s9%<6FR;>CeP0N1mE-1 zUC|biwSKK)I{rl4EaLW-PpTh`nW5a9ERjY-lKo)LZ1wJR*U*gQW-zHlx4)q`12KI6 z{c%V=7cbF3e)Fne)=c6vq~SwR<{+5XAg-dx>+*P=|A>`M?L(d;C$SeIFqi1kX)X+; z*22G?0uGKOa?*)>Zgb)P0#n`Q7Ojl%L1glj3V*X3OjV1s^oj!RBL}gL&N>uKZwND817778odLCt*=tt+yA(v#d>(*NY|1D(37)Is2N z$zP{}i~c5on0x@L&NYiJIVGgOrYY`733V;WYYgY0Yz_pgn|^O-oPtCR!g~Oq^ZX3C z@>=Ko43M0H>MTf2-UBTcWc2-;lvdx#-ZWAkey9QXdVYKc2FwZ8ufRE3D7X0$(&;^$ zcAN%%gOWE@lD;O@oPX}{nWDGx-K&X-i6#5q{p5N1;=S4t@Mo~OA2Z@B5{tmF5!HST z>`lzXW{AKYVlTpA3(>gAsGUT)7>6FBP}(3Trxk+OI~fYYVIYwc#EF#0%;-~grt~z3 zZxU>>M#^^R*MDT;XRg__Rl1Xc*bPRx&m+IMc5<5KGTc+Z@M^qR(%yy}n*z8O*xkav zyaki!B$zkAE0H6Q;{3A24KAaR68D=Yct=CVU%>e&@o#G(67PA+xar}yAzww| zBzmO{Com!vjxCYTy+stR7(_P@N{61xIaFp`Yr!u`T8VxL(bXJIvEU7;oDC^nhPe0* z7fglJ+&6Or!f^Q`Q^j!bI7ktB2yD1l5-k%L1@CUUGFT*Vhc=+FC}Y}3g_PKT8vGi) zRkkW)zD$ADk?jWZm=ss?tG9tV<@9 zvXo3&W#9P!avXh&cl>L)s$@0**4m1#{-@^$*T65Z4s7P;keBEOyE(kSz!EFY|Iy8X zijA*-b8$edhgfj8A&Vt_5Em@Jz(5?P|8FA_LzcAr?MM8t8Noe`)9_D8WWyZ(_^f`G zK#;ff>_ZqTVF*OU{=H8-&NhjGONQ@4oDIDQIQp?%{C{Wklma|{yhr~}rDVh3zAt|i zI>cz9tUvhMV;cFV=Zt9m1eNtipyM3#B&tYNcEoPer+nG(m8gmTq1I6|zt#2I-gujV z&yRIX(4!nVQ~ct2-kv>syvbh$!((?laLIRdb#--hb^T}$4haAN000F2f9(we00000 d00000FczS=g-my!^e+Ga002ovPDHLkV1k1kaKZop literal 0 HcmV?d00001 diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html index cea9eeca0d..4a86d7bdc6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html @@ -12,6 +12,12 @@ + + + + + + @@ -25,5 +31,9 @@ + + + + From 9323fa4db07dbc56d08e11ab0b04ced53c8a4d5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 5 Apr 2022 21:40:48 +0300 Subject: [PATCH 127/242] Update POST.md --- docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md b/docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md index 3575fb396f..ed83f36e19 100644 --- a/docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md +++ b/docs/en/Blog-Posts/2022-04-05 v5_2_Release_Stable/POST.md @@ -47,3 +47,5 @@ Check [the migration guide](https://docs.abp.io/en/abp/5.2/Migration-Guides/Abp- ## About the Next Version The next feature version will be 5.3. It is planned to release the 5.3 RC (Release Candidate) on May 03 and the final version on May 31, 2022. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). + +Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problem with this version. From c1b5956431557f60b2b004e4ddfda88e68f8b3b1 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 6 Apr 2022 10:43:28 +0800 Subject: [PATCH 128/242] Upgrade AutoMapper to v11 --- framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj | 4 ++-- .../Volo/Abp/AutoMapper/AbpAutoMapperModule.cs | 3 ++- .../Volo.Abp.Account.Application.csproj | 2 +- .../Volo.Abp.BackgroundJobs.Domain.csproj | 2 +- .../Volo.Abp.BackgroundJobs.MongoDB.csproj | 2 +- .../Volo.BloggingTestApp.MongoDB.csproj | 2 +- .../Volo.Blogging.Admin.Application.csproj | 2 +- .../Volo.Blogging.Application.csproj | 2 +- .../src/Volo.Blogging.Domain/Volo.Blogging.Domain.csproj | 2 +- .../src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.csproj | 2 +- .../Volo.CmsKit.Admin.Application.csproj | 2 +- .../Volo.CmsKit.Application/Volo.CmsKit.Application.csproj | 2 +- .../Volo.CmsKit.Common.Application.csproj | 2 +- .../Volo.CmsKit.Public.Application.csproj | 2 +- .../Volo.Docs.Admin.Application.csproj | 2 +- .../src/Volo.Docs.Application/Volo.Docs.Application.csproj | 2 +- modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj | 2 +- modules/docs/src/Volo.Docs.MongoDB/Volo.Docs.MongoDB.csproj | 2 +- .../Volo.Abp.FeatureManagement.Application.csproj | 2 +- .../Volo.Abp.Identity.Application.csproj | 2 +- .../Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj | 2 +- .../Volo.Abp.Identity.MongoDB.csproj | 2 +- .../Volo.Abp.PermissionManagement.Application.csproj | 2 +- .../Volo.Abp.SettingManagement.Application.csproj | 2 +- .../Volo.Abp.TenantManagement.Application.csproj | 2 +- .../Volo.Abp.TenantManagement.Domain.csproj | 2 +- .../Volo.Abp.TenantManagement.MongoDB.csproj | 2 +- .../MyCompanyName.MyProjectName.Application.csproj | 2 +- 28 files changed, 30 insertions(+), 29 deletions(-) diff --git a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj index 9f028d31ee..32f9da017c 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj +++ b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Abp.AutoMapper Volo.Abp.AutoMapper $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; @@ -21,7 +21,7 @@ - + diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs index 6ed44a6300..18fef842da 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs +++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs @@ -1,5 +1,6 @@ using System; using AutoMapper; +using AutoMapper.Internal; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Auditing; @@ -49,7 +50,7 @@ public class AbpAutoMapperModule : AbpModule { foreach (var profileType in options.ValidatingProfiles) { - config.AssertConfigurationIsValid(((Profile)Activator.CreateInstance(profileType)).ProfileName); + config.Internal().AssertConfigurationIsValid(((Profile)Activator.CreateInstance(profileType)).ProfileName); } } diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj index 3879cf9569..32b27998cc 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj +++ b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Abp.Account.Application Volo.Abp.Account.Application true diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.csproj b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.csproj index 7eb9015b73..b46209de47 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.csproj +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.csproj b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.csproj index 56c1391ab9..7d29486644 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.csproj +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 diff --git a/modules/blogging/app/Volo.BloggingTestApp.MongoDB/Volo.BloggingTestApp.MongoDB.csproj b/modules/blogging/app/Volo.BloggingTestApp.MongoDB/Volo.BloggingTestApp.MongoDB.csproj index a846bb0ca6..e707190be5 100644 --- a/modules/blogging/app/Volo.BloggingTestApp.MongoDB/Volo.BloggingTestApp.MongoDB.csproj +++ b/modules/blogging/app/Volo.BloggingTestApp.MongoDB/Volo.BloggingTestApp.MongoDB.csproj @@ -3,7 +3,7 @@ - netstandard2.0 + netstandard2.1 diff --git a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj index 456777e60a..6df6b27bb7 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Blogging.Admin.Application Volo.Blogging.Admin.Application diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj index 504d32836d..99c491231b 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj +++ b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Blogging.Application Volo.Blogging.Application diff --git a/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.csproj b/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.csproj index c6c096105b..905494aa41 100644 --- a/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.csproj +++ b/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Blogging.Domain Volo.Blogging.Domain diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.csproj b/modules/blogging/src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.csproj index 5019b843f2..83d8759d14 100644 --- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.csproj +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Blogging.MongoDB Volo.Blogging.MongoDB diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj index bf1ff4f610..684446b1f0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj index fa1557674e..51282692af 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj index 1d7baff506..145c7adac6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj index 702523e3c6..0e192cec7a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj index e3d556c9e0..72f94bdd47 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Docs.Admin.Application Volo.Docs.Admin.Application diff --git a/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj b/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj index 788edd430d..b00754b104 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj +++ b/modules/docs/src/Volo.Docs.Application/Volo.Docs.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Docs.Application Volo.Docs.Application diff --git a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj index b68893b40b..29020e50bc 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj +++ b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Docs.Domain Volo.Docs.Domain true diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo.Docs.MongoDB.csproj b/modules/docs/src/Volo.Docs.MongoDB/Volo.Docs.MongoDB.csproj index 9a5cd19550..25994142c5 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo.Docs.MongoDB.csproj +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo.Docs.MongoDB.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Docs.MongoDB Volo.Docs.MongoDB diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj index b2f186ce71..4ea705d8ef 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo.Abp.FeatureManagement.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj b/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj index fc01ba4400..4698a381fa 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo.Abp.Identity.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Abp.Identity.Application Volo.Abp.Identity.Application $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj index e951457688..5e20e76f3f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Abp.Identity.Domain Volo.Abp.Identity.Domain $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.csproj b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.csproj index 762582ef67..96e949d6d5 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.csproj +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo.Abp.Identity.MongoDB.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Abp.Identity.MongoDB Volo.Abp.Identity.MongoDB $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj index d81f87d28c..080432db39 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Abp.PermissionManagement.Application Volo.Abp.PermissionManagement.Application $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj index 0ea73276ff..8061d285e7 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj index 3c9da24d7e..25e39ab17c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + net6.0 Volo.Abp.TenantManagement.Application Volo.Abp.TenantManagement.Application $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj index 5de64b7a1d..f461433d14 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Abp.TenantManagement.Domain Volo.Abp.TenantManagement.Domain $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.csproj index dd8726dccb..d10686b721 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.csproj @@ -4,7 +4,7 @@ - netstandard2.0 + netstandard2.1 Volo.Abp.TenantManagement.MongoDB Volo.Abp.TenantManagement.MongoDB $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj index c24b0db2a5..f97a38e9bf 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj @@ -3,7 +3,7 @@ - netstandard2.0 + net6.0 MyCompanyName.MyProjectName From ab1e9ee166c77bc75db3454efcd09d0b8289f663 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 6 Apr 2022 11:25:41 +0300 Subject: [PATCH 129/242] Grammatical fixes on CLI.md --- docs/en/CLI.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index d381290508..6d5ed901c0 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -18,13 +18,13 @@ dotnet tool update -g Volo.Abp.Cli ## Global Options -While each command may have a set of options, there are some global options those can be used with any command; +While each command may have a set of options, there are some global options that can be used with any command; * `--skip-cli-version-check`: Skips to check the latest version of the ABP CLI. If you don't specify, it will check the latest version and shows a warning message if there is a newer version of the ABP CLI. ## Commands -Here, the list of all available commands before explaining their details: +Here, is the list of all available commands before explaining their details: * **`help`**: Shows help on the usage of the ABP CLI. * **`new`**: Generates a new solution based on the ABP [startup templates](Startup-Templates/Index.md). From 659d2da2daf11d32622931f1b9d73eb7785419f4 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 6 Apr 2022 11:26:16 +0300 Subject: [PATCH 130/242] Add `--pwa` option description to CLI.md --- docs/en/CLI.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index 6d5ed901c0..72fe0cf221 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -115,6 +115,7 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers: * `ef`: Entity Framework Core. * `mongodb`: MongoDB. + * `--pwa`: Specifies to Configure Angular or Blazor WebAssembly project as Progressive Web Application. * `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory. * `--version` or `-v`: Specifies the ABP & template version. It can be a [release tag](https://github.com/abpframework/abp/releases) or a [branch name](https://github.com/abpframework/abp/branches). Uses the latest release if not specified. Most of the times, you will want to use the latest version. * `--preview`: Use latest preview version. From f2de6d56b99ef1ddb1566a25dad12fb3c6272795 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Wed, 6 Apr 2022 11:31:53 +0300 Subject: [PATCH 131/242] Create community article about Concurrency Check in ABP --- .../POST.md | 552 ++++++++++++++++++ .../concurrency-mismatch.gif | Bin 0 -> 1237571 bytes .../optimistic-concurrency.png | Bin 0 -> 21478 bytes 3 files changed, 552 insertions(+) create mode 100644 docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md create mode 100644 docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/concurrency-mismatch.gif create mode 100644 docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/optimistic-concurrency.png diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md new file mode 100644 index 0000000000..4a594669ec --- /dev/null +++ b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md @@ -0,0 +1,552 @@ +# Concurrency Check in ABP Based Applications + +In this article, we'll create a basic application to demonstrate how "Concurrency Check/Control" can be done in an ABP based application. + +## Creating the Solution + +For this article, we can create a simple BookStore application and perform CRUD operations. + +> To keep the article simple and shor, we'll only add **Book** entity and ignore the **Author** part. + +We can create a new startup template with EF Core as a database provider and MVC for the UI Framework. + +> If you already have a project, you don't need to create a new startup template, you can directly implement the following steps to your project. So you can skip this section. + +We can create a new startup template by using the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI). + +```bash +abp new Acme.BookStore -t app -csf +``` + +After running the above command, our project boilerplate will be downloaded. Then we can open the solution and start to the development. + +## Starting the Development + +Let's start with defining our entities. + +### Creating Entitites + +Create a `Book.cs` (/Books/Book.cs) class in the `.Domain` layer: + +```csharp +public class Book : AuditedAggregateRoot +{ + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } +} +``` + +* To enable **Concurrency Check** for our entities, our entities should implement the `IHasConcurrencyStamp` interface, directly or indirectly. + +* [Aggregate Root](https://docs.abp.io/en/abp/5.2/Entities#aggregateroot-class) entity classes already implement the `IHasConcurrencyStamp` interface, so if we inherit our entities from one of these entity classes we don't need to manually implement the `IHasConcurrencyStamp` interface. + +* And we've derieved the `Book` entity from `AuditedAggregateRoot` here, so we don't need to implement `IHasConcurrencyStamp` interface because `AuditedAggregateRoot` class is already implement the `IHasConcurrencyStamp` interface. + +> You can read more details from the [Concurreny Check](https://docs.abp.io/en/abp/5.2/Concurrency-Check) documentation. + +Then, create a `BookType` (/Books/BookType.cs) enum in the `.Domain.Shared` layer: + +```csharp +public enum BookType +{ + Undefined, + Adventure, + Biography, + Dystopia, + Fantastic, + Horror, + Science, + ScienceFiction, + Poetry +} +``` + +### Database Integration + +Open the `BookStoreDbContext` (/EntityFrameworkCore/BookStoreDbContext.cs) class in the `*.EntityFrameworkCore` project and add the following `DbSet` statement: + +```csharp +namespace Acme.BookStore.EntityFrameworkCore; + +[ReplaceDbContext(typeof(IIdentityDbContext))] +[ReplaceDbContext(typeof(ITenantManagementDbContext))] +[ConnectionStringName("Default")] +public class BookStoreDbContext : + AbpDbContext, + IIdentityDbContext, + ITenantManagementDbContext +{ + //Entities from the modules + + public DbSet Books { get; set; } //add this line +} +``` + +Then we can navigate to the `OnModelCreating` method in the same class and configure our tables/entities: + +```csharp +protected override void OnModelCreating(ModelBuilder builder) +{ + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + builder.ConfigurePermissionManagement(); + ... + + //* Configure your own tables/entities inside here */ + + builder.Entity(b => + { + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", + BookStoreConsts.DbSchema); + b.ConfigureByConvention(); //auto configure for the base class props + b.Property(x => x.Name).IsRequired().HasMaxLength(128); + }); +} +``` + +After the mapping configurations, we can create a new migration and apply changes to the database. + +To do this, open your command line terminal in the directory of the `EntityFrameworkCore` project and run the below command: + +```bash +dotnet ef migrations add Added_Books +``` + +After this command a new migration will be generated and then we can run the `*.DbMigrator` project to apply the last changes to the database such as creating a new table named `Books` according to the lastly created migration. + +### Defining DTOs and Application Service Interfaces + +We can start to define the use cases of the application. + +Create the DTO classes (under **Books** folder) in the `Application.Contracts` project: + +* **BookDto.cs** + +```csharp +public class BookDto : AuditedEntityDto, IHasConcurrencyStamp +{ + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } + + public string ConcurrencyStamp { get; set; } +} +``` + +* `AuditedEntityDto` class is not implemented from the `IHasConcurrencyStamp` interface, so for **BookDto** class we need to implement the `IHasConcurrencyStamp`. + +* This is important, because we need to return books with their **ConcurrencyStamp** value. + +* **CreateBookDto.cs** + +```csharp +public class CreateBookDto +{ + [Required] + [StringLength(128)] + public string Name { get; set; } + + [Required] + public BookType Type { get; set; } = BookType.Undefined; + + [Required] + [DataType(DataType.Date)] + public DateTime PublishDate { get; set; } = DateTime.Now; + + [Required] + public float Price { get; set; } +} +``` + +* **UpdateBookDto.cs** + +```csharp +public class UpdateBookDto : IHasConcurrencyStamp +{ + [Required] + [StringLength(128)] + public string Name { get; set; } + + [Required] + public BookType Type { get; set; } = BookType.Undefined; + + [Required] + [DataType(DataType.Date)] + public DateTime PublishDate { get; set; } = DateTime.Now; + + [Required] + public float Price { get; set; } + + public string ConcurrencyStamp { get; set; } +} +``` + +* Here, we've also implemented the `IHasConcurrencyStamp` interface for the **UpdateBookDto** class. + +* We will use this value while updating an existing book. ABP Framework will compare the current book's **ConcurrencyStamp** value with the provided one, if values are matched, this means everything is as it is supposed to be and will update the record. + +* If values are mismatched, then it means record that we're trying to update is already updated by an other user and we need to get the latest changes to be able to make changes on it. + +* Also, in that case, `AbpDbConcurrencyException` will be thrown by the ABP Framework and we can either handle this exception manually or let the ABP Framework handle it behalf of use and shows a user-friendly error message as in the image below. + +![](./optimistic-concurrency.png) + +Create a new `IBookAppService` (/Books/IBookAppService.cs) interface in the `Application.Contracts` project: + +```csharp +public interface IBookAppService : + ICrudAppService +{ +} +``` +* We've implemented the `ICrudAppService` here, because we just need to perform CRUD operations and this interface help us to define common CRUD operation methods. + +### Application Service Implementations + +Create a `BookAppService` (/Books/BookAppService.cs) class inside the `*.Application` project and implement the application service methods, as shown below: + +```csharp +public class BookAppService : + CrudAppService, + IBookAppService +{ + public BookAppService(IRepository repository) + : base(repository) + { + } + + public override async Task UpdateAsync(Guid id, UpdateBookDto input) + { + var book = await Repository.GetAsync(id); + + book.Name = input.Name; + book.Price = input.Price; + book.Type = input.Type; + book.PublishDate = input.PublishDate; + + book.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); + + var updatedBook = await Repository.UpdateAsync(book); + return ObjectMapper.Map(updatedBook); + } +} +``` + +* He've used the `CrudAppService` base class. This class implements the all common CRUD operations and if we want to change a method, we can simply override the method and change it by our needs. + +> Normally, you don't need to override the `UpdateAsync` method to do **Concurrency Check**. I wanted to override this method to show what we need to do for **Concurrency Check**. + +* We can look closer to the `UpdateAsync` method here, because as we've mentioned earlier we need to pass the provided **ConcurrencyStamp** value to be able to do **Concurrency Check/Control** to our entity while updating. We've used the `SetConcurrencyStampIfNotNull` extension method to set the **ConcurrencyStamp** value to our entity and update the record. + +* In that point, if the given record already updated by any other user, **ConcurrencyStamp** mismatch will occur and `AbpDbConcurrencyException` will be thrown and thanks to **Concurrency Check** system of ABP, data-consistency will be provided and the current record won't be overrided. + +* And if the values are matched, the record will be updated successfully. + +After implementing the application service methods, we can do the related mapping configurations, so open the `BookStoreApplicationAutoMapperProfile.cs` and update the content as below: + +```csharp +public class BookStoreApplicationAutoMapperProfile : Profile +{ + public BookStoreApplicationAutoMapperProfile() + { + CreateMap(); + CreateMap(); + } +} +``` + +### User Interface + +So far, we've applied the all neccessary steps for the **Concurrency Check** system, let's see it in the action. + +Create a razor page in the `.Web` layer named `Index` (**/Pages/Books/Index.cshtml**), open this file and replace the content with the following code block: + +```html +@page +@using Acme.BookStore.Localization +@using Microsoft.Extensions.Localization +@model Acme.BookStore.Web.Pages.Books.Index + +@section scripts +{ + +} + + + + + + Books + + + + + + + + + + +``` + +* We've defined a table and "New Book" button inside a card element here, we'll fill the table with our book records in the next step by using the **Datatables** library. + +Create a `Index.js` (**/Pages/Books/Index.js**) file and add the following code block: + +```js +$(function () { + var l = abp.localization.getResource('BookStore'); + var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); + + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } + } + ] + } + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), + data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) + ); + + createModal.onResult(function () { + dataTable.ajax.reload(); + }); + + editModal.onResult(function () { + dataTable.ajax.reload(); + }); + + $('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); + }); +}); +``` + +* We've used the [Datatables](https://datatables.net/) to list our books. + +* Also defined **create** and **update** modals by using [ABP Modal Manager](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Modals#modalmanager-reference), but we didn't create them yet, so let's create the modals. + +First, create **CreateModal** razor page and update the **CreateModal.cshtml** and **CreateModal.cshtml.cs** files as below: + +* **CreateModal.cshtml** + +```html +@page +@using Acme.BookStore.Web.Pages.Books +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@model CreateModalModel +@{ + Layout = null; +} + + + + + + + + + +``` + +* We've used `abp-dynamic-form` tag-helper and pass it a `Book` model, this tag helper will simply create form contents (inputs, select boxes etc.) behalf of us. + +* **CreateModal.cshtml.cs** + +```csharp +using System.Threading.Tasks; +using Acme.BookStore.Books; +using Microsoft.AspNetCore.Mvc; + +namespace Acme.BookStore.Web.Pages.Books; + +public class CreateModalModel : BookStorePageModel +{ + [BindProperty] + public CreateBookDto Book { get; set; } + + private readonly IBookAppService _bookAppService; + + public CreateModalModel(IBookAppService bookAppService) + { + _bookAppService = bookAppService; + } + + public void OnGet() + { + Book = new CreateBookDto(); + } + + public async Task OnPostAsync() + { + await _bookAppService.CreateAsync(Book); + return NoContent(); + } +} +``` + +* In this file, we simply define **CreateBookDto** as bind property and we'll use this classes' properties in the form. Thanks to the `abp-dynamic-form` tag-helper we don't need to define all of this form elements one by one, it will generate behalf of us. + +We can create **EditModal** razor page and update the **EditModal.cshtml** and **EditModal.cshtml.cs** files as below: + +* **EditModal.cshtml** + +```html +@page +@using Acme.BookStore.Web.Pages.Books +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@model EditModalModel +@{ + Layout = null; +} + + + + + + + + + + + + + + +``` + +* Here, we didn't use the `abp-dynamic-form` tag-helper and add all neccessary form elements to our form one by one. + +* As you may notice, we've set input type as **hidden** for the **ConcurrencyStamp** input, because end-user should not see this value. + +> Instead of doing it like that, we could create a view model class and use the `[HiddenInput]` data attribute for the **ConcurrencyStamp** property and use the `abp-dynamic-form` tag-helper. But to simplify the article I didn't want to do that, if you want you can create a view model and define the neccessary data attributes for properties. + +* **EditModal.cshtml.cs** + +```csharp +public class EditModalModel : BookStorePageModel +{ + [HiddenInput] + [BindProperty(SupportsGet = true)] + public Guid Id { get; set; } + + [BindProperty] + public UpdateBookDto Book { get; set; } + + private readonly IBookAppService _bookAppService; + + public EditModalModel(IBookAppService bookAppService) + { + _bookAppService = bookAppService; + } + + public async Task OnGetAsync() + { + var bookDto = await _bookAppService.GetAsync(Id); + Book = ObjectMapper.Map(bookDto); + } + + public async Task OnPostAsync() + { + await _bookAppService.UpdateAsync(Id, Book); + return NoContent(); + } +} +``` + +Lastly, we can define the neccessary mapping configurations and run the application to see results. + +Open the `BookStoreWebAutoMapperProfile.cs` and update the content as below: + +```csharp +public class BookStoreWebAutoMapperProfile : Profile +{ + public BookStoreWebAutoMapperProfile() + { + CreateMap(); + } +} +``` + +Then we can run the application, navigates to **/Books** endpoint and see the result. + +![](concurrency-mismatch.gif) + +* In the image above, we can see that multiple users open the edit model to change a record and try to update the relevant record independently of each other. + +* After the first user updated the record, the second user tries to update the same record without getting the last state of the record. And therefore `AbpDbConcurrencyException` is thrown because **ConcurrencyStamp** values are different from each other. + +* The second user should close and re-open the model to get the last state of the record and then he/she can make changes to the current record. + + +Thanks for reading the article. \ No newline at end of file diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/concurrency-mismatch.gif b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/concurrency-mismatch.gif new file mode 100644 index 0000000000000000000000000000000000000000..922bb5b7cac20d196fd54a3a01dc69887d503ac6 GIT binary patch literal 1237571 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

    3@ueQ4j36av zt=xO&(g;Y@Q84!LN8Jet_NV8DQP9-~zPZoFx{XUc9`~{8nHwgUE}riko}0W{fZ7lw zCeK>#;tvG(G|Vq@ZO)40%%MOhTb5+8n%J8qr{m@chxo_Z^=Icucsgz7F!>ke`3Wc& z2q)9n`wV;NBxd8?#^L+;UArjb^Ms@lW8Gy0=^2ZRj9je$2LNC|pTExH4sOYzo!|S- z-~OHBB?;g=DB%CM*CBJ@25#OOzTn-ECx%_ywawrKpw_jm3}}oP z9d6aVUfsWb$-$oM3qb6Xj_JTa0PC&h%--M5j)S7!f6|W0l?~gs?cKdFIEMY_oc`g$ zfak&R3(5fKR^1DUP7GE4=#h@%ldk0s&+iL>=UN@q1mNgLUGL5A=0ZBr7b^beGuhf_ z4a%&}*{*)#WvahI@Co0^Snk|29_G|N+b@6QCob35-~b)}@gPsy_kM%<&VT#v z+|=&xnj9=Ap58H@3=SaEd6MDIa47R0;=Mos6D~PJkK)1N3oG8@#4Pp29V#Fm+EE?$ zn_Tp}ee^b%^!vB;9^UjSf9*_v;u_9YdQ#sqo!`#Q023eLz5op-P5{0z*w)Pq@7)W? zVChhEg9t1pACpMS4E`@Db2wa?hMAA`A%f4krNy#M>E-}z+)!y%d;BSA_JpSx&$=h81NPYe-nEv%A%!%Iq zy}!)xAOFfP(acZL08z>j8YZy}9z>W>p)_vY96p2?QQ}036)j%Gm{H@#h}@(p1Q}A~ zNRlN@o&4#T={b5&7D6dsT(wL>eZVD2X0-v zV&l-ge+M64{CM&xrEf={{sZ>Y>fLYcUS9ru`t|MKw|oBm{@(0O^9OLL`0yjJKm!j% zkUsqaWRNlc4r?&Np$1H_LJKd%FvH3gl(0ju9yH9u2r1OCL=#U$F-4tt`b@$PwKI-X zS6_uSR#|7IwN_hi#Wh!5b2W8U5mQCXSL#~bwOC`1MK)Pwmu0qDXI<@8SP6j@PTJv! zeKuQdx8=55Z@&ds*=Vh0klKI9^$pu_*JZa|ci)9KUSr2amp^msE$+|9&k8YS}pjDH3X|HNVI%=t> zraD=rogS@etl<+n(5k-%J8ZF`WpTHyx6}G;sGuIZZMWZso6xJ({_SVFxnetRz4zw3 z=(+C}EN#FA?7DBm4@cbQzX$(IaK@3!J8{V;r(E8}ALq((%!`V=a?d{p{n^Vm&q{OB zh3Y(X)mLY|*3nOo%5K<`O1*X4Z^wPp*JoeKbl7XpJ$T`VS9EvYf0X@r&I>2LdFP); z)Oh8M^8Iw+p~pV^%B7#4sOm|-UVHJ!-<$jHolO4x55gzEefPmOU;XblXa9Zs@Atdx z>C_KA{qyU`UjPNDviO~EewYK`0R9!YK!_Evdk1`60vR|#3i``|(}N)6Bv?TXb`WIx z<6mMjIJgaZ(1a%x9SB3%KVYqJeau5)3}xu93o37ffGgn)b-2S>)$n*Xyju==I7A|X z%7?rIBHe^oL?$-TQb(L!64kauCsxsljDjNUq5sYVaq8Ld> zMy#0;jc**H8aKyAr@0Z1ca)(VF-OOx*%6O_^q?Le$48*~5s-(RpdcAX$etMzk&hIh zA_vFFnK=@YmwcZj0Y^!gSrU_<6rU#V#>tX-5|pQWo+#-?N|Biom9J!$2x8EWemnzF zDxhUJ7*K!}z{4EOP!ulv{-MiesZwpMyqGItxy(+YOKuKxm&`Ke*^o&wa+=ehlX7PP zM&JTkjw2Y13Mf3g>8N<#b6NS^+CCB1&wo~wnzOWK0ZPCQS~>%v7=5Rq8v3Y_;`5u} z?21GSMp28lG*Jm90Y_^Y(|(jg8G>Q~Ew@=sXtW?5{W!-oA|R-dzJQkOEC32<0FQp$ zqXsvPCkkdT4}07I7|4Ps)>Miwmb%odgi7c}`(ch{(A1_l)oB5$Nsn~)qZ&l*rcwLB zP8BdUowgJvJ?4@APGZjMq$q`vIH%XuuYNV41I4CUZ(4wy_G70Q9Y-+=P}iD5HLgdk zW;6-_fE6rbvb3~^W>fHv${s7LPTOj|2wPZ}qBEV5Er4Rt>R7d66dHm801S@$S$h^h zuF|MxIIcRVcs8K6v<&I4PP??!qHDFRwWw=>Dh&q+O16wmt256ksNeFInB8T;UTIkl z&3bp22`$!gf!17dJr}zFL@%MP+t|mJmb<$x>TZ)N1M#}myvNOGdjAU8(g{|1?tQO0 z<2$JNW*4M_s-{QtJ6A%Dpapw1=tvjLs{s?ZGzLB%f)mWl4Fh-@1Sr8e99+<01R%Wq z5XV&~3|#&l7=r+lWonEy{9wQKWq%%q3VW?3;t|8L#Ek84KiEoJ>4Ns1GnVc;|9fOx zskdiBmKKqVjLIXs_^0HhFMy*l19`wW8N|KpTmj(Iy`G~6XPz>T1?*!W2eySP)bf_~ z+%YT949mjG^PUCWzz)~BcOd3npa;F^h4mR`fA*E489iwW7TVCryK@L7O=(UK%+i-W z3Zz%H=}wpWgLDRU>@v+iQk&Y<-EwrvM187OzuML*M0Ki}GV4Co`qsY|*Qa$o6kg}a z*T6>hoLe;PL$6wW$4+*%Zxw5i6+24MmUgyfMeU1OyGhvAcDPB!ZHjrDN#GWDx<5s3 zg#MXZNa$8~yfww{g1OsA&_01W?m-P{Q+a`5))~F=W$zwY@&xXnWsEJ=ScBfIvG(vN zgE_k0s2x1v!?l#Zy(QPSJ`<@O19;8^UN3^r$dZlihdr9{C=u|025%KqzW0qYl#An_ z)}8ob*;RrXNY+r07y=|bg>sckiUc}%Dum@cst+K66Nmc15T2eXj(42G#qvTD25=}U z6k+S23b~?M{&Hhw{p*G5`q?uza&(paMUHf)UTN#7uoDgC{opsw?Yk}$sJI-SEfmm& z&Z)TXb(@g7uEsU>fgs4hW~s(47ba2SSmX)GHct#B}| z>r$$pa;p0)0E-)kA(#ON3>8%T#TBf<_uIR6ur6d*I8Dlb?GLqfSjOi4X!Sv?Uk zq!Bni71*n6kS`f%t8nPQXVRsSA^}5eD|#}*en5vLn+BXpG8p`p#*&6JWGC68skTBY zi@S$1dnR-Esb^9+H*70RBerXls%M|KJ*YnN&yGlCK6CFXjHmfx~dV-fnELzxrPb=-Eu1j2!LLK zv8$4+$O?cnv_O0uD_|Od9cV#zX{>6PMVs8;A6dBZ%dZaCg)W_J$x!F2A<>N;YAjoYR0gMu=HQTFlj6_9rsAE*dL19A5 z)2{-cNefg(LhQe4Z~y?PKV1p{xjL~ZluAiy$J5J{6kw`y04A24yB3Is>I%xS0=$4M zN?^dsv3kW(3Cr)3nD%2fdF&8FlB;*BJQT<=j2o1I#3mDH2U@(jfT}zX42DmnhF^e} zFeA%hf=C!7gcHce2y{%GOgUg0$lanzm&`52d`VW6N&c#n!bn6a9NfvA1h6N=rl>To z*z&uZk}I<;fDTxcrX&>K)RgPfuA5o`TDmQZBL`s+6tRLv#3V^UAt+X4l)KcF`pdfl zIK#smln|hT`a>#!E6v-3N(cNnQlU=v%Qg24HTe4-82Xebv^t{aNP8 zDTDgPbP@+343{wL&$*hVv+}Z4ys6H-F7UFtz4H{9{JB`v6!`2oqjXK&Tdag?sE}h! zTDs2OL`Lch(Pex}?3%04R5*+KO2x9z2F*rCInPT$FMyLOQuH{Tv@R91I_)%1u@pn} zTsHMwPiOld_w*EDvbwXH&$NOodnzf`gi_CJ{0fbv3o!VH7qR! zg-r%c(zK><$Hyt-esOcjGU6}>0LTGO_A z(ME~UjFYo4>pwS}0sR8FPwY4zwM!qxLrT>{y&N{aln^^A%{}eZN^H?oBozA8rOrGq zdjKZ=C}(=)HhwMM}^He zt-hW^b}I>VNdHZ(pE&c+-ocgoJF_(l1vlGfn6$27^}^O>eOn802dQM<5E?{B!L`| zEEmhAp<0)a3(fIThKwZ6vP@8f)73HEEr<-Q8?&(B1C?JDlt>_g=gR^jxKl~7IDE~e z2B@a4)X~G+*YZ+UUE0?ZTQgd6NoY+J;B3CwP-d)FY1 zS9vAUajMr%$yaby#oIf_-f~WCVniKHCvsSW}**jzoR zUA;Q7y(>{MSwUfiA@G4Ah=cx2>03gvxZ8WNXIe7ttlVAXv5^YgguE}Ljn)yx)5d$e zPJz~a?T1R_(~cX5;hNp@)J97!fYIYx8O12pO{>a$CUnrR!L_F*gH=)4M&+g3x;2}- zCAN75pS{hLnJtuRf;kdU!65|R{kl&8WHX?e2Fa}5)?C$K5P|dssvAJTiH%%d+N-k? zfff+KWGK*$HBHU^xDr?@^_Aa}WyKCaf=?JB`PH+|mr*QxxE@-U0vt z1gaW9hFIyw90tKo;ajjvhG%HAWs1JBH*-hBZmPG)jICN5*7KR^(OTWcTpoPln`BK9x~ck5V>e zK}O|1QRVbt9d8XReND*5+vA<{t6pVZr7@k%Dwq=XGZ1c6R4?hUa*e z=Xs{*dba0#{>JBg*5`fZ=YIC*e+KA)7U+Q{=z=!rgGT6terHMCf1UhF!sf3B9 z=!&-Ji^k}T*65Aq=#KX2j|S5?|-lSb*3R_T>y>6Uismxk$>mg$+!Xol8g zLn~+Es2`f<>7MrKp9bon7V4oU>Y_I4qekkJw&_0h-kiRch%S_*mg=dd>Z-QttH$cA z*6OX+=%u#XCw{-Y9W1CO6s|VwvqtN*R_nE9>$YZTuXbWTe&`4y>p^kryT%K;5xc)J@7V876YeDhr!$$1HR_w)Q?4bs1u>Rh`4za>6fX24$%f{@?*6hZ9Y{-V< zxz-^5%HHhJChgKT?bAl;&h~7lP8ZQe?bn9w*p}_t=4jQ1Y}W3Lou=*G=I!40?Zvij zu*U6t(d9|`Xk(y;wNUQmW^S{f24nc`=$7v32I}Az>{M|f-R5XxXzuRz?(dEW=%()R zChziA>Pczn7a8u=(C&>+Zt#Zh_*M&QFz@=d@B7AR>uze$CL!16X!!>40N)7wCh!6$ zZ~ea8^;V7c)@T8D@CTO&1DEg#=WPU!R|QWP|K4Z_=kN!o@DB&^)3$IS#c=9Sb5+98d$7mI|aqxEW9M^HbhH>|kag5RM2EXwkXYL(0a}eC5^sv`a%swF6^Msy7;O{4-)KUH-bTwI ztbu5#Y7$o367T4-Fc>XtUskXIO?#FAFQT@s>7$snYU_W&wE!haT7gbwFH-?xj>;^}oaD zSwi&8ZUK3SCLPcL8bEbAr)`tGfga!i8%SSqD29_xfg9Lzwyvvi(19M%0Yb0n5s-mu zsDz+22OQvmsj7xRx9AnHDKOvCTA%1shjmt0hFNb(iZ%gt$o6fY2Wcd@7)W^* zAghW-d5AZGg|FxsSn`TK_-HVD%&seuAMcRA=WoNM2u_<9adsEO(8~(3P+M0S>Pnflqyv+LF1@YhYlZR(yVFoCeEBXck=A% z^C!@tK>rafYV;^lq(YZ6ZR+%C&X}bfp<%M}>eZ4YyK(LQ>Xqv=tSgUw{n`LRud-^d zEkM>)*??_o=hCffm#)^ldJDpcSg=J!g)I6(Be(({wJ{@L2z)56*v7q*CsVF$ndFIf z)FdAc*Mo-)d(SS$xOe08jCs}k5NuJ72D5@D)|tc6Lq|Gzek*nU9D4NS;FnRj`$)3y zFctBnDRe=OSfv=|a@>wM!pDqqJ$fLkgwZr=)vPN)Y!OZekJPIPW-J(k9Q79Bg_leL z4_b?K{mxArGZG?n-o-FZGL@v@&U&)3!`w)b{S{b2gB8}=V-7kl2MtA-htJM6N`DG08YE)?C8)(oF+o*;S;H?S2J~ zSkTxNC|{9Q;zB>?>7Wh`nhsmfY3Z3W;r^ftfk`jI2$!i446in}f<3W8I?R-aF0>9d ztwGq)I*T&w7sL{`W^ck|HcFBUez~R$L8HdTP&f${Dp4gB%Q{=el8Ri(2`9H#l54_- zNoUM_nIrNF<*>YvI`G~0PSF?1;BkWo7lg0A{Ayb8uTQ#D8xJ&`la9r~ZOf8N%U-)S z+c8f2Hc@TMy>_-Xo_$icbaBH>N&`s46*t4AWXzCWu?tt>=%VC{Fe#mjcvp>|lonS- zDudFH&Y%?6yI09OFTzd=rXPPvvkax3_dYjUg146ZI(=LdM8tO44MgXw4llzHs|xwa zA%I@P`Kije>khkcvNJ4>L|nsQ{_L>u*mHw15ADV~NxzdfPN-c+ClV(-*f2vn^WZ7w zV8h#IXGW>QAWo>n^{&D>J1ZzsgrrYnI_u-zdcq9kagT5mAqF|4&)ra>EE3JFfesuB z+@|%w3Bssu3B;RZj&!+`sEaG`njBr6!MSS`z)0O-3+1k1j1#uyEhAh2<6hRW8O#<*rXR_uWffPuY{ zXpe}(8;O&ucttGA?1_|7p24X0K44@fbtA}6Kd3PtFMg?a?lBe})3~WTx#Ju)h|l@L zq=I=&h>ymBQXwmw) z%v)VHSVF@sU~)U;in+SdfOEkzhFxJ7S0JYhTe5{LY@y`|SGmi(^zes343rQ_G9`~W zr+e!|!Wehp4$oB2jMmhPn}#>Vfv_NAC9#=8ST{17G0KjN^h-DGcg@P6@m}YnA2Vpx zJ%Vt8PIKA~IAznZZ7O7ad#uC@#!-yF1d>TTYa$X2f{=pr%$!bISV>$rl4Vu`npc!2 zHA}Jrax4vj7hE8-NGZ~`g;H80J?T$OnLt#|C2))Lisnw@x3#P?moMz#En8?)xuokW z!bl4)Sx6Sm0h9hN@G|Bx0hP@EaMUpKXd(=bW-F_$v#JWo(7^uF7~)`xB-x}CaPl|; z83^=<@9+y(A!*gUD6gJRz3QrBKs7=N&r$ViqOke3Pt|Tm(G@#B7LNmM=^rHqkNNya}D$%vB z(*#r^$7ysx19>Q|HO10F4|YHU27M=BsUcJzE1?2-l!H1p5XXRMCZF?!cf8ci3vmKw z0~*A`9R8_m%{l7#q;%K@G~__+AaB5f90&+J>3QoE(-AN#5$b1jI?WFFRoD&@2R`YU z)UayR&v$^$2Jj$9fih&ya8k7r#|^J?wQ?a9=ocPQJJv@z8B)^n*hHaaQIC0S+Owhd zE7xGawr0zfS(>G{N@ihhIoDIK{1nPL#i`#pM33y#yPWo} z9n9cL_CN;?9Lt;X?T30{hT{MWxjk~`DS%%V;tJ?|4m+orB*b}Dnd4j%;w*F_G=N8) z!Azcb+=Es1)K8wRR|Nj{gB;7{NIfA<4*YDmLja_7I4m+&%`)`Sbw;e|^5Qx#6Z*^| z{y{+i_ahBYWirPj+HsJBy_5*zg9@S*wr7XDts;L#l_2s3H;jB+uHX<|MXj7~Ay?%q zTN&F}4(f2dQs{A$yWDzNs=32Noc{(Yz3Fb5fGg9!cUwl2okcdjA^0|Ypu^ZJ%J)f? zjVxvx4jAAXmrB3|0Rk|iEH+HsZb?W>6)qW=kVBy?Q|Q~>D&t4h4)>DiE%K3@F^Xy> zxn)`);)J>T-H&AFJM@flt=L<~0KfT8h>ZYrSmEC|AEm%~L~z4RqZ{0CwlDt1jiMWQ z0oR7*3{PUDm_CkkOMWS~O~~<-XnD&s|2o*2Bp-H%eJ_fFUCYa^_ImqTZ9jkhJ56-H z^DQI=?w$<#jfPHBlwcX;e*gR5*DiR$v%tCGO%3!0uazC>ps{Etnc^c~lA8b8?r@j; z&b>e_%R3P7Akuqk5k7$@1HSa8Ka%8AKXP0{y3Enwwd()U4{;Re@qCWG>M8Gb&fgsK znLi5eJKuq+XzP?2JU#N0uYBU-zWL67KJ=qM8Qpg>`1tny&cR?5>(9;e9|HaI!!Lfk zNWc8%KR^1zPJLi=Kgih6zKhz=Ht&lC{Num>{nM}i{qw*7)?B~*A=~@y92&$;0A36I z;mGmf9|Ja^xcMIhMxX>vpkx5x0lFXD-~$3|AO~(BIuzgqT1x_E#RC31pb6$51*V`1 zuAu%|ULHwa% zif|!HOa?W8p&f?Xij|=r?javu#u>sP1<9R0WWhOX;5ob@Aex9AV$fc!&>cQvl1N$~ zP9h~%VnO_2B07-H=|j)azy}}z4Y=VyWa5b|VgXQwG1MU>uA*8{gCtra^wH7Jz#=X7 z8fV!YDS{H*pu-vxg%{WZ0wlm8j$$rCg(=n|GFH`^wOK#dL;ej2jqUwYGEO69U}7<{ z&5scU4I}^p4C6IE#W7N&IF^icbs7%rfDPzJHNalU$l_&HGZSDWaB?1fHU@j z0n+1AgkwDZV~1cwRy~9~B*^QyBS0qPJo4kS*yH9gBvANcLQW)Qbdxq2gj7XiU{NGI zE+jBueVVST)*6$WO}%L<_`2IK%++6vPWu*89**3Y5>6O^h_A zWHNf>NWMr&Zr@O1OGy^rN&zKPGStbC#F}u(sMy!A;7Nw`gPEw9cVSr5EDb_7B{B-- zQL0E$?&DbMghYZRNL8JgVr~^mX{>Ny@jyUbvPpV}lise~CMOm6< zV3t-=+RbVCWlFN;aTtpVU}Zs!6=Y?D7X^>Xb&p%}*VV)#s za%4M^#-EIe&;ZDkL_-P)*v~Y~5~<8?%;IVGAz+T?u!$yb+C*CBW;~kQqMeKi1X2pb z!!w`&M`g$~Foc=(#Ta2xo80C*3g;N^=5Oj-QEq2V1SfWm<5!_fcd1t(shD}Nh6{uP zT?R-q4Uu(*Cm(93clN|!5@UUWr+iN1Y?Q;!)RR0A%5g&D3(O>gsK7YP0HP>|C5=;G z?q?LzXMN_JZ{}xd8Xtth;|ZukzT|-T=!YEs6~us!#312GX2e4iVa;}k*FDh;Ze}PH zO6Y{<#C^`Fe!^%iE~7luS$8PJh$=*8Bwh>zl9=hoekht|z9^3Vpp4GwP1NXw-sqA} zDV0)UlR9ZlK&gciA7T<&m3}FhPU4kf=}c&;cS>oPrm32);FyxBnQkYVuBn{PDgU)8 zmcHq4#wnfdDW5{0ojNI=@}{2lDWMjs;{EB22I^=Is-ZTjqoN$5PN<@SCZj&8rC#c| zMQVLcYGGC?rhY1@{-0;EADIdTrv|2{hN`NrD!pi`cb@85rYft>Dy^E$sFvze!0K4a zYOVIFuhQJD;%Zaq>QVCQuO92Ky6XOR66;VJE3!W8tSakoGV4e>E3{rKs7fnuQtL-r zE4F^?qiXADaw|l7E4ZF3p^7VLk}E@+q7=LZY;-ktjB&V$cC)Q zjx5QRtjV4%%BJkd-kY%YW?9-tH~m?rhx3Esd6Kp4x5S7OvqQF5)Jx z;{Gk*KB?deD&Z=wZMaH&9 zw(i?zuI830=TfTYZfr5AA}i)DS5QMSxUTR1F7VbY?8fftUSsNhNHOTH@_I$@2Cwrz zFZ6Qk@M>=H7US`X1@11d?ovbacCYt-FNjQU<5q7jUN2T?FZzP7`mV3{iZ9@jFDaVu zRiLl-vakK#ukX6A+`?}r%I`|h@ABfW01t5J>hIX{ZzB4yN&v9(60ie5@Z#cP?CJyp z1EK<_1Ow|X1aB}0{_Cv)Pi+Om;RT~a2IsEHlE8v=FvqgMIP3`Cs+_Z_Fy>0|1mi>q zqu~gjL4fH5*Gj#??(^y%nxJ3N~C}}I2!=802!;qPR_%i0YgeSv3_`395Yw$tTD)baM0ec z7UpmPv8a3~%Z zKmfSFEAPPmJ0QeKOv!ZI@;q?wENh4@CvnK?am(^C75Z_zkPzP)GV*}y^8qY&EXmSfftqUlP<(fb{R0B$|P8pwZ0i1v;0YG1f@=54(5UWJbe9$j9mpcUW z`uOr)oy5wZ#6m-I3Y#o73#&C7AvP?SwuDswdD znodeU#1!vxIP~&Luz)+4as7leGPiO#Bm)WubILGr06Y%^i~z=@LboB z+cjYu&`I=6IhSli<7!jW;8W8@Zi5I{%Mw}~Nl-x!4|{BEck~UUgAOorIw$iwki&Dg zfIK+!aKkCsX$=U$Aek69V+|z3$}06z$KC99YVBsMjv$MV z%*8bXNdXjcx7Dw5qqIZM^iPw6;0&{3qXex8PIg!LRebX>qxLY5xOlsBm8(+EsP`uC zz+f+Q&meUH5CG0@=3wn}s|hI{O8mujeo;Ha0y z-t^7i7#)U`|)WQ~`K355)q^I=R+^XhB>90oF%v}~_4%jZt8dvpPS zw9?o@~N4I9nKz?IIPp`y!HhV`0Ghw&>z&msrG;H!^4^T1K z_EmJdn!~N9*LcET;KHkgD&bTQ+0s{tkX(?E*1=Hatk7}4Pz*J|4AsyL1vyvfQ0J@! zQmF;XSGJ=|`9ayTA{V{l>iS8b&duliYuh|-tHjQ)^OQJa4g>+640;Q2D1_&%auD&< zpF|gTzUTL@cuRTi^S&*EzRF(sS|p@_Ek>49 zxsqi|mnsD+Tw#yd%8naNw6nO9p~8?UXVxs4bLUH=M~#k%L9n2Ua19<3b(sQPGnF@4 zGIZF|#5$iURgfFTl7+ctNYNH#g2qv)4jn$kl{=SiUAuSj=GD8GZ(qNE{r(d?m~dgk zh5;v5yqIz0yKhT5Lc=6&edZnXBO7W^#aobtM09shDpc1?)$pvvVWT}Px44RKA3b$HGgcB81sjH$& zB4M2eJ$z`bw%&3~$RUX=lE}l5OmZ+InQYQYyC9Q{vL01R4zp_@DCwBio>|}_0)A6% zrPxjj(=^{yW9_xvFx#!S-_|s(Al9rj4mm3|qq3mpo&&E!=~AM|9dmLJLI@ph=u^){ z8D&YNX@uaxh8g5BN2r2yGzW)BWf;#O7Ul^j2p(jp;k*>!Ax8%xS`f#&jr7|{g-}N= zHKh~MDU{R+8#QV^duq^O2O8vgPz89z{#kX08#cm9P(lqw^ttG~E9lr{g;;hYgrGe% z(Oydu!G=P2==8f-ADS;5L)jI=m=BLI@k+;gN-a zvvtScMSpY)t|uXmSmM8wtQfJ0G0vE;C?^9KPuCPR%FJ#W7!I=rc$-Z&G;5<1H_hBs z`Ajx1gQ~TUalUL(KB4=w+7V}nr=N3bKnC2S8x^UarGb^k0hLB*A)S8gx#3-d0$^e4 za-dPcUlb^&8vz$$UP} z%w*2_+*NmG*~yk6-@2cGrFW`V4F=}SA=)HzFHLGCu;-rk5El+zmYu^V!7(#=LU`Kfq z;R#Xrq2`#dJFP-p3c2$>{LPStAE=+jYM8^t=&x5fyT&xS!Hx9!f;8L!BJvi{yf)G4 zH3p$gXc`E;1d_}kCd2;V0@HW14&n)hUG(CjKvkeGj**OI6rl`tn8w@PuwrU-<6d|u zye*!_AT-gxE%tIR?^Wz~AnaJ*-@r{jq5*wA|NJ-8mj*PnF zH3B$+k?E0>o%E#66d6hpf~{?KYn>=jnMzd}gpreUrDGtOq*qF^l8gG}EpeI44z7}y zz4YZTfvKlf&XSlEi{)X8`Nmr6NtexZrZa;XO=(V(n!X%nGO>x5V9_?8qos$lc2>EC}Apkzj=Cyp&hlSL_r!-kxG-I8GYqNmt@lTZPY*> zb!j+98dI6h6pnV4r0aU4W z5=TX~>Q%AYD4RA_jZ5X~?+hv>a1~>!WyPcAvYJ-4u5~$E{b~-q`c{lRl{>|Vs#)=B zC2F9xdn-7HRVw4P^z}@PBb0%27IHXXif^AOP)9$cVFGnj^(cM?EL%hAR=LhFuA7Y* zT`~K;3qj~SEcokk1dFf2V(PHdQtWnEfY`|S=UgsfY(7yH4jv%m1e0BkX)hbvnjW=w zo^51j{*CJ-&TawgLD8JY>5O=xPf^dWdZnk9+IspI!*`ft-^Hn5! z;fuTXMtDf_b#Slh%aQvgw!b0SFo(1ITI~QhZu5}_2|HW>^O{p#-F-=eFMLP{Q&?jY zrg38|9OFf0_#^j9?F%+{9sp=9cH)?bU|%=1uk=K4@~B#k=Cc)QrNA36(+23GMJ4Mat%ez1=rH%P~-S}+gs79h&_1zij3@fA=7j0frv5k$yQ14L!VcacjvBSV9FW>U4Wb)D zQm;cC0&BpOUCljG+Phk{LLJUG8rUbgWw+#@LNaX$#622%s z{yITB^0NcfwV<^9m4fRSs z&OS!1;MfIlL4G_}k`>=QP=}|y;s>OV`HbVwUz9qC)x|#-V_#_4Hp!3zD9OA6?R=zwKQQ zB#6&`jXC9iVrmcn&;r!t?q0MDA!>{C!YB9?Yxq{qaBe^y)Ghn!?d^o%Zw^c)P=Hv- zA>Op(K9W!5<^=&IFZep8267+>P~tnVE^)@sAOK(o9*aj(==0c5#NIExQcM2Qh5i8N z^8~O*$nO7yMD~b~E&?zJje-Dm&j1f6C+zO`#7Fp2g7_)~A$a8R2oKV>a3xM)M_epB zLc{{uZ6c%sYcir){AILS@LXQ7Bvv3EppATN@J~pH`XB`UCc-^VZyjciMSxHV7wPqm z&~}Wl5aS{V1+gWVP}H0-Mlj;Oq>uqEqzWGp#BxhRQa}#L{vrbn;^y{b0u6+OcI_eV zzp1ZG&e&J*`!-{9fs zJY-fB4_+n^RaAvlT*V`1CDv?(1;Z~E6+%ZgMF?iVEYeT5sDPFB0hLIWDiV%-6)BGdZawiG0?sPY@FhcKhQZEH_FqM!m`%;_I@-P#TEeW$R9dj@ZQ!(q}FNrWPAM-LX zQ@A2iGUtLa|IacrGc-lhsy34|-6=5@6EsJ2HCa=nO4BqwlmAq+HEFXp_vtk`Gd5>$ zHf^&veRG;{Q!;fE_IUF*jq^BFDL55#IMJ>+k@GpBvyYVXFqyOLoHIJHGdojgI{UIZ zDegM8Gd#tUe7JKiy))v#b3D~^J&&e5)$;y4H!VHcb3WoY)w2_sFj2vPGe_Y?o-#wJw~Dq8|XIOraA^3sFtm zi%nw;`$ne$t#l)Lj(C19`1}xF@cvLbe9j#(2O;dvP>&N)k5EyQi%~C(1jA?JCZbC3 z1uJTC0cAxX!%|a;CqxQtPmUB+eN$A4kW`J!R2}RM3&I58F8(03RXxH{akW`OaKjd@ zIi}R|bQL*y_5Xa;vw(HJ?ojkbl2vmORbds`fWQK$lq3r;T6c6>YqMJU?^-u2Tj$Fc zNo!T}CHHdj4ACPEsZLgx&|hp-@ph$7vp;O)AO$Byc3ASL7@j&}BVbzNSoKGBZAP7WM9!iT=NX1knwjksY z*XprsLPb!qvAVF(WuF67{=z{}yRBS9);8I7_73)~P*%MFK#+vS9?$^?a1uQvjcc-Q zOT&gJS>(#x=2qeG9r_^~@-0b^;us%g_UZW}XcVb5*33U1{#Z}XCF z(avt03UBo`aNCk^%g%3;3UCECafy*|Db8?r3UL)Tas`laBhGPe3UVbkbH$EwH_dWY z3Uf6#bajk#G0k&L3Uoy`b=8Y>Z_IQv3UyUCcG-$`Y0Pyi3U*~Tcd?3gDa>{W3U_rk zc!!F2Bg}UJ3V4M#d1H!r;mdgA33-(_dL@c^+sk>|33{bBd;5uclgoP93466SeA9`0 zjmvwx34E=}@7jm{`NVf`*OqP35~T_heTzzcJ!CYH=F1;rl#vF z?Ds=j;6nlFWl8iZawvXmMjHn_Y}6?D7lI@BLMJ#eDma-g zSfn!e61#&)Ve5fK*dqUTvrf2}QW&I=Z)qeV%EBWn^DJE^r*8tNB&75ux{`8G$61c} z&8Ti36pu(>Amu8yNMo3&W>~Ijn3!%@qDaluP)%KC08)z9{x+tm0u z=3@f+a1#qe3#)i_CAft1B8z8fizRA>L9PHkPADu-1*lCWl$9lf&LD`cW(y#Z3u2KE z0_MJrJwpBuJ}$M6nd^$*N{?TOk0WY@c?1REfh3fo6az=Zz*WUm)%TRL8PBC7exMzM z?buX+;V@Y@gSt%F#mC0cT(4n@_CxrD`oB6q){qmpB zGNAiu?^G_BWijsj^C1?tVL?LsT(Oz|GhYK`{L+J0(3u*RqM}1flfR0WCyAr^X+ETp z8vgC~4XrU+m?bM#wq;)yB<`_RYCtKIdS)&0J-PyOTHqXPnWopurnw5IX^Amy^8`$C z7=Bt77s7OaB_UbjX$MDYsn%-Ih7CQ!D3S6)*zGJh;*YV=Xsz0!kqV>zS$<7Zr+-se z^E$1tx~a6w!5FZyN13y{=CC` zx_7F)Y3RJsJG<5Urr5in4(cP{`@W+ozEx_z@yEUKJGu4Sr1)E-uKT|Ye3b$`qXv9_ z{QJOfJHabz!R5!|q@cnr{K7Fj!!>-vIlRL?{KG*!#6^6>NxZ~O{KQc_#Z`R8S-izv z{Ka8B#$|lQX}rcaTst6~pd@^y3f#ecJdtu7pmyAM8vMsCJILc{$a$*Ajl9Xr2+7+? z$(@SHoxIAs2+G+>%5SI0t-PYKyqmNftm?bV$^47HJfMpE7`eR6G5O4uD$SLV%GrF* z$H&c+DaKtYJ=H6N)LrS*B_^cZbyOVPwkUd_ad(#_ zSkOR%yL)hVcMa~YO#=z;5Zv9}-Q6KL!CgDIzi*$t&p!8^``&r)tuaUS=&Cj9&+e+V z=A6HIH9dDN-ygbfb&C9pP8-zbWJPjsUmW2dhKtpxI~ZbhslmaSHhE!Av*>iPYfJJ!_R*4nIB-JRD*^yVk{LA{yM8NM5E zO&hL98@sX_`+Bp-WR=sITvz;Cc)nXU!<#^=O=x|4xU4Y5EGbm*_8i9!ciC3@%@$eK z(VwD0ZH?uO>?sOf8HZFb0$^Q#CP zr28CzeTVkR00&N+a;}~39^^yz;6q=&BkJ;l-MS+XxchtOpVzc6zMaQvx5sEo$9M6^ zCFETdorBeWq78n(x7vPxF+UtK`8?NYrD4ViSz4h zwi|Z;dTv2?KL4-6g11E8x2dq#4Cl8>f>ml;Qkq+zsQ%nx++E6g+`s(1w==Ly)@gDT zJR59(kS2ei<$By1zKax0H|dg!Gx+4;|Kz^#xbyJD`|Yt{Yb5=Tl#IVpqToxJ$IF*` z@Qdu-OHcMxNw!@D#iyTtUUgJn(Gt#8=3Y0te0M04hW}_BcY*sJz$7Mb(7%Ga17Ubw zKJFu;#lxVI@c1CI{_Ky$WzcSqV9gr@k@9-IB7V*v{!S&E#uxdyU^J0YNB^%SPr6`O zo7MKnFGZ7?eBRHmNNgW_{KbI8{1AF~xv#)evrF7#d;K5(U>F9#pi3DB!jnfB1|c&K8wR5bAR2{W%S#!B;_FA` zdK24wkouS@B^yNiSXoMmpt-Kkw&^h%HU=_xBAP^ho|G~Hali~4#qc~I4KVmfn=CROylJRkjxU`&ZW!}XI$CzzH2AZnCj?Yd+tfRNlTljnrB6tr^#rK z(4_N+-J4|yyB-&0(1evJ+4Ia7nrHigkt}np8l{gskM{0qBHWl;alo0i_CQ_)z8WL-HG$#arO zYSv<1O_A@FP`%dR^&OJyPrp_%DS%>E&wL_t_O1P%N2g>kOQu|DO*_0?yn$)V)^;`v zXy1B*tZCOaqzAOKUG*EYY;v4Q*KWq6Lt)7N4MuV7&S;grbX;2H_|*Ar6`0nWcPu+o zmiWxzIDl^;XWm2nXON*pa}c4ZPv`S%?C?)vKCFWM-Y};z<}SY7!Os^o^!7;Ux>O@v zl3}%CUdpJ>(;^rf+v5^j_@C@JFJAK|tk_Hz{{rZFfTB@H1#4OJ2tK?(4SUR#fJ;$>IO{ex0`S%w78%uh_#z7=?b>W)#Cj zQ*7WN!sD(Y+UE4HB!d{wgEWHi#=Qmcb5E6oFZG_sh1oG)Cp)g>JXSeP%=1TC6Y|~= zJ0!;YoEaMB#kJ}I9Dmx1q2O~hNDAM-;GyB|;k##5=hvNV4FA{bDTO~(?-*7EOivFDG;X&RFuI|T9Rpw)g`OY7 zQ{LWR`oh`f04NZJdq^<@ot57GAtdZUwRQ|9H64MaBLowm9AE^KG3FvEM2JNCV1`&@ z8NEoQ^b(FbhN0=cM`UQ?Z>%As1p5h9$Q^Jgf;H?h z$aliZVx_v9L3kiZc~$MEd>M4r{w|cC{@ZuYW0QBjy@Q7>-x`U>)OysZ7BD%Cw5r4GCw2qP)UCPs41aw~ z>CZr9aP`E|zn@Ij#4FYIzeyP`kNj*jG!8Bkx^Y`eDCAU=p0GyWORE?wRBP4Z zb@6k~jE0Ds;drBxX?64`8G8H!LqSfk!PGR02<*QgoA&K_6qAo*h^Cn6@YOgU&T(nE zMLA{gAO-iUVw?Q3vs3;jaByEDBn6+1V$E5ovR@!+&#x;#aF61tNfRX@%nMpvxgq)d zHuUFrpM&u8cMCY7;5DQI6hoQk-=kF=i1I%O#CYN6e_#p_qw|snTJPr*qsc<)PRBa# z1t4&w2&+h+q+*R5k~1VCLTM|i#pLIZb0WfEm``I^d5FQXN?D2>X~&Qv8X;T|hASw1 zfFT}sEheF({~Sxty`#rorgLVklC7h(&~af1d)vj?sD2zTB;j;4f~$@!TS(rmq=>INWBRy&{mc8I>>@A z1die?{M*~N86e@(XU3FbF|INq?CE#JSROsr6e3GYG5M`Y3yAguI^S=8!Z!79Fo~m< z$@UA#d+a3+yXgItU*}nRZ>ZMe_kyhlT-RWsPmz?P6j8=MO&~=uM})%Vi%pj3>tR8Z z1Q1`td_x8F;hTRF%}NW(%rfakw>svxSA=!T(fF{*bZnmfGIJOuRP@#?iAHSu{aHq= zgzxP)is7qXM6t#P${c9EXJK?~0&qYFbxI)LsZ%ft!S>KZrlp6{JHTPs(tA3^A-){B z=&*5*BE_W7v^#4uPw?^{aDz3XLX5^6*N>$9W)Uc2V=&$ z^+bbUqo~p-CmFB5$FF13@V1NxhdGHo z9caRfN>rTGsGH<3G6~tdIBhS2o#(I%gt^w!_TkH*$agLSF)ba@J<7R0FeODGc~r+Z zA_^mRY1X2S2Lj$-z8gCWMT9!BKG+}4TNbf|=6lr+uxJxqt*JmX-yl79jT1%KPYRcC z@(y;HZiBlSh8Lap4YuM809Wo5J3}|}&3YDVlkFioTTcjIkVW(jq>J6qE}U}ifLiA< zkMF9QKsExgYs&``oaWi-tA3Vj4PZYhPNy;}5dw{Rz(EB1q!A!;d7G5S&_zt@-G%R3 z`uoR4_m&quD5!)r(iuz`EOdR1V24&HM#W|wqH{+=A)hK7jYz~nYxJ0#7K%D^MC47S zdp?x3llM&BNb9W2xN)LnRpQWm_v63IWmaHkl9;BM#t%IiNj^*@A@-s;E@)G3!l6yo z@GqXnH6>@h|3TXt_38Qn(gd({7ZX04o$p8+0SZ2cqTc*?^-&`}>Dtjj3Tct`cau#L z)b?qG!xEydVA#cP@C{;H39#(J|6$|oJcaMd0`0aoJ%{W|wGGlYl8GRzu0(;y+ zurAxAA9y8)ezL>JO?vy~=L}UGNp~3)(Uad9HNF~}U3e|y_}?>GUGoj^SZnLJ!ImBR zbD5Gj6o_juEy1jG!~EJ-K{!(Jq_r%8^Pr!0t919oQ}W28)}ONQxsk-OP{Y_zhhmEJ zB5YI^mB8`|55T_iv2umE$kC1{DshJ`XP`rMUki2lW9i5i$nRRxFc$Sjuo7%WU<040@_DM^szYYssWoQ zPBVrD3+7>CVH)$YAus#E2y|%Gy=n`bnUFCvz4&I`OChu_0xSmvlL=}Kl|$7()WLDZ zURB~|dCkfUP#B8psEzZ%fw#eSq9U#ykq-;Dslx_~cdB`kXj23#%#N1mMxmjFq4vX} zYZ_37M_AodQF(+Kg%9R`8p28~K`IiUx67y+4?vwI9?wUe<-~ArM19u+MY;g=aYq>9 zMeSLk=<^4oh-F(Kq+P61Af}Ut18wBfBj(3yd;ic#-eHS$#5fFSC}u@*PP93i z?;mh8{m6tBT$HuUHwh?KDEj=qV2-R+W$Eu1oy2pZ$kjMBmam889|ff)gJ zC;guOrsWwDJ7nM%5xRp32rhuxorW=K0kt=}=@!LI}uwa31%FB20}9k96$A!-5s^PIy2kFP3aLlB8Q<@10BU zTKP8JqOg~mbuePFyA5OZ;KuD3G^3Fg6sE_HfW2~3Sj+VqwvRv)OFnCZZ&+e{^E*%fEpH!B10oJtna7fV8(Eiq;dRb(5{ zmkaGa3uU}&YDik4F0o_mncMR&C)0PkNYZ6FSfG1R!}2%+kneI8HP8jB0pJ0l?6_u4 zy9N!mcgnPJ=w1zW=aDkt5(%hhw%Y{^#!)rq(l9=4Wi`oyeslAmkGikn==Q16NZOV| zQrN0Oa39{w>7EoA(idKOelLHp;pv77Z?UpD`OdptXirciD^nEE0Fb{|<`RlydA4SA z!`N|Du^mAVPtuMGPg>GahNd>2n@(<(!4g{Veo9s`bpt3pXKh$!GKHGXLPhzG=*~w( z*sdsjQUlcS6xt`7?Xo~{JbjEtl~3$w3kQ~b;-Pp5so#;L=Rdc7+_U)7o6YI0$go)}{MwyHC$ujQGq<+`b5#HtU*YLMwKyYwoT_O7Ezt&8rd z6uqryU~LG*YSff%1k~4a&ezl2G|;m)`p-0)p)}n%H!>zPeyD4tyK02OZ}KJ)bw&|! z{mtSI#P%E`2pMY%2lD&L3I~+21bJhJ>C{Frw2y?`3P12>3&AB( z36h=memd>RWQ9_l?xt+-pho4RMWw5aha;2|WI^pG=HsmgAMT?Vkhob>#I$f8Z^7=~Fr#U_B+$)g1tjdJj~`4*+Wi6kZ3E;igb>UG)(i~9@@97g%qrT^UQGmy;OUQ}^>3pn zmScS|1h5O~(kKF?Z16U8C(XPk4dW*TYr&JAo&Yf+SY5a&*hpT*akMEYXt?Sr;q|FM zx`4bV2LKv2R5jq04h!CQS~GoGuWp)lb{b;_23`Z|l1{c78o$ezAPC3{`;_vLlpVCNSv~0YMUT z)73B+r;~AZSl==iLmKAg=H@?uuV>M*=3wcjgF~0Ox6{QC=7oe{{h2h_HdOtH=6~3^ zT{5ooK~4R7Tt?4br-qsrV}bl~E)oW==uOOJkQGuv&3kLiebNMQ3Big$%^Mxe5lAdx zvA~EL0uH{y-uPfuldYk!ukos^eTP{hG}=P@z7}Btb4<3v8Mfw`S#ND_Qp-kCU4`bR)L{o~_~w9~toPQ+BRTS07<8onWE` z#0sG4Y8@upA4|&~e8@Y#={bfb#~OXx7U(qDd7LnJ+oQ95M!+mP$&<6UiO#>#3} zvFKtjQ^r18Gfo2JCZqm*jgI{kV?dUn&mXVQo#^m18}fAf^QpAwX@2)9!GAP2c8lUq zM?vX`ZEl`+<--=(wyEF4naU+G+mzF5skp2md}4wlo5|6Vz=L0 zp4pX*doLbCr8T=Joj^zM&-#4R$$YK3gRdFfuIGCzbB78!f`8Dcwdap!@`Mwa%~t2> zrbwc&b%zwNPp1om3#3qOd<%pp(q3+z$4PT-{$= zx|k?dDf7yhU346*io^@%=c{!z8U9YKP^jy9wwBEL$NpfQs91kmnm?9i;|t3|tk$$< zSo<=&#v<{IX{6rTz1@1tigAq2>cd56ZYTzv{`$jl51F76Q4YzO%@KU2AgR#)oXhD- zgTv6IPMy=`jxRa^^QMo%-n%+QtqDCdmq(bUyj+pBH{aK%JK&w)=AS ze;XUk$iE(&$`?Z(C#=}JmSdY!b^aRDPIWVp(NBsq2{U1OBhPm;|3#Yf_*R96Tl{5C zkoSS@R#6P+tg>Jn-W7LR2;cAB~+UvOL%#!JPJ`#?hkqsahcZgL0Gj zL>N!gBprcd6M_x)p=T!z}IC~ zmh;VJUPZ&#bx|jl6q$i5wH3D>!Qsk!?JL78PBS-BACM`Cz|Z3skQ3~&7q8*xd64c7 z_B_f<_VYR^YXWxni(U^VSpL z4CiXag|FbZEyP^xE(NX+*wKa|6w{X?goBD^wwC4-~_B_lz)nA4T86D@BM> z8DoJw#HeVLB4tgDaWWspKK|^%V2lo-6u=U}N{jmxM3TFR`VfiBBNA;wWkNLJA;DIt z1hO$TA=!A8;2Knlan3g(JM)m_J5Y-C-ZPyDG zl9EvV5ua~L&EzR9XRaKdzGq6y|0Jy#rknuIqcWrW>M5gIsGL}4YQ~`VB%>+u1FtSb z8Xw0hSv;*escp~flkbzPA-qaTAC);P$WzXgMkRI3)ci~4lbof5O4?k$IeUfYS6g$H z^r3d@A(`cg3|p0qT`CLi2~T;KLY2(lrWU*#p7M@AXp*n;E%?to6?_ird@E)x1mB(% z0^n71Zg4Gy(YzExXzDd#)htEHo)se`RQXU7EybCk`UCHbF~;-2I4-cwsi zfAyLz1>qJjm|4l{wbCbcsuq4Ju=jrH+tv?jdNQ^2?tHfAUF{cr{?@GE2(by^?B5G(&9SW^M&_6i`49F^wJdPb@v`Yc{ zwjF8*PrPHjn?j8a7UB!9jhD@wdVqeNt_kHhaoXjP4jd4Zq`{~S` zj5XGc2?6&5tc6bc7P=;+V|Rnx2Upte>n87jcSFK7*XrTArc^3-!_wy8RFc4HFDAF}!T)Q3BI=Gf?S~p|KyB#y4ah4j=HD|NA9k()f7GGL7=ixeXGQ^44;lp;Bs`CeE*LZfFTM{zovdQjiW zv0pqi9<0>JjXRQi!pD!_Q$k5oZ)?9m9s3~m7ve2{9eR*1JIcUgn->@+xd0y(F zY5WP)u{GVjnIAECbK4Hvu(d3*U70C#bIj7Svt6@UT{&=5s@kw~ys=)}q2W{*)U$V4 zdssU*=ggSguy^Ys**r>mXdlsY@D3)~dOEo8d;;0||4CnkCg7?^(swkcAl(^Of9#Fi za0~~K{K7iC>!*vc0UBg15-o9+b8kASQ!u>yn_vE$Xot9{P_nQP7!@0j;Qtyp|8^1w zj}RN55*MEq7oUolkerH;kbwxFlMr8s5Kn>-SCSl0=sn>l>JOAuG!&E{Nhw(f$v8;J zdGJa2@JPjRiDhsIzv7a}<54IQ(x{Sr(jaHkB^}lxtp7bA(E7hd1jJnbJ0cCjN5WqyL%$IRQBWL7>0r`2W8n zK0ZDtCl^A(cXo9{Z1<_@8Hl8Vll2jm!_jP^Uu)R>r3W} zV7+Djf>9UBRCBF2{tZSwRVlZeE7coYELds!8%Axa+-UP?XxtcUsxoNu1fY=r14hM( zeI0AA+0BZgl+BWBsoft-Q4-i3Z*d+Qhrp=hUx`nH5r~w_^e0*yelJynj+ckaUBHB5=I=n%YlhmbE`hE;5E%6l)6W3wqoL?4b@N6bD#uZdH@q9( zPB1*3rI9_ZdGStI!`J4-a1#BG#ulVWmcJsS0ud9Vh+>X@ntUAmxEt+UbCdwW=q%1N zV7rIFs1!k=dBME+EBJ9zG$r|pqRb0a!4eXwi$7G=t@b4qXc7wol-*X=6Ai=Y3Pp9u z)o23r3+Wb8Y#Ub&AZ2WqeHku`R)?AH`T=@kj?YC0*_$nNM>#URsexD#G^IyBqdBbm z;jr&gDRL54*$$8^nnj^=GhmPo0Rmj~C&dC8bR|BCh4gdY2AI30W#GnjoDiuL>(V#` zspuPVH>#U$vT&chr6 z_}kt%P^Kr`xKkH-T?|BM-fzlA!nDE-mR8SCp ze+~~@3WtxQLSVhKA)T>D7qP&AV%}(O-a0}zA=;$^_|$ljk_(yvTPDsEK9EQN7N*_T zLmst>P_x1Zvud6wAKKCxkFQzcOAy;tq*8`10}o9@ij%^-3hNxSrQ!sEr)`j9bROxU zlqAKggOI?hQQB=IbiLl0??ZJ;`@8MH{t_$@RzEIJ>2gcR@F%-o94P`gH@gbWKS%!!;`a^(t@B#yDnVTKa)MG9bbYCcmVE1N^16N;7_0MQxej)MT@=oN>4X1EbFm|H0+na&fOHS|Y8jFc+>)3Vb zq$}T%ZHw4C%xF*XBvbl63zHSeZcwa$m%GG0i^v+=IG?omKscT2fp-@yWv0uYkVu`LHu;0%8ygo0G##EiL_c3fMB}`^G4A9^1eEVAR`WJ-QUwL zTpd9uw}UK7NJ&r$3YpW{LC4|h!-rk?zs;p-?JHT+|pY^Ksy}o>QRHsxi3x zad176H5*;mD4**x4l}5@oWmzQChMY4NiFzao~F2e z-F$V*8hZ2 z*_J~!p#O$ZJ;FUw{sTt!dklB@7_JT-5uzCp=J8J$HF`P16r5d;n4^@KljfLW%^1#}m`lRHVN}BK zb4#4Nf550m(GL-^Z-jrts4Y={G;!em0i%{gAV}k&L10vF$fkc71~(2~>UZLn@1##5 z1avrLL_a=o|Ddu8rXa$ZISTr3VAN-iA1pi3?Ee);WtNWRdcq#J3|Nu$m0L-We@aj! zN>t`fRMkrSZ(vmJBvY*W z_mmt!loG_95~7t7=9%*EFlro8>JRSJ1g+F0&(xIE)U=jVUn@9`Y4~N0fUA$mOit0R z#|UOZ@UGnmDbs0{PyY#{HhQKvr>3{Iq_?l6cRrlw07xRMQi`VSa&iZ0W~F!Q=4=2j~@qdU{X5UyN02b(7sS34KqE0-`W7d(QX z9)NHanVGMZ4eUm67lI@9`uQ>KCw=Qr#?_x-X*hSs9Hi116rSjNEd)q2ZJyS@Vbte5 z1{t`r$Q)$ipZ%HvegOzv$oX=s`SQ>Cio^wjbou07na7%Wy%G5`X?e=41^R!(sPr-g zeuf1{5d}TP1oqqtX>bSQ030-ho;DElalCECNyRz!3x`GH%xgN2?6GO<68&wfT zK&MVKy@A)OZY!m(xw)=mrH+)BfgB3Hk_b_J+YF`#TIVv&vaAulyU~QCu0k5N-wDPf z07?G0jP_cSAMmH{Z;-w>&~Pl>c#Ywu7wYLG?M;Z3BnO~14J#x>inf*pB58_aXi0d1 zs~D+gu2;qMZlQ^Tb5ewts0R3_x0dqe29|+>ZGfR|=?^l}+Lvh;0SbvaP5m`66`pOo zeJxCFZJ8*w7dfmg49p}@?PYE4<0v^5>7XhGU`<(i9RnsQc)GEo1*1O~P`!dqd?S>S z(*fVzQFYuQYlfV1SzUL{Dagz1HQjzm(slaOzD(Fr!`0E^S&dW%tJJ{hI#z4Jz-$IY z3Mc7?XX$<+=Ku7Pc6}*Kl2d<8(u2)c`enBo{4~Imx92lo-+*-2l4VzQL|3y`cgj1Iu3vSUeNcK(>E68EkZKis zhHmq=DhWsK#}DZuK)zJbK2_a;cB{U{h`y@gzNV2rf%X~{SHMOYE0rU13g)0m2A}zB zHGgPRT_k$lhkkXwA(xCYJjPNO-l_uaD&jKvs;3@s#_u)&X*>M8!Hyt>;PSRmzIN8N z8V0C_+L1n2z7h54fra9M%He^=k}jkd{@C*2*mO7r!=@bB;atAa{;U3Dl-iD;Y$$xN zym4?g0q{|--R80*&AJ0gq@a}bs5IU51qMty%sww(SjY6?0iW@v_E8rg(u2^aQyoRk zgt2+KzBW`)$9PniTzXv@G{0h7jTMH94U}3L;DTgwS9kJoeE3ynbds_`Nu_>)Zwkj} zVk%{#ta;+Led={R>;5zr0IY#qn}XGwhCHNAL`)SGPr+|Yqi>YDzn0>YOw;jBWBASx zPGlfXL?hcpp=Qp!Bb#k%nHgK2DR`WzZUMuwVFFmDXPMt-S;*!-^UtyA&2jk7ab?c& zpaEEg0Lu)sLK{D+e4}Z;MtwX><9Y|+?U=Vk(+kj|^3HDmeq(5Chjji&45 z%qzYv7?Ld-LvD3Br{=qe&oe)$IiKe-pCSY>AzS*!zr^zuVClPrSGqVby!i8Ik@4$N z0NHW?L|M{XhAmy{A708mS`6BNGDSdnE~$(qQH;E#?% zi;A9DDfC_a{I*ic-<3dCk;Gq-GLc@)zgE|=+6c*OAM7F+{y4KUY zmcG2kr3c`21bn$%o9vkDCELIS+ZHEIld?qkjW9SP?mFH^<(+Ig-htg*m4ugsP3Xd`Y%^ zQ!)3jvE84#)!w|7y1d2ywpA$tflfI(p_V@BZ6lyBBQb9gl5e8x|LQ{8Y5Ta7BDKS2 zx6{w^i)jcOuBFuP}DwB938-34X1s%uYCzu>9}JE-q)F4XL;MQuHNYA-eC#YW%>#* z=tk~;hiVPA#9oceBM$)QccWO!14?psKcQ{0V}AOyxyK>|(0_+q`3prW;J^tC7cGz4 zkpssux$CgG5r;mfws~Cdx!;_!pV+*QIWJv!P9L;6YmE+IQQ4IT@33Kh(#nA|+(!08 z2N+GGSo*Q{SHqQp_gK-kigVzNDv`U%e{a0)U;Tt{i(%>q!{twJ=uhnG3GJp&9%p5p zg=lYHdu@7WY<5b|&G?-ZW}WC(?lE=nQJ^0>PM#>BAL@6bl(B5HY{T_Bo-vV~ebon) zIR1u{zo^=rl>^TLFaRi%aEtnLtDToAP$x|vPZFd~_VmwLJ5F>3kiqDug^s_S$d7c- zk#FshwYqn2?7+LhlUGa|3Z0!->63?N6Bq4<*Z6{4oH={;0&}QUXXp+9!(Dr!+m5Txih#;$IQ?yuFL8%Z7<2E>XSuTOnEAKVwvaWlFK(IO zJEoD_9dEd@Z?ZaX)}&^5Y-U1H1z z=s&{$c`&3nHJL&w+(wDWy0>9i>qdFI-C=atgJ*`nvO~7U zym(~3r=fs%Fa5eJS#pA*G>`dp2;>F3I&7JPbb6AX16n#Kx&I|I^i>m%pwZ~IT%99oPc834$ zC%Yqx&W#cI-=$E;6+eG-GNX3OKeoR^t<(PvwPS;VO32oasgfr?Cd~dBaZxB#ag0E@ zzZNs(eb`c;It;5HRfP2a5k^f_Ih4=h_dU=5j1Ws9pCLr{FBmnHSnV$uwFKPv4;Zz> z4~|6rRI}D>B8$mJ?M%DTZi9pA1YwGlo=tf3O*0RV)tKZeXuj;AQr}pcWf74w+M$Z^ z3yYhuhlkpyA%E$Tou5%DEaMbb9$>72xhTLzhTtDOq~b& z%?{rxRG#`HonHeWNG^{0KVVdg7~N-=6S>{V3f`Mf`Vl^G4*!5r_a}n?Wa__p-JflA zg;V@7b^Iw&wl$R9MehQBd;5dH!te%9L49nVo3`11|fl+Z4#qd!0Sa?%uLRck;EKp-b|AtY?-1{d)U({hg50@xX)k;y$ zV1FJt)|QKtpv?}c5T7qG5ZGnICOZw`yz##rBidt5IGie=(#TO-)cK-eT~xbR0(a8 zb&M}~Klkk+krkde$Bff35MgmBrM2JI+ImCN?%3zK#(Vkhk2xRX0NkM%Gb~0?`?oQ7*;gk# zlEZd}iR5Tf-j5Qr9WHYUlKifJ!KkiF2I2f}D;7l^ZV(ui-+jaVu)}@JA3*>Dqtb5P zjSC{wIPa^7Z8qaS1qpZ^7Zr7S{jM4k@IGrg?DW3qLJ;)18lvs;xtWp_^u1fMfWW9* z;r=hX=@gDn`^WAAF0H=~yZrzBK`?}Z;}U|wpAJ9}+lB@oh6}zfD|n((P2ONbU{v+# zAcB5Fc=l#t^lOJe%={PtFM>#uRCO?|m=UsCvj~3UbSUBLJEZTFB9kN2a?g3aD6Y+- z)Acxl-!kK1@FN1b5{>qf3cg>Ol_cO8J_+7FBWl3J-Svu`k zlMi?;QWBp($A$SIzu$qEZibLn$^E7@>@5S5%0K9SK%OO&gNDB*%_bCynZfhYjd}#u zT9?-+P^)muYA?54xduV70dUg{n{eWoUP;^qt^^>hOI-Lo+T-H9Y*9 z*ic&-JXw*!S=mZ5kgYkpP4`Gpb?uLDr{?0k+V`&bLD?WxOX)W4#i*%zR57M})iv$a zMSSn70RvkCH?4%##ip(fa{J>V9sUXY<{`TZ$8^bcJ|cpaDZGkr--mQrxd~dALd#tQ zCG|j8_-$KXE7hBx@y~-sTDQd=^cu=quKkYNk3*|8mtLCh$&Wj(2CCE!%bK4H$J?IZ z90|>^U;%_spXcW!1C^?gjc+MoNG^Ntux$h292~m>e>;3XCox1PaqNbJuYvc%3_J5( z?p{d04Eov*gT#>1L)^}?^;s?-jOM;P2+hVCfiez7YB|-9kfk3*bZUs$l+yc2y})B= zEr}?vc#t#f^B+GsRABKO>EP zAsj73aclz%P}WU+g}RsGQZHf9b9QmxY1O)QLNc`=HS0sGt8eMw67_s+#BfAs;07fwA(tX+foKYxN~(){**aTc=|+G5i6R_J_pl zZQ#20NF|^kPTN@WU|^&QOW08X7oIA(E*&f4qV||X$Ql<&8~6q~`gQixf2H?9GP zH#9doM>R&~mKC-4cAv$4BgPBCc`?-708^L_rqK!|*TC9)W)w=(9fJO0$)fkM?oE&? zc>P$@tz1gC9w3RFf+irEA2>9;db@`?B&@tkcSrM zoJ85)&GW7SS|$hXsHYP@R^JWa)&1JE<`>YMoOVt-;JxK;kg}|hc0V%cdy$--v`w4# zm@evd(_|2PG?n_CC+hdGBp82Ll=_<7=LgB+0zPUGy~UF}-*my;QbI8jL5pF-uywq1o!F%iA+KFBL6@@F@z$s6#89P`pbrjwmg~f7MU)A+%ql!Cb<3Ti35`bPW+i; z2}oYRK+WOOH%v*vs+%i&!;T4T?}xn>H_RY6q8fyBI`UBJH(n9BrsFf?Z9Zcil=TuT zzY$9$5hsWW@85-TkIz!(8@O#5G&89=SK<+5qfqpKp|%YAl0vT2KX9Acip&F`F$|&w zLxq}?N<6F#p3q6boDBJ+N*y~5-bPA z6JRxA)Z_-KtO6e&=Znx zro+O6Glrtcfwmo}96%m%gCJ!SKqkap3V<;&fx;R7O!mw{am0q(%vF#lCiPO!lrzi$ z3r#yL3t$Ok5egrKZ8#D}kPq%BKN`Eo8gbl1NtC0gjP9>eZLZVd)|(sPu&D=sIATK= zk~`u?*a5P&MUNTXgd-NS{5~G>ZWqrk=Qh@?;|R`j=!33f3m8a{J7M76S(C*^p(y1W zwP2(0VUZ*M7z9!cubGEhp^~rnVfB#`ScH9d7)^e~NKrP9Uv8R(ecE)Z6y9IQ>#NCu z2YG+FWyf8X$CMpo&Qma8s4eOXDEksXBE<&f+Dd>uS#??y#K2}S#`en;YJs5|Er1Qv zThw@3l#F5eZbk0oYWya5>LGe6A23w!%|rGZMt_c#w|=?~x7ogpjl!~TtvqXeZ)8I? z+xJyQ_LT(#G58Et5pQE^agOW!y+Y^5*~^yD_fU$MHbZl40l1c-FD~F3D!o~^(`-t9 z<)zx*4`NfSGozP12qq>qu2OvDz5_6_fx$uuREE_exV1XXYzQ3QNg}6s*PKEJ{tp(iZ`T&s$Z_Y5T8SGbr zBeLsJ@8ke_qz1|YN=QqC1I}r#y*}>0Q89s?ppRnyGZIqq)WTj3zFL!<9~&#?oR8|%pO?&P(5*Jdv47;d zNq(v$(jxef4`U6lV33Oh8GhYdkU`KC)Tnxx%6R6DZmbU(ODg+GHU@4QFvfLMa0rOL z(xGAqU0g5Rrg#Gy1po(H-ejqn4+!SyFGClWod>n1Wj5-krl$&Ux| zI)AJ;rPTSewSFGjwB4nJa|WP2_@+zM{QdgVo#_uTdsB?SA1|+|Kkp4iE0|0MNciGR zt$OiFBF6A^ht|2KGYT$0H6 z;@tdvWkl_5gNv@n7UOFS+$EHp?Q`DgI5G>xW3KDj0bqm))lbbA2TML8VRSpXdW3u+ zvrq$cskaQF(FGPkLzDEiQ!JkaK>Fj6ULA5?ZDQ&_5vFEeqeUN{Ti)$oIs!Hha7M)H zRi3|ybZDRWsfPqKBKilK2N-^MuWLr^n31e$DkBX*a3h-51rtf*kAo_CgUcYBRYqi} zwbQn}6RH-P5a9&iTM}vr>9=nRrez4#V#ZIwMy;U?kt&iRV5Ug7<8K0rEiU4K*e=w7 zO@OVq>4CgWk>0O=R5>UHn3YVMC-*{B3DlBT%4~TZz83r>kBziJX1|boL-m3Ys7{hi zFLoVwvHXx0@{g*%Rc!PTRvwREsb^l>*4X^X5~52ujP;`alV$pDXIby#S`@) zp(vUxEhxo2P6oA&qIiRV5aA54Rl$zg-~i+ep&dOuJ~oU^H#_VDvnngSe`=}}lB&j% zQf83)Of*p~H9J+z?+I5=?V3nkR5$vCWjyFO!ekYG1ef`2jASU7&@Fy75idYJI(Z`c z{hj=$;l)E~XQjY;_|^n~>z6}aEsytGHRUV7E|Fm_GumRp>%}04a_YC&UQxa3o3O}7uxSbg!PEO6H&!(7R zlUjd*t9gWoPl=h%yiY9~8~1Xl?-e;8xO1+*p59EI0ySF>&?Fyk7@vgB&`4-egvkKr zu0WqN%pNK5tr%(#o0z(>n=@(F8Mgrk;Vwb}!XQnGXLy|JL z1DW%jnjSucW-`RlObdZ=7#$Tp+iu zB)4uPUhjPlji%3`8|Q~~x86RtK2f*6nYVsOJTH$Zx9f~^&tF*n`?tZjw;_-__`X*_ zj}PbII62`R!tgG__AZjdH>~H@v8~X_=PtJGE^g#5{?sd4_{P)x+^dZG1Ic|d%YBNl zpW42!ql*k=G?I1R$4cZrEAu|P>>jRpe`4lGV|OnQ==W+GNHIea41MT{22hNK9U}k0>Vr zJ^vuRBv1Kmo&#-9iAGP8OM%%gPsqifCzoE#=V;B1hVyC1)r8XDZ-##trthYd2B)Vn zXEhDS>pbUs0vAXAt{eI;^~f%d#5Ui4ul$!k*A_Ie^mj)o*ndBW+tjZI^0yiV*;n^> zJM(e3E!ZU_3KJH}+l~}7LV7p_k1oYFX9la5ArGa!LV6pOdLTM);n24sw^9F;AR+q-GmLu8v0QI8lEU@=hI6&qp+oHM*A0gVjq!gl>MgfkN$}ZZA^p|q zMhp)cA-AJ14-WV1X2(LeJKo*V|AA3Ecr^1*&BE|?>qmiv%JIr)D3KP@=uC=g2WNYm z9kgi9HnmQVLe63GxOQi}4#;{ek)5m3*`b?=&8_kf( zTq?spN+1c>i6}4zR(yZL6s#=>y%or_lkl+*W)x*kDS6kEwN=@)-9<|Dz+g!NCGZDb zf8(eRPi$$4XlC<$(?A1U0favqYGFU@m~3<41L|L8tpwO29b@u)Z;R4Tbx@L`5CC;L zQB(|jC#wOz*aK@xG9T-fFp9-xB3`ER5Nlc9>pe?z1W;)E9WxSP6<1N&$!@vaeL0XK z>)El72CuyjwLLwE*2V8%VFM6!1&ca*=xUOcG3rWE<4F(LLxse9I#QX4S>^{xn+*05bJyJxfaES; zeFony<^suOJzZD*p+*?rQPFsk`bo#g>b--Uh_tU}Q57DA6veSgD4gnI1*p?Tepg=0 z2qjEtf_9j{{mGGDW2tU!TAWSn1Z`D&P=$~nJVFRTEia4k0+1d0;5aF<-?lC9eoIT( zrFNDUbk$l8=IC-l-w8XuvKvcGrpJ7lzAzI@jL6Hq7-v^vYiUh}{Qd*0_%nkX7B$1F z{DW?(6)bpjeMqbAP?T=izAH0`koSYkwEn>ZF2tLAkicf%-R^<_Qa6}f0Z9{rKg8vg zyub~B`*>O)Z>}5$>;UDy`3!n~4GaD?hl3v7OI6C{swA@s2VKkO2EgE0bbX^K*s=(y z5sMJD7Om8wUXnlH#9u}CXZ~}4{|H0P@RD5lOJF+13ZR@d%AX2996k0sv>{sl3V_ns z@WRP%lV;r_3%}SXbNM`p^hJ0)+r=K%HdQHF_a>0Hoiuv`wa(Xua`N2fMeP@TSY!ZS z4uIUEY9w?z;`-y_U!w2Nf(J9|YS9MGhyob2KJmV_GYV|itYmhNJWoI$D_$4lf1X-J zFkL0}HvB^A%LMS*Us3Gh9PxnB06ep86tSt-D z;q9&;TGK404@X7hikL-$n$%y!^og?ZU79NfG7Bh;fSjLpAUN-tg+9wFP@6Tx$(}0^ ze=Wc)OgrbX(gI;CCyS3JoyR8u7%bX(vISJDaAkR5ft+U`9kky79L{O9;fT?c<=Nyx z)r76%F`;X)N5ZUZl$9T-x0cp5(*-)+r_PF zpLEm_)SmsqZa{O5gF|acu~f}&B-5b2;x)%Z)&Enu% zWopT@)VC>EgP_|P4eTG{egeOX47JtT6`jryb=LedrtEJ(N~>y^r=COMiy8oa+iU{vpe=qwat@+kAZd^hi=}2A{A!|V z-aRH=jDHWdngpgXDX?o~(txfTL2#vx)KQ^8j3tK9*NdUAJic%?QGW~{eN9|}S`j@{ zfRaCX?pkRX^fI)OedAsV{i_94)vs~?tX_iRTqM(j$|>y}>Of9;ZV#3#j@JBC-{f^K zf(|wGjSSyc@{IaHtZ-6DxX~w8?*>I#GugOZju_d-Rzqr^-F2s1M@J}s z@mOMi795?V1vZ7!&ePT^Y{uIMz6$@|YSs*uO*HZqWoTAr?w6ECJ6=# z?495LWkUl|KKR@JuHB#RTgYNRu^cIh6+sbcE4(T^1;V6Hb20JNJ0C0Pvf8$JUG(E! zURE#;DDud+`-Q4%R+$u2~hRB}^ z4?e8))ujv|MXe}u@nYhwrJOdDk{@Zys9fG@C#f?7-NT9<^Xe?Ne;w_I(AL0xN?^NP z_cR)C$}Gh_r;pa2*rZIV8^N2JG8T`HpzkPF7v`htW5ru(ITIaywVsHX9+9Xz|JA%D zbU{qB2uF^e--oLuIbEIe8RxqH1|tJ>Z@7Gd227*>5$pG=4PqvIj>jTE#_&8%Z1%7k zZMmWT?6x`aiLo@=;m!C}?~s6sf>A6AUHHwc%|HElJ}LQZQy5}5=iKgr zpebh)+L@bf@Hd5oz)(gNXhYd+QvEM#klzwsO}XdnG^3@7+LN&ozJHnY>0)yK734sM zpmqNt1PC~2`HFIlqeZZb+Zd|U-iueAKp}tO86390_l==`o>9V9iePIG7YBk!a%-mQ#wqw$7$NK{hjLR`vRQaU zWD&hfh3zZzwOnSDF?Z9L6y%+}qw;!Os{qw1C)AX-M6#$dtAN?LDDyd;7EQ%+0d`i8 zIX=(zS%~zCD3V<+gwIpZu70HU2Swb`aV;)!_$SaJA#{rf0fLufuSjcX3`L!&~}`lYwE9+uK2aa~}Gt@**MUVkZHxp4*N*Ck2}j@pz%JO*EMZ zIhX@E!}aqG=T`-;;o`97oq^q==o#F1^YFJbC?U{r^5Y#G5i5|6(Ku<2W?FJz;hfoL z!an`Y9a9Tw=GSp03fB(d zp+%~_R>VPJVBsuyWwR$wz+`BZsAd8NRimZ4?$IX0Dcl)Fy_rPF_jFe?b-3T@4(~}f zzbljftc8y(GWhk*ppwb_=Ce8SokAm%Df6E3@fPA$v=cYi2tkLR;@r+x*@4?$LJ0 z!M8c3&W-5rZ%SQ|HV&OOPKw%&jS&kLT^|YN&m_5zVTs2s{3~V(qZQX&| zZqLWl8%uBcQKyGN4@DL~)kv>=7XMNf7OQ=quqp5UcRoOi0CHvD*Ry&VEWwr0{wFLU zH!L<&#vD_&_}%-Q!(~30tY-83@`JEoA=a2dc!**-Lc=b(o+V67*K&N@vcD{Jd_Q6} zA`GdDz~Lzm&#pzVJ9%pv?4+%oosw&8V$nWJe)W1zO?Gh5o6K_~!(b$p+m?q=5(w*7(y33WtD$2g>7;v(s zqS0nqp{BW4AL!mf{USnPZ#Kd1Q)Rph+NFcU;}CkKif`LR6GB!Xk<4lKdgLkh-!E6aG$HC=15o}M#?Tn z+n*0S*SZ{7k6^y)U+7j`?>2FrQ(EXa>imCeV;+T~aC``>(zRo6%Q#efVSZPV!SNTS zV)y1txe?W1oISJ;==%v3L5b^p)PZYXm%@=BQxyv2)XjR|Bju3DBwq&uOV2};sNVQ^ z!B>Y=Ad<%ogW=xZ^d2m8I_wk#4@D`3k^-=b@t zTPqm}V{9Y&oDspCV>%K45vn=WQ?<`mDe^Qp2##;iu4sV#Rny(dSXo9Y>}KN+n?vhmy5v>H-G8j^wPUpC=;%c+pj<#^uE;R__kvZCFh1DBrb zA2)xl232h1g+IjvfEse}$7rJM84jqxcl;8VRABF`+*L(Au1$@D=b1O%gFlWJTpkZj z!RoaILh_LHf;A)a6^-fU92kB%hBO=nAEvKfe)RRQa=+Ae?=`osMXjyFNtM|CF`C2b z)|~qjEcFGVDW~?bMWq`Cqr*u*`$qZWhTDI!_76Mi3A@eA4Og|SOI{Hzc59&wQJqX0 zQ5qPq-LAee|IIbN^5&%MO2g%P{PPL%(MIjdzl(Jh{zq4d30}1f#UV3=4TGF^?Ry3sz@E4Q!5_ys55H^o}cbK zPRwT~tjs`p7 zvosKBPT+?-Lg%dTd`<{7d0(8qA|yN}6lTMms3S6LAPI3xGvV#EIS-}gy$R+aEo&g3 zSowl#2Y_&rO`8(^J0)LgpwdK;roN{PC@16KA>ZJogKI1O-SA*KGxz&R&#bXmQ;ReegUN> z0Zo2E!zMxVXO^T%$c10nr%5=3UnGjZ@M?p?aER}8h530jqTQ^J^0ePinc})QY!)66@ zPeGPuS!qt4-)L02k00|8A#3K(=;X}uKG6>ia$z82qT)@Jb1xfIYd7c{VKF>vvs z7%11?=h9b7)p^EOGFyy4UB6Nj)QD;^deb5phm^rNJ4h3iuHK%kt6AlwZikw$t(^C7 zWg)yVuXmYt*p5ODWvy1X*NWlZ)?I>vnKvd?LQYHG#!aoVT|&^9*5lEev{fNj$gS>< zx73lh-N22&V{0O&u!r!iCZUfgh4AmQ)?chXiDJUuwzq0>w-jo(2U@p-Mr|?PmttBd zxOQy<9xB9r0w1x-{jmgmNa}s!aDDgVd^5`h)SO}qd)d=&{q|d=dJV86Wkjlk)84~|F z3cYlIv8*Y!3=~lQQ8*>FQ){`B&buj%u$i-fxSU_`3jh^*CZ;uipZ8CpIiQ^qV+bAk zke#XKM-R@@7o`JnkFE&CB1mZ@%J)872@i{`<=(i2!rA_|c8xw^V7t>?>1 z(w7O%t<)xuJVOzS-7m_yIB8{FV>IgRJMhr~Fdj^F>PTYlad0jbEK(-UyDU+=)(M`x z*IW;XTN2mOy2n9B4)uVB$_5@QHN|<8?(^58$KQJlxSS0rskZ)8`ctqF;`k7Lo^UEb zKO$T{0#fkfCm|5%!>5E*lK7+2Y7rhQPQ3IQ#~SJciKizj5i-h9{B2tg@7~>k6qv)N z?w=|j5%^hB86_~_p%@C_A*`+G1LDMdIr{fYLt+)tbltCe(-J%4U+?YO!N*_mtY=S! zgUo#tpL-9$7lo$BXG-uDXmq?x5mLNEI+3rcevEj zxgwzik~yCCb7k6P2HiPc@0aQCOl0Ki1vAFiZ$c=rj!@`7IMVe42HoS~ zaUYgdwRten8J>S?Ao} zJjIm#3b`e@zVayRk)jMXce03YZ%Yau@uSOziwuszP5lJnW3r(*8FC*sbu76sERZef zK3i0ooFO^iX`^hhR;$Lt<}r#uY{KO9h)O>4Ffe`@rBMbwJr6vbE83`?)(0*E z2N2exR5Jue>!p61mIdkUr5i^&O=nsr82`$)f4}nUqbcE4hue-?OTl&NKy87}%2B`m zF7eU1qxOK2mzX_Hiq|65d#>jN2={c0sPScIE7PE@ ze3xbBx3LDrk5k-9OkG@qT5=VnXQ5Hdu?LIe^f{|^&Yy2WX_?>GI2itEMRHWJy5Q2? zy10*TnB}5-n#$jm@~KOt_EWIj>92&25%j;B*H>CQqtf&y++TCMP5t%5@ASuQjt3sK zZ5{@ykkrR$fY@PScddrRp)#4ve1&?Ar&xJUfmC8sGJU#%|?@Gf+&S-wx`VU53nNP_aqqD02sS7f&W5mkd4l~E5$KEqdWKaju5Z2hT zy>gn4HHv2z>`}rtY}i-X3r{4)kRA5h+fx&>>nDhx33s(h$)jM45uIIWz;UEwe__|V znqr}e0^LGkvXhkx*-Q_F6@Zj!DKWxkl&p?-P?$wnkodv0nSQP)`7mWV=66s;FWnZp zbTszh6##%sdW9~v9MdxHH|0rSo#Kb_Tlu5b_q-CKyhD>*&S01h))#0*e%J&C>k@*K zl(D#uA6-faHW0nSQuewL{`M^SGt=|enr}QMgMKrMywyIV`-=U~GPEP?F}|@m1sx;8T4TiP7kNrchca$rA04Pkr$HK+8MCyM;cx)?CaAnQwc&F6 z1xU3Z`~*MF3a$5hGN}#%%g7N6g(F&0%zH)JW|XCErh2Hox6l)%&AGZoXb%*L6sZee8%|K=afZp8kJ-zxP~~r`}j@RjH=Dn1Pa0uf?BeM zU(9{YRjt5@rv;sP|L9Ka+w$=H@`pp-F+?i?d6AC>e(Q996pO} z{)(oSb{$MRtu8B~H+|hDOr$xksMTKN6qXp8M(BmPXA!)Vv?c6bQu2T|k%Dt(j|oN^ zmxAXpF>+Rq+ihBB6##Zba>SSo<8bxa5OHs6%P(z0@$YY6n|DJ5Kg+n-FIk_F$TMw1 z+8~4K-i1?r<_`;PZOoR4ciZd&j2 zshr&sKd$dFD>gSszJFgQp7|TMs1OHiB zf1Wq;?N?OvqRekKY~ReM-z#&s<%U5x>WxM^XO?vHH)La8fyH)z^&TP-uy1x`^ z{ATv2E{7mL&vpiVHwS9qWEZig=5-5w-qtt2De$4gq-~LtQw(i}B2u(7;Y@a+tX~W< zuQGe=wisw^hlQmcQ(yWcTS|KxzR}PsO`e0~6w&>BswCO|Y4X>*EDS49i}V7GAWS^g zTkP?ciu9F~Nk~$szngep*QYPp&(za2fmlPxl9%l_c!pB=UP2y zno9L9%#{V+JiP>~Xu-62oHv1xl795=mm7TS zkBamjf%P+vt`IL42ow)1@%g;11%u-|8PO;C4skg4(acnViMNfXIJ({8@gl=-eS78k z*m;~4=*dxdrzYO|qcr)4VTwh1#l|(wgK6Ty2n#lbnJozWFE+*ZRzg@Ns{8D$XeK(A zR_w!Io+^`8X2NU>If{7mQ%4Rb1@|Ch@i4|zlUhS@&9nnjT0RigJ z=K60#(4s!+!O$Cb`E=~j$$N9f*wI;zsY;T;>~D!qT+y*ND`Qb0lZ6=Y0ucM#a)~3= z3|@R14D`klN(%TuV1t&U8_5PEiPtQXc`=FM#dZ06!!P|!7m9R*XyNF7IMJ_Nxia03=9g!L>!!A|Mj4eyej3P%6!}5im=&@J{P7tnR zEsOp(DVGy-;J3j8U{(m|E^)+-yUSg|NQ4niO%LmINbyG3WOjit@8R-Hv)9Cyz096Q znT&B4`_AmC)6R@|8N_EyF3YFNCQS@vvn-;agoMF*bq{xtdL;mL_yN3L5c{2%&h2*P{<)1sXt+VzZw7pNI5uIQ=G#nt+b{IIrN$IA){E7f+a5qe= zctl*U@TQ&V4))B8@C% zRN|Xwo{9`&Ohs>Nx)EWNcSB);6Cj>fI*s%gcKd)Ou2Od_>;)YVPVi(BjfoS+?j(>7lxJ^mP&uS8=C)4^w2}hFXol)aUq+FZrwA@x zXs3HEFW6`eHo5VdC zcDTt8WhNF!tq-z{(`*d0zfgQFFg$5V_m#+KFuCy-wCVKUD9OIAOBblr-&ZscXw-ir z-a`9x9%aT3`sS#G$3SW}y?(KUHg*#QF%O?{H59ObBsIK6iUM&u-VsB<@SmkLov6)s zJlM$5W}!Hc&U>ZDdBe9rLM}DJPm`804y}O&tZ^tn(gJP^Jc1_g4n(WCG_kduthHvw zsw(l`PoZ}!twcQyTBq;MvgATY;vpmKS*YhxmhJ&aa97gw)c5fUO7`Sk@cf74wV&u^ z-{u`U?Zx)Odqv&5W!^jJ)@Kgar%umj>4Q(`t#5MMA;L#BW@$BE*soC7U(VT&t=X^Y zkKZ$l+9JGBP9j@#yIAiNFys^XsV1QCGQf!|aLfl8v?6>*P2!#k3Sv_adX5VGAzA%N z65RJHcqBgf^fm+_(m$Cgdfyfz+2#&vr;S8WbZS;7ybFaSR$Up2Vzz(B74Zr+qzblZ z`hFxWC(H4f4@l>WU=j>r5fNe+nSAo`>N`gf=$()6EnXz1rdnp$-GWf2AOOB_4E_jh z#|Q;OdeVX~Q-l~+JX|Io=wwDwN10K8xhPHSXgQyPpS)rzq>Rx?F+R%(O(UTK->)U4 z9=AmaQrqtR?f}b0w&u;7tedy)q;&r8;?cCbrBvdYmSWyr#P!{U*=BmVmBf!-#a9(k zpPmCRl1)(;Kg>4}qubJb?8R_x{e&HBHH_>}Xdy{7)k)mrh=19p__j_?oEQ-k$`K^{ z{AcXBaeU)ir0Ocm$93<^>qjCe`c-7bT{I0F2PO+#VHS`#lDvx0`OdH4Ym=9V>NMYP zChGV0p4j$&^{(AVKa(|Ukea=iw`Lkf(V}>n)~SepgMfpDP{T4rvh97cJL3a8otAPN@bd;#^C)hOI`ma;A^E37Nr6_8 ziolz@kt}VMi6^p*j`p|;y@Itr*&%JzA&H+-ljBpN`A+(YxY?{pb9q-yT<-Efla8W^ z`yyU{K>`0_r5hLF7m|5au2y#_$o|Gp$O<4ZHj@`&&O%oBq?qzg<)0Xk1wJ0lFJDpN zpltc@>79S6ZgHtwOaa#|c4{1e)dBmpEU`FNzDt$8iwoWyhlxZH4Z9+0(wIV=L1QJk zAHW~d@{rNqS$n@4eENWP`4Dx}S@)bx`6mVfiEoN@){{|$;dKECyP}>08fx&uElu;*x0SLeOPmLqqvF`-}8NJ&!g~24Yi0nSprM^Dg z{*M~{a<`70Cj5x3Xe=OA!RtOr30IlGBY8?qFr~Hnx;O|Ct63ju9{7Cd=&{Y!RHpQB z6V2=^z+F>zY-xQjd}M3O$uQiWpl;v#3t#1%0Rh%FS87CTUzoFh;JwxQ@33_Z2g=t` z4Wul5#TqE+lWdL(+3J)YBa5qfGF>r*HS_B>tmOZ*;w zI*O$9aLFw@ZWO^n?jR)m7`}eLkM3k=HxEW93`(|f5| zWW=}Kskfgo!4nmw(6b+jE>(aL+>$lRoF(&PMnSS&g({l(ue(cb`XwacJi@C)l%YJE zp*u{f3AG!Oc=gYm>*h8f-eH9!bs#{}H-xGwTvFs!kZxS}=ba(aHJfsi3gE9Nq^qYZ ze!2FBsS<#(xbi6EtLTgB#x>N_89(lI-Q!Z}CGQDS4=Y)NGFRg`T}@k4c*=q+cR#xF z+?SL}8uYvk!1RU-?&iMpGM7&TdZ08(`=_NJ*Moj^p6L#M(dAkbb7PC>xK-G_X*+qO zF27P$iT)Hu4om9vq!;(o?uO{IpN#SOTl9J5fPGhsjp!|CVl61re?ttoH;XE7-iGke zRycg!a0xE;_$urzrSm3(9!|~s-DpLszX}hl+6z|AAWK|kU{*-n!V|TWEodA~4{bu8 z3YhJ6<_mxQ*__8mD)~4^W`2s%6Gta4%=oGC z6o3KWOkp?wL%Ffd_wN$_Uzc1mSXt`ogYy+b?bX=vm2t=o#nd$_?v2yiOZ$-9#FGn6 z(%biPw|*ga?`LjVNbeF)U%TbpWt;zvHxEe;$+YgdujpBE?Aa*#M}z2j=%5*>-T2WM z^4JxEe4;pdoa1^b`}DN1f%%Chc-DLq>ic(ZV|kKh?Wg%YBp7+!a~rzWV=wjq0H*bZ zg0aXYqInAYBmRR?jgkmiq()RNV+}zeR_QS4@MoX@i7lwpN)EkQEzN4!twT4EdCFS3REr# zC!cDyh@v)Yvy4WU@wJR$&X2Z=W$#ZbjOJdvwv6Wk-dKHLtc`w~Aa*iZ9KyATZmrFa zt5RYh6Y2Xl@qfdp3D-NxI%0a(=>|fApCeVI#@=O`1!LHx87KJ7q}#k!DGhxSHfHnD z`KxhZmi?5UO`hD8-$st>$(Ze@;L0UJM_*j_q`b&r-lYHp0GpWSCn zjnyATNzUW;W%Zi7c9i4`l)tp)u#o8R3ZzU)Gn6FL={b|`wP^*2t5`1LV zc6buuY`K+z%LkY(fE6~2#S+D zSWDFWs{G><@^AH4n_2MV$$QVQ`@bhTk*=p3n!!&w)8-C;`F8MNyT3KvpBU2rnUM5? z-Cew=;$8zdykMxRu09~obr7Ah#JRd_cwtq+7Pl|59Npa&k$zdQ3A1B`rnp7~^B4Zq zvSWGC=oqSN65W7l4oORj~Ng?qt{fCBlN6IC##3SPN zv%y}+#qB4fO%hXf3BjD!I#ppVU2!Rp?NmS)rEmiLX=INZMcSuVW5;rsuc&~>-7_n5<9<8Dq`hHA&-lXm zD}}Fv&k~nEbJ(%8$_`_)k8MtG(z8^s8!?GYR!@~0{8B2co~EAYl$z6iX-qj4Gv!(7 zk$3D^Ccc3&?K|#~e^p&3c^Wevc9|b#AI1zE)3X4~RW5_Ks<8y)&%q`u3+#-6 zB2+z#h-%6eUdGPGJ9rjT{wY_wt zlRt;5$(W1vtGX3lZyn_FVyVhi7pfecs@`m1F13$))$+WkGCj?iNkhz8*{L6?Xf_&j zVtUsjxT-Dj*7Tp}RU54Tem16AGCV?-zsOg#W3hS}w=(JA-4tb7ZOiK)>ML~9@IAiT znfXYAK`$dO*Qw^cIo8_p$yHPH=L1yP$En$ro9a@@Kj!Ke8Vj}Fd5v7PZi#UwgNxoB zkZvyL%h;4|#p<>$nLlC?;wE0qK3(g7YJIB4*Uxb0JEl#`oPDbB4ILC>73 z156j_v-&7c>Z4E}H}N;-Iyx4PWZ5VsupnpyWIxZM%&~V!&GiQb^7oy#L@kN%NBQaX>u1YPiUhxDG!?b5}C;UYFEpjpw6kovKIO6*xf^UQ(_;6wc75@Es%Qt zMNjfHYdXm0lvvy0Kv~WIds=OC_`)koMd2LpU(L;B(m01&apZ+rX!WH>JNqt`VhZ2Y zmn#~83;Gk}ax7ChR8vCIOxdGOk=qY~T%89cs8r<7Yn2T~AtroaVRM$TAGT}V_{S$`K znOxrsA6FZuT((E=IGTJonkBk2shw}wi1g2XpHuH$H8#ID^>8%ILI4&|qF??CQ`Vfg zSIdb%rwR3>=qx1)_k*zR>k(2{3-2_!H0re$vZ;m39x)I9)r-EV)u5|?o9Fnt?!{8~ zSK`1@NRr zoIe%*eI>MUzr7AZN8H+_Wg0m^ZHm~zASC)U4_^x|@u=VlhKdHO=5u}mhC*NjLntSJtA$)9$Fb2jxbQn7F zY%UxZ=8BSa3vJN?U-=N+Z=y)ffYngIXmAia9hM9nSUv(J90iEYfEDop484K8mblXR zp~gzVHt&LSiUpq0(}$6eW0HU-Lq9$`Jn7BgsZcz8o-oSukYAR#GOj4kf(!TnO4ttM zpu;;c#FD8GWYhLnScW#vfNPSV!dcOsM>3 zKv5Yb@=S@qij`XaER3ole6ImlItf%m3zoe@$ZR5B0-^+s2n?5_=;)#a+#-xcgeryE zObJmEjLsF(ZAE3|o;~4R~0+sMNfH3a)?|mLM`qETk)7dITT} zhpH$8OOl|nn*d9mxCY;7(%IlUtyuD;h#Ois_6$f91_(cZ`rU<+hep~P#WccVdkleP zA_R%gJnC`)c`v9O4wdbV_dkF}963qX+)g1j#d zLL1*24V^NI#ZCeqp}&mHVvVWpz`fQ7WX6!FqpJG%VM|B2bnt{LI zNhd4B!`A{TZ^Fq?0K?1B(F5pdJ@|zyP<;mc7KZ(K2}OJctg@LNy$r2CNTk#TLwGXO zQT(Zuv2W_Z1ZNrAqy)ltNtD|DRB*653=FXVk-9}lxdM_!!H`WvBpcw>3b>djlw}6A zp@e-I4VBjl^05cBC}XR%1Cs5*i2KAhB04}e5!Ibk*ch}P*_Lj4pH6z787i8U?GxUY zi9oYRuOkDq_d;X$lc_N>{Fh_c-N0mjkVRwybdJdd*B zIX0cb+~+OmUo4+gOjKVinUj7Z94hOOaAsUW=2oIoSwPlTA`+SanE|L|=OizOD=deb zI3&D)SA5IPVTXYkTrvAuDh)-$vX-+{MhhQYpP$DaVkMyMj0*BC+{uQF1=oV;aTIZ&URGXHTX zNo6(qc(tKu^t4#Hs7h#%aq40v61vh^!(T~wrUj@Gi~8P)X=qdri>;kl3O9k_DQ6=z zL<*CmYryCYQL!16bX6p*MW(A+rz?%5g}5>f$uxA}lgjv)tkqPrc+h%~!73DEJl>u( zRQka`owSBmt>)Ob84U)PnLv?nt=R)6A%L}xa-zg*l?xRa;v8|3905=G0TTWo67pEN z%~CQIf=71n1Lh~L*}4@KY?LYjN84uYkIf!k&D_f68gEk9Nn3O&0QvzfB5oxnISoYZ z4MZ~yG7dw?Jb5IneB zun-)ATL=(b26xxs3GP0)53UIW3GM`UXSkERd*8F~Ip@QD>R(;`WqPW*db+yTto8hw z@k(CQQ=HW|u>oJ4#tV(sTkX}??BhYW5h=LqWxRcyBHC17+zEJyvJvdU+AOwWm7sZU=&6jrxS(o7HmlbE?Nv#3F^LXnOjF;{l$6bv{*3 zoATn2QFMmM5MI}53G!k&WnX(Yw9g=)*OH?r3%zSGe9)`?yNOpQ9XH~pAPxn0X8wKF zr>N@GA)j9_5=l+^-;d!XD)*&~`F-8%=PMni=oxMz2j-69Tk9f-)F4ulhQ&}MDlH^q zO!X#4`jSKjg?W{+mZ!2=BdGiV5lju1Jq|9GlO^ptT$R7!f@ zrwGJyr?FGAA5IECh+}?Wm;B(R!+5;$nYYe(8udx^&X^nmFrQA~ivS%nf)lI<_eH*! z&BqI$P7-0_1LX^o%Y46uB_%5Z-yP)Atouw2=H{`7ImgtI2gG*F0mN#4p~v8z!oy9=m?)lhp--IK^>Wm2oxdoezAL^T4 z)_BwPd*0rLl$oep!%H4{_#=(UOY-$gR&>kTKbALt2337nru@8Qp13SszifH7yji<4 zNRROrkRj`oJi+0yEy}z*{`!w-sOc_uZc}8B;n1cE=5;pHZOrR?72+c*YIM%E*HhKro0`$rkxQo!#k`w5B9@%HdoSjAFAn=p0_UHEs=ZPPWFNpD zA^l$d#!lFrJCo`3rzyrH)%`-peQq%ICzI)~oOGE+48bd$VlI2~gN((F2TgDTydB^+wgvW6u#i!qIQ~qZy;)+1R5$#|&MaA}cFiNpkpmMh9m`M;EFm z`;I5Sf=+gePZ)Y&CrTS9&z&@AG^g9O$8x9l~P$l z*7g(egkYkqT%5^l^adRB->=bGnzYjxVX6|AIx>+23!?O{{ew~Y^h$wxge9uk*zP54 z8=$dK8UZx&>@ z?G8Y~VK$gQHHAhHaak_Sf8O-}2cs^WTa10>`?RyPaA7r-Llehr`1{hP&+lpNt5pBX zg$6p5-iLs*f`np(>8H~kXoO7kbsaWGFT*c|gd4xh(`<83(g5y0^a6#kWgKc%zeQQQ znKrd=(p?nVNi~ESN`g6S_<#w|+xen2E+z?aaVT(m3$IDZ&)Rc0zY04@*QZda*!&D!N!w@QyaD z85A$U-ACx6{A!ffMH%JcUP+pN(RI2Odo$TZRp=o3P(|dzJQ_M{q+ecI?FEh%Dn{1Z zMWMvRcm6JMhnFmrEdRwf$TquNn%tDs)Ze0h(1bom!X?MQlWcC|Gv{r>q-LYSpaU`Wf%K&6f+#fy70W=@xF7W-wdN5+YB(bV9*ItbP99>7iNgm}ssZmxUVYVN)bwb8AzQA6sElrj&Fm zZDHk;YIJ}r6IsCh$it~`#<={O$>ZaeUY<*|Zd*l~cjUtKSERCSOLlfha~NajN4{0_ z1Y#ejUW_p9KV<}~+O`7}&)T1dh}wis=U12)9T_~Pe$!sY>!xf`k1`?4XX6}w$dh^} zd9G1D5lON0ZKFz9?y!OodmyNUP}{|aPEX0YFX%6fx*#dyyd~r6Gp$OJO=n zPZ#-9isT{mV{w*$@Kx+7d=WSv zHbjd*-n~K^WsnT@C4Vo7TZ@I-ctKM7=eZE+Otr$zgFY9uwmCsRjBFeF)yq$oSl!7`G6S78(SR$K&K%HV+1x|G}sVi%}Wap2HHv z8c8vIj8Obxr~-LG0?dOli&_c}qq5<~XIE@68tpQ@Gz0f-POqzX{5EenlQN# zDe-q|q+^1LdMsb0>gAlJ?vF5WW#5hUR@S9YQCRW?@u`?m5xf}Y-F#({DrX(4nI)6N z%%5PT;`)0ytLs_z`ZzP$v#%s}g zjr5;L1J?!idX2C zD2BMTDl8j0WMGDD)rt4oqpnv{!hEPSL$uMFswriG1juB!dD_hb+O!5l32L}i5#cz!|kdDBk_wIJ&zc+N6`jZJ-}hq8_q!s$Kd45nSHT=mY>^>?j3f-`<8ROb24Qf6!ps|a2RzN ztJ+geY9+JPooCPRlkZW~;`Ip0t5c>@KLV-M2V~uDr}1ikqP|raxd30h%q*Ddac!Mg zx5q&m<|NG`LXRw^+ecwk8O)`ej;?>(_XGYvu8PmbH!lxp02+_-hbuIk;T(Pg8D3e`ok6j`-c%te)6QZhvu%5El{l; z=d^6=ZH$i#8G6{(K^;DpymCq3WFYbBVG5STMIRwzUS>#%X$B4-`vo3)}#A`!&q$qC;BuHicQhE{? z!EXIKF`N3Nn6GqO=JXr31-v_)gYQ9c>Njj3T`1RwC!_ZyiQ`$}S5!MrNUu!Hel}aW z!Rk@yF_q)j(OsHB)q+oU?8px>eMV5*{nOA_1_9`s%Y;B+TIc3DV<2dP_GTA7^Pj9iJVy;-&gp{&JFkm9#~u7!vg|0~hBBzJ z($^uBYhWEdua$<;C`?ej9ZSi|YdRa|S|Vq-uUYK%tJ3dFg_Yrf{;tiqUBhi_ba?%ijaa zVssW|<+Dlk>@g%~be>e~v;ETFbIi))5W9W$f5}(0k=7 z7G-|W=(@hx_sGHDdui9`rft{v#P`{I4aNAjkHzmS#@}a)#rSU2%I_lk*=JAA_}Yj2 ziQWtAa)!n7sv=CFw(M)E?(cV5Z2WX!<^Qn!>~}k847(`ye>(E_f7~^G ze%SSYeuC@NnB8afodi;ZQqSAFp%xVQGCQvqs7s(#L+9nG1|p3$HcLg#IX;> zaUR8SF(vRQCGa^U2t*_Zl_iJ_B#7I)L6;4P1$lXP666&U6zvj}V=xJ-B?;<737SU< z+OZxI`$kgx96Aw6MrBDR14(5zNhvc))@aEWS(0oG>@4OvY-5rymn1n4C3~7BIW8r6 zD5YL;Na=w3wt1xZ45aw&rM4uc20u#)W=RQE^qB=psn$t}E=h?U_Cb532F|1;D5WJi zptwNkQXXj;18G@%XC27ufXz{wVI;PA!5lJ=s^migM zTFU+O>@sE=GVgt4bSpS@4AONgWc1tnvod5tdSr|aWsDCQ4GB|?DP_$#2Ex!~O?YH2 z3}h`u*vx&hETd&@vIfvSWvvTj?Z;#tX2k5YiX9$hon{6cVV46=9C9vN1D`9BTnyyg z4*OjTlH8)@JYD)pk$a5{pftKcRDCXPue%p%9H&86XEGk%vE{awx6&WZV zi!N@V|A2c?XQ&k#}r}EtPD7qQf@!y4^|$DRvfNS9upZE z9aElo93DSZo+=og#8mmIJp6-0Wd?J2T3KbbVd$5=%DlnQT(rt>%Ath{l_lul;+V>c z{owMU${NSuDyHfN;oty=>Xyjhy0Yqy!N9h?>K^65ZnWw?wEs_q>S1vI!IM3IX38vb41@w$V?b054p{#bz0ll(UyFKi?iB`L>=)0>>d$jL+7*m6B^gSJ_0gif~ z;T}+BFYu*0Vn{DYMIHHSXwzOD)vymKMjhRv8Ld(slc)h>Tphck7Uf7CH>MX0>m7c` zFwV<&guXp^D({FJhY1|sk&5<_#JnRnZ0aYgd`H<)M=}16`l_1f=p8LzF%6ameM}+U zOASWR0tOWgW<$8?t-%_T#}cE#CR$8YslhQ`{9;^#(=g-Zkp}k{StzFFtL!4KmzunW z73?aS{2h6(9W(`0s`z3wg?<$aR%(h6l?sn*iixJbInorD=@!M(lI%}<`%+8#ONNAs zmTcvKjDwbZN}gPdmSSaFPlcB9b|ufamTF48)RC6Jla{)L<~u5F-j~{%OqyCM+T1B) zV8B0A8Wr#i-~hlY@-Hfli%$p-9svt#wy|+={N&{1 zjH23{qKa>YrTImr1w|!Ae^Xpk{I}p+_wBVCPK;MZgm-F?PcqmiDbP1DGBhDRE-5iFB{?}g zH8m|AUSE^bvlG(4Cu9^RWS7O|R>tMk#pN_c<}`%lHU{NDz*$XxY0bV#%{~e6H2K8; zjrYHJ#W#7yHF?H0dBj3IVj$k}b^ghf0jcEyDWw64h2XgFeldAIQF$Jb#V!%m&f&G6 z!)iZ=R(}eva11K93n;SzmsYS#7que|qY(fHD; z=Gvz20@3TYP?xCv-XBH!+IDHEHh(aVRw|NGp{`&!iB+@A zV7RVuG>!Ws9F?AC0*C)YrR$5;0-gi^cT`$EAC5|275^&NttZaXtuLReHtCC`Qi4=0 z)LTzSc9b?&E;cz~Xk;t>L!~eFUy}btr44?e|2HblZnTtmv^p5iK(VCs50!qcv@+&t zYBKN-m2PeLGi^cTZZv*xwF5_`M{|~2uXiR(Tn_$&N}FgeQmcxrA8rmMvHR<_-{~)P z=PTu^cC>!!@6EPr>S%AfIcaEuMctr1wccIqO_!5UNFj$|oo1SCBb+f+R}Yht zF*RHK-gj?9m2!ZUA%JU^RXm(|r(`o$B$O#AIJ}ZoJc^%qcq$r>N@pd|Y|L*asms1# zl7CT_jtf+_^o&n5a4Y?qiXtSqoo=35x`{k*h_;h~;PGcC)1&q-H{J3tD!u#7hDlO) z5D-0FduLvB_TPiKzDLbfQY}A`C_x-(3R|)NXap=^1UUpbFR<_1& z+D$ENUpwRc!ogvfzx)W2AttQbFh{L>)GQx5ss~vrDtF9YK}W7?fhDkWg`K*E9=G1^ zEPiaGpaY8|@FH@Yc7xdC0o{lMn2fR~vu(@mxYK(z<~Ok+;y@&hypsV+jDc!dRMNa| zP~W`C`7kTa1-J(@@33x|*Lvm@Ixb`X+Jje4=d7RX;}#f*JO&u#WG53BpQK``bk(J? zf_8T?q&?PQu~D>lb7|&^L^r+O6!7!>OlNrbWolG7Wh{oY?yH3p)^8-x{6eEsEDuY`GMCEo0R4|NN)|=0wDfZN{ zh%*U9<4GR}aI!odxh%QZA*zylQmiAcD9lT~LmmX1M(xv;ssIqeQMi0$BDq!sw&UM3 zwrr;6Cg1I5f8i9hpEA~VLjaMP1b{wAo8X^(s#kTD-ONgWQut~zVlzX^!98Shhkm?k zv`l$4r+vGhJkAExU;;9u`34tRH>LZvmR_js(LjG^(LmB}pd2ZULic;TW+HJ%{C4@* ziQSeL=Z;hrcJK-dkm-!tVI6K`Xf=?Nkk?nZ!Fpkw#;dW#e0q948o z8{Z-T5#>Ju2~F^jN%O*Cirr|8Yh2xiCh@TIIVL=(mZ&@SM3`g&k~rB2JAYnujq)$D zA4BaVMU0^?(Mpu=f@uaj1+fSMV9=gZf+~~~M|X&VLj8Th`S_Y~#jV6jYuXUT#7m$I zCFA&0*V%9PqtZr*hnF=S~{NBAXPOb+i+XIlP$r^MTdfkX&&EkSqCLo=u zH8bRRaSoKo(hr=DKylD-1bfd>{`;R??a_OA)aVJ6#P5(Xrb1*A6M`8i6Y2LvR&QT{ zBN)R0AIU*syu0cubVjtvs7~UDw18N&TXvEahHpUP(@x6hJirCRA3~!Z3{+(kgmsUd zuJ&6jirXj>`tHNjuCO)%O}IbW0!MYJ}) zu=kZ;n6TtW!tJIf6A!|({+#eRj}Fa8JK&ALkbE~5BuIktw?HJ_2#VGgBH1Yk);s`1 z9$!3(HhJR_yZl|032hSLS*YfdHXf$+nwc`<3m)Y^zh>*o87Zb@cRRMnb5A`Z}3LDyyntg7G$g!Pb_1VAruAP4J41mh4L!)0AXl3D+R9 zMBL~HLqx}f$6y-rHv^ZjaUaMUnfjFr016PpTe~NS;Hoh(z2o9}xHW`y|GYH1?qtn5WDH;X%xeOxd04YGuOG_=sUWW#~JO$3%cwhVd==l z$;bo_oO1xN#Y_CqRTEs>34kQGP==;vutj(PP%g@5Q=ENXd+9w8LWIKf)2AOvfOfYa zrg@fxSBdYH*6+cC4f$8cXQ56a%@!oxAs;h>v0R$-X|yHeOFefP8v;l;ZeEXKamR8K zH~>ZcfRm3QJV*vrq*f&X7EkuWcO54Qw|w0;F^4fy^H*(i7NA4J31jgI8eCK3JZ}ynD$@%5r6G>cdqj9hyuyA{M3kgpx)TaP{PwbsI=O1wdB!CNjme6&FtK2RB`y z4JRW-uc5aCzF+|aO=bb|mT$YF>;%sha47^b8XY5^EyI7qnA z1ih#m)eVfnxo2&HjDiLB$5_*a+@M9#q7{jwmjf{0Yx}FpQ`Ng7;H_a`=!BqOV|1H@ zpzUB_4d|D$fUzaONT{LsK;qWxVCxbN!tg@E-t6WKPDI(Qc9OM2K51wns$B6c5&K8&a*wF$MwY7E$W+oOUf!r? z(r86cq#<2o%3c&7VsvkF^u1&>pJ{Y-cyw2Ic*aolYzgaxJi%0W_|J6l5s#R)d5#4E zf<=$8<#6#;QaCEjuKklWc_>QXIre8#?164v={ZBIF0M2}+yGr%wp83TX?%Jh{hd7S z!%*DWUYsc?9$_Iq44*FNdmKtceA2gg422l%uL)m&QlA9SP~RocexP~eNhB=ACH72k z*Nq`>NmRUGV~W6KL4)yQ4kz*|$a3B#5|Jh0y-wm=Na}M*5>UVuvUx4?CrQ>uK%6XD zoF^GqGgMv94N>Ii)*mqO~6 zS*rD2YWeq6rs34hjZ`Pkv<&(*LWQ(nW@#RGY2ok|ioHjAxowe{a=k9ABS;lw4jDimtMV=WYUo*;DGAb7SqSB?M>8C^K(8LHFr~e^@(dyg*W@ zKw7Ur)~i51qd>9sf1%PELWNp-g*sk^x*3Ift%U|~R64Ryrzzh|sK{Ke$kMCGJR=jg z=6hgZHXN1y)dDc)E_T%`cJnIsfKOR!E%y2S->9@u2@KvzFx0CgJfkGCwIupKs5E(L zqEKm!P_UC%X?jMfEjrL{qzK$wnnzytU8t-;udK+c>_4b<#qYB3t$+`><#j^k|3Rgj zGs;_A%iDjKci#U)rG+Y>dKCj+6+;;nBmYq8iTjEv^2*UxK$TwQtXJjyKU5lz7MO$1 z`b<`}F_Mch1={hd+RLcgZ>>6nqtf?Pr{vY=Le-ag)z@Ctw;9#=*(TmNo z56zksjgAPQWc`*@@0Rq;mW;NRti_g`hn75w*6(&Lm}`hd-mN8YRJyITVzIUAp|ysh ztxmYDLB9>+-PWAh*4ozAzS!3J(AG`S-YeV=)o&lbXvgGk9f70Li|rE+?NdrEi3dzP z>K(H%?~eJ*j^Aw^ON$*V4;^b1og2cPbBh2;r_R01&i%H|!^O_yhfX*ueJG(YxYz}I=mJo7BZzb(8gwK3bOV3fKMdPuW+ z=IuIBmwKolduSwV(`mCu4M2=^&|hpIk8S2FvgMf%~Ww2n`|ZdSjZL9Z-kztLkq z{uopNVZi(ls?pwWoi$+FK48Bz;E364XfWU`GPuM(ATK%S@z`tiIN-B1==V4X15*x3 zQVx0=3|ZI@zBU_*a!yil-b-6d68J8jA86R)`*Y6*!!w+!>=hoJTqGU1X%- zu`hLLxa6=mgOZ_iX=LePxR7$RPGq#fVD!d&q$+C^w|#{2`)DU6sK$P@S7Z!oFqRlS z+Lbl7J~~SAeXNRdY=Cn7r^xt>LI2R<*nCCDSOwie^vIOK_!{NJhR6i9&-k*>#9|iR z?%43E^2G7u#3|+Esolgu^!OiT+AE*oBMvw!Jqc4Dzs#B(_L&6HPery*K4(p#cTD9| zP9ay0BEF=>F&si2pCbN?N)KX-{-~t<0qp(ZVeo@Y^e5a_(ro`hy9^tq#-e^9I!N#E z50xJ8f4Mx){zS!RIKU-3EwVf+}zmb~T)H^PTf} zYO~00vGX0asigE>?oCl@%-5V}&~FIOo{#L9kA|btPxJ9q3yGo&$;ht+hjVToK zYEN@RJqx7DEt(iWtZo1tl}2+yE$jGQvHZL0>30p)Vx8z>gW)2?cd@R zR|s=9*g7{jRyH_c8{Ee$@TpnXF$nkL>vS+E4JUTTyBeSKXCT-SUI& z#Z&)D6#K)5y(hi0Tr;>64(kogA=&t%R;MfCo zB%5~Z7+TpYI6hojIa+}oomC!n<@}k8?fGRywoMIM5ZhYpT=4_|djZGiVkeg?yHl#i zf2ap`J4ya@9OrFxeJ!j;Ctz&Z?;ZAnrSCc$pgTx&Ves?y7cLTcC0KDQ&mGOW=z&Sej zlBw`l73wJ(uL=^Z9U26MqdLaSa129^}&IDQpa(_?;k$-GFi@NG|~Bd3uag1VHpZjh_ONx&Ts~Ao1KF zNdZud3FL$mvvLi9d3t8}d>fy8YK(J@#c}N}ac%j0^69{h_#4oh7pZ9NS~DJmQ*&*p zkB)YFZTWzK?u2TLi%9_nyk5iTi$_Xj0pW^+f;0i-CP)^e=#4Uq_Bl!j##x;pnhg8s@73bbtjoycGBbjkyqSc@a z0+0t!0{P=nT1*ts0ce_FRHPhq&v;PS6gnsu3Ba=*kAPfMp)8TEzAhPxMI{zY`ffuy zlIW!oH2vMCY%G7UE-@pM_vm5uoCxXGnU?O9X$gW{qc5m%wae5%q^5Q|Vn=|14C=mCYu1{ZP+l z*qeN(eGNyYZ9ew@7b^X%YO8y$R3m;R`Ym7G(r$Zy1s|);HGcMk3PIqMKq4`( zkwC$Lqtbb?4CRffKlKh;g3Z6K0YLcbw9-hp@+K)q_xJ2IJy0oY+KvgSZmw?H52#{Y z28Ud7RPI}~ay0&k&flIVycERI;-nJ=P}0on6j*YVUyU%lpgfn{d8H+vii|GbO~TcY z)dN6eR__6VY}KtpyO&Tc0}zO(^3q>B1;c(+o1&|WBYnc(CMG+omBmEUTcFi#!;F_H{95Cz}KWX=iKL_8Rg zwwade0xUC$EF>$Q2S5q6DV#*$EMbh2$8FBj`-e&=JhbsI0*7S;hn?PAwrnqJgnCMn zLd#B<)aH8c5D+c%4r2`6U{~h#T%qH0;0W&o0g!TM9$f$;aeQ|G$PbI3)KIG#K#7ti z+YLZ^W%FY$VUW4azJ3w{(X^)!6|`(Za}{)K*|pqvX#4zXPSTae7JIjm)@dz0c&FwI z8M|`C7VR6i4{HeOo#7S%XsHscaT*$>QfX-1M!HCt_CqpASVDL7_!=55{Q+p5XQq*T z&*H*=QR(H)#Dz{__r<-P4)?S#lcJxt#T-T}O{8_%$$~S2zI@XcdHWH4hs=vQXfMCd zBz21d}UsU>$@>5u)!`j^3i2KcIQ}R<&2+FA@7GC7XU_-92y{U#grs2=Y zvt7?fHQ*obBrsv5Oio6>wg}jqwo|0n@k! z#N`IlmQp01P9NM#U=kJ_RN=4xIvPF0a&s-;rF{{A{w<`kOb}a%gE8|L=Epa9uVjN~ zB>eLkO!)Znl*}R1*(b^|ufCy4TFt&ry6{Qn{S^8dYeqZ^qc(_3Q6Wg}5H}CO5JLjX zc656|(dNsZ49YBi@oCTWcanZQRK)92>N1-fU}0zG}2l4-wL$TAwNYv}vR9$4v_rm{Ot^VymU}QLCs| zx%B;$p*F^rRw-PPHoijDZdBx~NaZv5$b|czED+5~x)0v6&CXz3=zZ(#uPXO`JEN;s z*j$qk2yB96Zz4sn)8IB*5f)=?`iAfIRsk>l2pHLzN%+Hv&TO4mNa!oXwht3#!8MUF zgl00rFQ(AtD$#nR&5v4RoEv5vt3w>@Erj)d&(1=c`W+nY+OX7Edz-qD9G&3HQa6a_ zng?YZom1KjcKGL7CPN%u3xy5$b>>><`W@X0l~9kIw(1L0ep>gBGM>)vG@#np88#-w zx@PrtoP>Px*%mgwpPlQx>Hp++l$ZzI*a6+Ae znM6#{-_Q4w3^;`{VWMfuOQKNRIeI4W8sYn^L+b=j2oEE%zNAZ0%!5BiTZnvwkn{F2FfHM8uq)WMN27);Tey-JJQ&!mwJXb8?}G#lK5vz&W+C-Ga?Z z0wqcS$wDMkV<}r#lS%fq)7WDQ;o=qLpY8#RZ4oP>$(DL|KU*Bu+VF<#@-e$mtqi1b z3h}h4TE1xt>BH7ohna;RaiOk;XCgM=A|(iYXBTrZs0tVQ)ArQ=|@>h~P8!&UlIR;OOM{p?_bN7a4Vt1(fRP;VL?Rd|zhu!%dWUJlMds361ilbmgmoC{JWS2+5&TYTW z9DN6vGE_sI-!P!6`6J^xRX?;?W|3K!H2*T~iYVd|tE&CfN^hA+)~Olf)+I$+aIMkUEBG6%0(Da_;}#Y5MZ~GQ0qO3*u_4lV7~C9j-x!+HeNQnRNqv)p-)TpezvoyPlxBO|m2YcxQW#=5LM`c&r; zquRQZn!8-L-hPM{)-xC5I1K~o0x*W;aM1dVVXlEFl#(`?;bxcE=2`>6OE{KVs4`G7 zn?qjP2Fb9R@?NQ4YgQD0EfhyUki0sIKd#)OOCWdqkahFh*W#cUDJgQso*{C`){Y9m1;^!yQ5fjt-R{DQrLu#iX~Qq_?I- z52xgfAe4x7Z8=x!Y$-$b=LY*(^Ij~5%3ert>vqv+l`k;_(blvoJ0b8g_E5FIMSGOk zWk5na4Rh`ezFI_vOFlX^LOCBpeW!!PIOM-e59OPWMU(^}vZ97^BO%KJcw10Qq*24h zM9K+yD}tpfp^f&u?ah)X>by!^!R#9A||Zjf{ke25>UjzVqTJ(V9k@TcFw18iy?1`+^} zgTWs?%KZcYZXWEW9sn6}RLyxX?gF5gcj#kq+Caf%m;fRgSh+YWa9A0Dmag^|%DX+q zTgD+Y!ND`B++c_K=7)5zA2+~#O_8$z*e>J;g^+2W#o#edHLqztjk`MtqDOdn!;yvks2#9(yr0 z*8N(YS4!OuQN{j{U2{va31QT=x!e^XAyDZaH`odGW52v+=l}t`cf7C1mGGzW6i2^V$bWM3+NCJMlk^@a1&`* zgRzDJPuG6-KmOF03FjVHgYjy{$WQYfwegFpA7k`P+J{F*vs=+Nsqg_@JlLhjWe}}- zYqBO-__SRF05&nrH6mJ?zU(#7CO1-TTil zt%J_G9FgM?>Blc2rx3}-BlSDV0Gcs{GXe$CWS>DR@SyNkYWAzu)vUueP_jdl&g z!|DgEeZ7(gkl*5S-68pDk3CEOE+|ARa?mp!j?{)Ij6X&TRP@zaw*lUZ1bcG%CCO25986JjYXePKrtUF^_aJmy8Q z9g~UJsbMHm_1wt$M1gx~Ydtog$6+WZW2--T7?DA*&Z# ztd$m+W!G%5^S2Qyy~If6u;0^l6W5T_UarzcQP&A`ZeF#WQgG9SFSa%nkVQEgUskJH zUTFNN!Ed2uROzaVqO&vIY{v89dfXL$yNN;0z6=f-0&2>KXmKOSrvG|@3(_RbcyS8~ z0&m%ehO-i@k5q1DH=Ec0Hc}5n9opZB%I81{QFnDKAN#rEPL1X$s|zQe#xZuwVdT3u zwy2PEBeztJNunM93w94?>-cyp`fs~l6P?}zRvc9WVg2E}R56t40mjxLIsoJm!cYXx zy;$btAjgPc?LBOB>%x)Up(7lg^Z+EMjPaU)3|5;Yx4nq=F{)Yw zX%kDUP|L5(`?TNwG}ivfocL29WW)P%zZg=IuTz>i5K*{OS`=$tGQ01VXq%v8TkiIv z;`mP`vz_ApegU;j4fa8H(ONMFd=+CseU4dKtYjmMwbsq9dDf0L(N3|*wyo0+!mkqr z2(ex{=*!9D0E7g|?6tt`x*;s>Rj3MUub~k8iw}r5@k@?wht;9>R*6F}B;2DP)JKT% zE7P(^Gdd0mH31sxM{}V^^QlJ*MMu9OM~eeTOS4DIJ4Y+mN2|!kYsAOv%*Px2$D6Xp zTVlr=H9&>6qhdOTpE0kQ4u%j_XTL$>;FQfS#F$ZTy0sL z-@muEFJ@59g;Uc1L8XgtyyU*P-T>^3-QDEq-R0c8;ixppZ2-${;Gny2wH3Vo=*Le^ zpSW(r!fwOUZX>$f9p!F6>D)4$--H(5#@^h%0@HOqTnC zwENQH`?BYY!m!^(?)Qb{Ud&DR)o@fg*Q+AzbbrNbCBUniAK#?x7>jy_xHw#s9wQ#I2L%5&qAR(~UPOicbTHPy5@)!LY}nw^z_N=l!{v z4KzN(bC2V@k1)03N0BC_vP#pM}o^;A*j zUDxcru=}(k=lg5!e({-j?&fLZjo%Q8Uml5{6CG^R9k%QKu$6naZ3P<$gB=XQs?+?E z;EMF5FY^4;A<6R@*Zon`(=m8WI67pD~boP6vbkJ~os>rYLw)6whP0#q!4w)*2uM72ywGxz+8DA@vj%k8ApXs@ z-Y_^S{U~t0ML<;#iO}5rv-h)@i^$-e*cR~=VQ|;Bqb&p3jQh3((`&z zgsIVL^Wj76V4)n58J#p18u$Oh)meB&`9=SF7>1#Sk!I))>5>MAX6SBlK%|kB1{u1$ zK?Fp)rE};;8bm-qx=~RO953JBU3cBP?tgIJb=G;$S$lu>^JIW>P48{uU}j7M#!$pq zW+;(OQ0fHGc|R40^^we_GN~k-SdsO4kaZlkh~||piRe^{GS4HX`3JeLc_3eFlq|t# zuQbm;e5l+wY5tD4s6c){!3y@x@;$9kWm21=1~_X)lWz))=r%1h%2P7MjnrW1k`trQ z%Y{}W6=RzvP*A=Z0HC4tX{xcQy!m`1)Xv>Pqe)KGk2{$SO!&vy^EETa9%JuSMw}1i zgB}xbY1qY9->?i~i-p$ds?RldV>L>G%VK9Nmb{s1--^mvgT7T*$X_AN5~UI@PXE50?X zeAd5cL91=N9LpoOx6R`FH*1n!p<$;-ly{bZMbfs>?TZ_02Fuq&EN)F;wXKKLF&L*; z>ZG=-ZhkBB0jRGR|0P7)w>kVyLhHE~xtKyVR|5(dfPa4?Z&mRy#*asQGe+F+vyAr`z4TQ6Ra9ZnKn zZHObYul zAWbPDpj|Hfan%vJ`OG+5c41fhDcnkpC+1Gyc;7#s?mZI5cd1aO7fFdqFig)bT~`x` z?#Qv>H^>~9v0t7zqBqt4`1ah}T>MKzywt0(eDBjz@yPL1_bgADCWG>^*~hc#SQ%2M zL7WO?d9{8s3rXJ%<-zwygxTr=dK+)dao@srnNj>>fYy!GHLO(WIgpsSG>lPiuH;q& zb4ptqN+H84vwkX(9s`z&op{QgfOy)wt4z6>DK(~TO(rL}KacN}XSGg+S}v&@w(Vat zskSTAXKtGWhyAQ807YAp2#%Th-!gZPm@=vl~+Xyz$*fD9flHk|d-# z-PBT%$>u_;9?Z4OeNId0resQc+ z;#m*!R#i>kGTaFM+N%%$S#3RsT;;_O3C1X%rebv&){E{ z?aqF9CrB$|n(R7xvsigLrVw^bBsQsY5Wk&nb}&wmUX{8242)8wq6+L(G|p?%-hh$$ zkV6aFmsb>=MKFt~G^B*f2zJgTg*@;o`Hm0Q){xW)e$+dru5p= zmm*!CXF|l9-}9Y08g#8K_lmWCtUYt}>iV*Y5o^z`#Z!k5#4*NR*Af|?yuJ|JP?8r_ zieti8(Co)oXczDOQF{^mqw6aMBaX)AzeJIBZ-Jjm43O1bMv8QAL*GaYvGQNV8g%ba zK58c`gX19#Kd~PAh}*65eV+>r;<^mMW2T(*5c$}>_vi5d3m!>Ya<+^JYv1itr=+aW zV;WB;$>Hi}{6C91aS6+FI+9;A&=-8QJmUFwE279kP-4(?Je(_~=5X#kB=l_8;`jJC zJt;wTde3PLb>MP3<~qgq?S}IK2C+&T=JRo(=bS&cYjg?Yli${}9GEPvaQW(YKUoM{ z*g?$l@1%_0`nwBVH!3yg^P6!42G+C{wH*pK@{zm0XQ5BW_IL#T%tbS>=B~)-N$5C_ z9!MRhGRmI5cob0j&#bIMApRJCI>255!}=jx_Hq()cXssm*NgGLMZS+dKkJjbnPI%Y zWc3XAhK+NJG!FR`NR@W@wC~PtKjcN6PVfiQf0L`eJr~b`xK=rb0ZH+7Cxvam*rwP;&7!eyC39u&lYrd2=^=pGB<$iBpPop}G4 z;O~>6pWBQ&hhH)No8Od;|6nAQEcjMAmih(guoY^a-*wF3Ckf`X&_lNqML79&G5na{MkJSi=}2=eiy)M%B*g?r9_7! zXxbt-W>#8-Qx@jm_;2l_ilVL<@&CM2WXmDY&9vCY6TDGS92@vf2amZ?7|Kv1k_ZJV zg%UYzlTX31;R+-7Tf%}{GR!L}?M#A4OpmHSbQ9b99v~0;Vg$K7Yf9MTP^^zPW9scD z9-*km84A==AWEm=N0de??%OswEZpYI)J;2{1M=8M}g@T#_m>P}+L#yDt2MWHxmO)DpD*~AS z%#{jH_WOAf00^m24dx-flv1ok;GJuR#FD%~jv*uhn+ArkSOOTvDms&76U?9yjzB>L z3b3vMf@Gc=o`ayUR&0xNSf>rQlHe!pQ1F0rL>a?n}Kqlp1VT(R3d% zi*+{)7ea^ew4&Y`Em?8&ORbS22|hTetRRtgig4Ra#BQ>lt*)tUh;`|&Ctu|ou!PF` z=?s^|MTdA`0AOh;7O}n{|2N=aDh+Qa7CclUBaWvchky-$#RgE~W5Uj`#bP_a5&Qfy zcQ2*cNZ5~!-*MS`EzKd-4iJET+4zoq80ILJ!7jO@p24nE^g{ixO!`+D!9546XU{G+ z&2nu{?{gZEL5XhcAgIjP5r0tMW(hfx&s7C_9I(sMNeM2HcT_N=r{^M4KVZjfyi{$l zi!QZ6z_9ova{2g{Lc_v|Gs@V{NaCsv=?K8F3=z&gO1J?`u2!XZtyceDgEq&p3}fdN zUsl*}1F_*~i807SypoX*jwOR;|E_=~5h}r@sTdrtv8j-R)z3XUEX)udFJGjKV5e;# zFeN}(@L|((!R&JF6JHzB?ho`C)WUp;p&N>`f8Da-fhBP-^E=YMC)= z+FFMDz@B0$e|avJzCXUhAv~8OLMj63c^pv&dd%UJAX~(hxi20{Du$m1M(>??az_FkzxFN&IdvQQA*}G++a()a-L%cD74gjGrg3Wx1Ap z`t?M~@l4{wrx zTP`xa0$OC3NhwH;rQ*#^7Q(Hb!a@f%;$74$(%;kT{6JvKMK?tj|8~JFU->gH`2K8o>ROP<*%^Wgm5 zVN%}KeR;ObqQsZO2W%c-j5`CyC_-&HpFu!GrYOEC9N;=Yt-p4CCVh|wWw-WfbEcS< znDvhR!fP5%R8zmD|FYk>Zrj*(x&$;Nrt~dq=*oOc*Npd=)L1;yVBa|BP&?v)K?#^0 zaVS^RH?t5~$BL{n`lmvnw$6JR5^+jNL5JBohRnhRBw**<73XVQ7j~C?100u>k(W?` zMgHe1oyB^nEb^HKgRAmZ{tG3ca;!@=qSJxQr0_kiP;4ZeeHD-dQs! z2P49^^XuHPe7V4GNSelAa^HJ;KffejL-poQIdWIvn|298$%&}i!{7KEFT8OtV3BiM za5S#olHMH|RtG#0!oGV!%ESw9AHY-E*{Uj+mfNaM0)fAjsHWIB#_C(3O8vkNX+R?z zHXZ`9cLep9y3GwXBo~jKe8rZsnIPCIB~6=ZM-g4>@fN^I-VDgD*@BR0;4FYB5F1t$ z3e0fEVhaWGzCfHKrUE=@R{@xpWoGo&+^M!q12&Bzzy&&pF_kp0N398MMGn|cLA4f( zcZ<)AyAG-yCL4z$%^cziw}1SRlJl);Tt`Vrh%LMQDd$^HVZ45l%bGVk9!h@vvPoWY z>Mlf#N+o~704xrGfN59qw7rPD><6GV zQ(`QWWK~|srAi}(i*gOFXzu;@32u>x=Z&AI2})R03$)f^#FFgEbX|#^Q7T9Dk%4|d zqYwb*3Kg*QqSpc-#NfaL>`lSYZW;g)WRNz-jb^tln*Sq(ueTymrm9Z`f@o>W_+z;8 zN1Uct>Ny^0wJ=Un42RmGH^}EF5@$Z%j5On!jVYPKyDNit97__-HF6qU)}AGtVJvW3 z*H>W`a|0E8IAUQtRkv0RClfXtUPEqsEd$^pE2$h^!i7vdA>=w2Y!S`d%c1$DQ1c&1 zYvm`Q{k!H~20E~J?6V4!G&o`gAPis)!WT+L=U_{~p-OfFYDZWwZ0e#Jz64ut+x~SG z4nwC5Qw9Rwk+2Aap>1A=yO*E~zv=e(9& z3j5!dzplj_<*m}hpZ^g8{_r3jc!JpSu&`b>?5*Lsx7C(gH96k%HfW{PFV=V=#+#D? zW(vR06v)SD35N}=c=rH<9N`i_m(HD-d19EIu+=o{#hlxGv_AiAwrYTK_ESxbaznyF zylAHLZ-PUrL=9mAyrIDRVMVp%JN88>l{)!Ak2F^%1;MkMM!)zzu|MONst&HgA@aCH zpSVr+C|A*-hh3UPb9?J468oq28L){fF~`Hw86(mS7&9Ja#D6POCGTg0>kZNYNplAn zYu3q`1`2=sD;dt^_C0LI_q=G+e9r!S+UEs?iv`ZM#U@rb^Y$g-s}BXkGg&DqWvNUZ zsShi95;c{+eXL~*R!(2v#l2xF=S(lx;j0*xN_+X|!qc<5t1|=lu_|w8&F=t(xj!8B z0T`WiDdCADwIA zM8pvWLR_R-Uk9oL1-7?I!xE)SGrC&e2h!|yE;4j=9Y`zmOSe`0sago^soywY$Lc!i z>L(-a(@5<8CyhQy>3pH|IOVoqCx}i9^{n(+Lw?|(ba&5Pi7Gs7O0Rotkc63uWke*< zW#Z?^!R(+;1VurZTvGQ`Uka=sEWkdZ?EU71xc=y9gK7*`$1PShk?b5*&m5!dJZI1R zLkwHIXW^-A=`E^$_`b>RzWX8wTeh3gMRvuvhp}}1aa`DHvh3&Vp3m=O*UEbyrXpm& zwDo-HlU*O}S^p%vvC^~gRd(~BXY)e#>+hbg|75pt<-TNxJsv7pVGJR7-`(*@df7hs z(^osCqNH7&5XwU|RVdcJeeb@T+<|ZJ!5g{5=-$I*xufjfqjz%0<-N!Cawl!QCw+3K zqrIn}XjLGq`lP07O)=4kW9DJ$`|+8U+hS?*Ln981*VY7aL{|ti{Q}O z*?M6BCeh7lH%)aisy1n~t2Iw?HmQH!A4MUZ@Q6J=s_TYg-a=u<8D0|O~Ps1ZEF8DRrA^>h~~A^v&n2Bd*iVzFZ)mLx^e z8k)JZ9hD}D(+9jVszz<-TwSwjm^D>Xf1KSS$U~wcj!=JM*QaKFqRw;i zO1(bdr^kct1uyu4c)3OUoP4rHSI5O8>?^^qlMYwl=6cHcsZV z$B0ak9t(V{Tj4ksCQXLFUE3A>neCD`11Ne(znT+{nLdwxd`eaN<{6FYZmOj6>TbH; zD`JUXx*s%+l4z4m_h&iER&|}RZm_-t&*})jg0#z{({{W5}o-(%Yki{tDH5v8#hz zkvx8>sI_Tp(6<{To=9=plPv|DOO1J6BwXfUa*0ZiIQk|fvfHMVg<=q(ayio2Q!tAH z(};eeQxZ%vD&3(N(Y5C9?w7T6K*K8WFknb8YLF;y)~DOST3zB$p4d}}o#(y;QJ9V5 zwz`5{pG^K;&FsV0u6pzOr+Uq?UA?mZjB#7u3r|vse4P1MYBr%k5D7KWyBcEfw=rd~ z4r%l=+c`G(oYHT`5>TQMlrMK|Bv`7l)VyK~X6_wM)a<~!o9h-dVoPC1#*^!w9WK>`A9Mgo4W;55daTvAmdF=q$6jPxOOJZl|ub4*~ zCW8x8s?Kapj5W8w#gCbvOQ78eA-hn2!pwIBtL5O`#}^4^@M`nVaf49<1M!CBUj=n` zz*|J0V3mvGa?h$rwSVbn3vN|dTsV@(R57zZm&G^Iu`!B=F0>R;*zsH5%xB7~B}o#I zYIPt40#OE5y;{@S7_G$xvDZ7&Q4wUs1zQo4PZaU8)yNFq{xK9)&Mc%*M(_%*&5>ky z61Az-@`fF*v9^$Nu#w|(>8BDBxv+%ru3K~4woRShvSd3ztSO!gVUvu__grQQ1iLP* zWT?INCA|LdYa$GQg5*!JxiZ{@lFC&S(G5ny0v!YB*x0Got{9wOM~ce zQCIXrq-{JA8pJP9Q{dcHdUoQpqP6~n<@1A6 z_;b>F6omwNjj4ytk`)(8pXm_uEu_kB8^xOWnXDuU*NIeAN9y6OQGB=LY!&a>FeWbf zeX;~n!Y<(7F0AqEW!XB9cQ4{CLI|59w21se9X^o?&Oqx1+x~l@6(M9)dajWh1P&P)OoAbvyruC1iw(Lt}0qfe*ktu1pJ>F|J zE#(D~SvYA?D`I{1nL(?vepEy9P=%f9!dg1hGtpS;N){ns(RK!3KGpDbM2GZzn5RjG z?s9T5ITn2)!g#-!)LD$KpHv?jXKCk?SAFzLE{B}DW9m-0~ zZ{k@-6+l8!z?#%8~!e>s$BDQTj1!n8p8;w zhIe|pjW7=^a69f4!rnvPY`G5+@M?1z@~%q3}X!%Vx~aW zE8EF0+@F56dKJV*v;s@|!F0ir$p{VKyxk?*#x8(&H=xvQ-k zSW$`RRze|N4>EG5Glx=t+`3VF1ya*sza(O(}R`l;^w86g0yojJx?d9A{2$f~y1_nDK`2$JhhCl&E9D4Z7Jftfo0 z(yrC{Q2Bx)D#)+2a(GDDNw`3dsK#T$A;;M{$$!XIsf3XFVFb=v;}AT+815Fn8ty(TRTE88)qyPsA>JkcsX~&_|4L>^I6$nA^_JS6Wv& z?z1d>F)q=*betnBbu{rpz5#PrO=zf}JZGXSA=XQ}1roWLE8hB2-dY=a+-UY*rbpkA zv}^rHJFjYi%Zw+(U0<85ju3Mj1opk0+FjF-_4;~3q zT|r4M4PYsOp~Z2Q#Z+pI-G)qb#>FCt@sADq%8Lo$7%XxJJn-1zCsS97(Efh0glOC7 zObMNA74#4i1$LLuLVCs8dd-@weH@D7cH$F!@ago66P-RTxr<;2 zprpQO;7mmi!Cj-J7N|1jIh>}3WDKY*nkbc-uzegbb?tb|<~F0tND+f#5gpQ%t!Sw6 zLYxxv+q&B0EeGo{eZG2ZK9Zj*kPPnCG>7GW0A;#X9y4Bp3-mJxk42cK$eDKC8cd7^ zK+%kgC?S&h6LNhmu&(fr@5GoVY&o|Di;~dAaYkMh6eGIVKl62!EJY=em ztMggjq6jOm$>aP*ckE;PlO^1+Hp-AAUDe+X4GR%XQ?J-t4-JTlhI!gkRvkzu8u|?} zBivF*(TghO9*am+oecAKfK5QvXifVlsgZ(qbU7?ytkBMzC$e(b)>|%`zg~E2xK)6z zs~%28E=k&~Ct|DjxJ15xPoCAA7P84h@bH^}W8E|1Qig(Uk>F4im^2iNMV_q0 zns!%+;Rzgzbjz4}0kZoV+i451xQ&?wDboM=7lHm;6tCp}ns~Yv5N>2j0m9ZR&8rhN zdweCvacpL$fKSL~UVkl7b^YS#{R?Im3q?DNIVE}sny~^)tCLyjT|XHm9Lt62(FBru zomuIsiSe+Bu7DZW0S)M-P{zE4(?dh)&`9hMX8e(aleHPfC*F)CV$X3?*|E2R^1z*yeLAyNJ~l)}?mHgdq3gvxWM>7~uF%aivm zvL>Pu+064|C(B|q-jvYalmZ>{SV7F^Bbp3L#dPLNM4x9FA#K(IzA`rD0WLqu1Y6<8 zuju|{*s${ZzG3ycQq@z;=9g>pmwn;if-O)}XECG8UQ+D+a)q&KTmBA9tI1buSBTzL zTb$N!s}f3XQqfp5qPO9+XLx5-Wbv!Pb!HDC&5L?}+v0YME(}K_+w6S1%y%PqmelFi)bTHKrGKraKie@`EM*+I0jT?B z`6EOcv8%z0V49q-dQp2S*Hg!RWWtZ<3t@#snEP)e1O*^~;jmuBad z+ey8|7;~{n&nzKn(uh0Df0vfI{$X-o3wzy}?!Q){Ww)pFovpNz6~$6k+^LfyRhgX^ zlD}4{BUQb?&TU4lF|FE)Hl%ZxA8A4sI*n4=o+7Y~*dz67u5GJbJF5?VS6BL$oJpA# zG`{oPepfR=rB*#Uri!DcA?FVP4~ax5;8g$1LtILgUa$GznwJa)G@rka&nB^-hN#-p} zsk;Sipog#>VW%*!xLE^-^anB*I=-YDsZfwhL?geii^=zK?tPBH4m9_~j zZI+&OEIk#QI*=yhk|(_h?$6z&h-miHFX_@#_{Jaq9sDVNc>*S(-9)k}(+el%D*pPC zHl*vm46D!_$Exikfc!htH=~d}FP2B}{%gHYrQ%Cn*Ad_#s74|Aa~yKLc2z{y(WSp5As}EIE&Pcg+7U zl}?Be{xFfrOEM5@4O9k!8JyOdkC>o>VXYCzbw7AXc;b|4607Rrc`3W5e^ksg>Z?J1-~ylS-dC3pZ@_M-bA=CEV-Aw<%x4^nC8FC6)| zm3x@CUYsk<@h0`(wuj;sH4|hyzVA)t)4qXjFx%#e1_xGje@Xszw(jcw4{8;d0IK3b zaJQ(h0zrcVUAS)QSc$)Xo_y&`e%gomKT>HRRPEte$`JD)l@1w=gVeOIY=z(X|K5Bh zb-hpP?%z-RESf=V*)oPDNzEpfv2bnNm3K;n=A|6bNhr&a;vh;WC@oy)9~`If^r;tUAg!X@JLRf|v2{M28yQvx#sMqcGfvn-Ty}{Rtpe zJ8l;Jkb#{I9n-ea6ojyd@;0EsX{Q+kAEav^VzLBd$hgd=8FlB{*3JK<(&scUq1^jdliWJ`YvmorA`MOHjf1DWs*f-B>JMVm4E;B5Dy~12so)R?jS`pYEgw>BNbs8}S z6eUN!fb`u6qXZERp5%mmi@NW*30?jW5}CcqjYt+96T}vLFAQ+!!5_*~;wEsJz35H6 zRQDLBe4gMjLgQx1#?lAQA8O$Crr~H>%NyTr;SN-Do#gM+T%8aW$>57$r@ZB}jOGHA z3gVYGEeH~%q($_V9bOKz__J9nvl8Cy7?4P2I6uT^chQ&$pok_(L$z292bhPzr3D4oY^8;=o(QzUcDs$0qdE7OULDH;t(FxscAgl4Cr!)>8+GZcmxvJclz zyPr|u$vgRZtNnyaP)J9NsX=`u^M~P5W&KG+jG(9{8USp*fT95e?xCR4%#F};wqv4L zKQW=g9}GF9`v~_ix3I0LB2}s*d<06UsZiUg0VDXfAD-gqGutSOfM+Bj+XK|yJXrsDib#@UhS<1;@MBU?5GSr~7NJY=5RF`% z`Y~bxCy)4<{+$*%qJd#er+LBbAWE1Ai;7#S z2WOcd8VD;RBO^$3klN1Mvz_g!n?rJ<*3q}XUjXu&8CA%vMUWl5bEOuDwY`AgxgQ;~ z<@U;*+BIeK7adpkX-dzpDSM(SJdLpnZsMSU%!~MnVB@SJDa0<79}J$MMk%j2(^gIP zeRgt-zrs&qQwje%za{vX^*)^ zpFjVi-a8jSN8VD>xU{- zG?VSMuj}JCp6x9Qcm2(Ge~Y_*`RaQYBTF6PHOt2CuR*}6nwyvG$>vS3Sl542>Eh;% zc5kY>UD-mve_g|vGCYpOIb*9AY#g^y6qT66V@Ha6lN$xUfw}hjNPz_Fp1dikd2+!W z0K^7A04BA+K^tjAvsBmlYsflNF#cQqHf$0$cpEtxqI&w3_@v!kLQFe0K4Xi_M3Mf) z^eWygE^(OwLp>t$>LI~t@uG0OeH8VjG1FS*<<9+$DZ;cVyH94DGyXxkktpo;=hreX z_W6WMSymqX$GxLsswwX}FE9J0sAp{9Q*CKD;Q59zGh1Y9&`f5oK!n|9uh~o2SE2=! zTAaZ87>|Rqrndr#M_FRyl-!5S<xJo-k(qWh4`(&c%&(&^(ms|;}h5SW0%!DQJEyh!3C-S#l5j;Kiz zPrVIEG=L6x5lNsn4SqAZPTmmO-{@}xvWQT`ldi-TFw}K@yG{chmKf$y5`@N3SyEA} z-S8rHpS^96r`pQtpia|0f86!O?DV`drgf9bFVJ9f`XyLrs_3G5P)xlQ?}-k?%89~V zVXY~&Uz}yr>C5&XQm4p4{xD2bpET_nB6P6owP%C{-WTCmUum5!!La<%?E^GSem0#c znj}REf1Klb)0f4em&)>!$M~O)Tf$$W{=wIih`&}tGw=1?wL0y-;;$_w-8D3ATw$b8 zcad7MzU{LLIQd1HL$1Cc%S%j6KV^?LXydBjVqLgtEcA!}cNeW8WlF@#INgwStjzO5 zN`D=N8AaLa$-#}^wYXA#)*y5Q$@NWf`NXs8Xn2BQBjpW*tR~f_qd0q=j&o z+sI(6?hkw2n&Lak8P)&~6GEb5?8CWdoz=5>B(t#`kj$_{SJ@npXby<~##LI#iF}NC zcq<$MgDBs)>t~}hVtnb_!d7to#oL0}sa|cNy{IY(^G74X+Q?j~P#9@ukJId+r7V~J zHnIra$3cVESH5o?^xp)U!u%^pZx2|E-3e?$Ev;az_*};DEs%DKU;Q3ZvXZag+y^+&| zK8@!v=a=~2fqlt0xRJ?MraxG(oh)`G*ge%BI7Y^E@*Y#id3 z0`X6Q&?D0J&_p3y`0SNwJmYD6M`@(FsX~v_Mf_6%2e>dtTvm6iLfv$#B7DkNLYQtU zr5T|dB3(5$15ufwF`l7LO$a4U6LL)V4<(e2O*QJk_fJXR3{7oBW*XjR`onQqnKG2j zvivUz6mxNv$J1YoXHxp(YCX=@K;W`$0jMwWB{~T0V^dq)v*atYlyB1|sk4kEa{?=~ zo{VRQNoFTX;zEg`;+2`*fJ`b!+&ALsExNfvxrE=Ca$&iIJD0gxlEB^BOz35nzb>xS zc)HPeI^|Nul>l>5tXwyCo((VlmK#?z=-L#|x&8 zAQ6DKbGdj$Tlks8Z|83Dr#~0u!SN4t@r#PyZu>*m;dq5ig$J>PN0o&q;{_{6g%|km zF7b0#9C3-5pevGu(g?fP0wCMYwTA_{W8f#6=hWcpXd`_xR9r z{Gv@b-nC=#+)-wsdoinE@rvZTh^_49+d>F;k)$M)t*VHpv!q_|0dSWw>sWFrS#tOJ z-M`O8*Z%M3Bnc_e#UjUr_ebyM@QZ*GCA|??|M}-OQgyMe+ zlVc%f>Ohs_!fOO{WgM^b0UeCQ#-QOqdUvdRI9{?N))o@G#~n)z_g!{}Uw0+1qe=n# zaY67gNgy|UnjPodN4BLkdxhejq?WV&f`i0HEwpqC7xl zY#unt9GuQw_4ZHYD!eK=uQI<1KWPm=W}+f7plWp%Kf|fIKCUvysk&>Ty63o}HN`vQ z7~B;K$&kV&)2$vC!loY-n$TlTDBoV)LR`ai z=iAx|ZU}9p-ojs^s#1WX*x*<@y7=u(b=^)*;}SC1_!YC;<%(S-@){yxPDqV3%egYL z7}G!mI_5r{Yrm#*62LMZ3!EjYU^@Y%gJe;X^HHW0ythT_(w)gf?3}YQqR~><0+FFDOPjXz&9Xh)J&@Xn>2DnM@ zIoq>5l3Ou$gf=lc)Nvb93-b; z;x2;~F2qyL%ndJF?aTEG1f!&}dQ@Gg9qfm;yM|P!LJ?E?UwDS+0s~uAhfE7V=H0{j zc5ROx(Ea6!m|q0L4N;{PzyN7TV^o4$IbqdUT#x&R3m*0kF+nXJ1V<)o9*ws@mi>0WIEI!&Ve+RcP$+^%Tz7H{Tfs2EXR_%5Df%VCun#J)T z8)7b0Yz>(k+MT-yYdaMG=ZT{b9Q&Q_B4W155N}?Aif}UvtAIGZY|^>cXLQsa)Kgv)4rHQr?{S_V4~%g?@oql z4xG42{;e)>->5CF;HYQqoP1$zTdR^>D^0Das9@KoEZ3%dHgnAHh4F<2#lSDX?TIdw zCDeuauv)*XM&CJp(PU~-6EfT_(`!XI#q(r}*w_KPG@eangX)KiU^m+{Ja}u*7rxXl zN_QJQuGC{6D(#)e@AE);#Kw+yt%j~X%Uvxi`8{g)6)&n=4Bigq3bu`CS+5Ym4aDaG zAwnO{*bY`V;CCB=B%2RR)m?h3#2B|vMH{w)+ZXgbV?@I*EhbHPLcw^gD_vxtrKj$u z$tG%$pgQT-;^W-sJA|cMgfpZ>=jGq%7bDgN=dPRWHDWVvc09-kVZWz&e3zfT+U=zH zCR|4+v9KpmbZuTJ}H`Vw1e8>G7N?bc`amEz~{zxbH4o;_>+mx#JuuKwMDqg|Yl zLB+RwuKdqzpa&kWq&J`KlX&d+=kBLReRDbA4^Fc5gdU=1guJZ|9(f$#<{s!Ws7Rh4 zBw|9t9;DK}JP}rhL>`CW+(X3VVbaVI5Bt$O=qV7A1q&JZ@1E9d)*AI^??|AU=kU!7H}p2Zik1--W1 zKM!sCaDEFtIo&*;{eJ$8>Y}KbjqBw_hN*G8Fb0=qt5bn=#iKujYOJ>6a7x2_lw2A2 zX*Q%Ns6#pJlCb___UGx}^Rs_5udqI8{bA@%us}B!U8>Aqmb*r|QC+3>ur)OV8K-#> zbkkA@=;h)<%iZxq+OCuazBBy0qNe!Ha&gYq_lo1W{&C@VRlkKJJVK#9T7h><^4~Aj zYopCC6>AAK97Jyn1DUGuAh_8Vjm!!_pQlFW_S^k1)e z{cp=RKa6aCT#m8Ie9}xjxTe(abou(LEa8=V-%ro4cHYU~rILROGO`6-42QT~tIl6H zdwPxwzUE_~it5uGr@9epx=9c~ARhfrd-{7DgW1i4US~Z=H;y?L8lzP&35Hd$t6L+f zE|&6FA}F}J+}dyVRS9X(CCp5xmWtb9rTO-tT>9{-^@+sLVzbLtI*@fuS-SEQ*5FxRn&1+pDMFY|Z zdrg|JD6X(%@uV9LT=)k`RI+I7o3D-RQHW+CaIaZf`rsgq@YKX}44h;1~+}q4fgd)RZY~m|eW@?IUl~{zC zb#0O#U&7~#sMvT>%^~a7Ru79hVn?)o+|*FwQ1GuGsG8p+L1SQy&1SrY+3Z}iT8AiY z9Rlu6yA;tA7&Y`Z)Yo{@Fq9}q;K)X7@%q{*Pb}jXL(%hN~M=c zN2qN<6YQO>w5P~3>7SnaO(W8-aq)@&be6r?-|6d7r? zU_`g*j~GkL2>$e9E$sE;SSRxR&*v;h6T`c&ud89q;wL!%c6m554N68->#yw#pLSo{ z7ll&>92UlJc9@WAKq%kaQ(f+5Q`4v+qiop+mdzYU@)Xi!SUSxuUU53vf>qk3hEQrl z!P#5P2jQal0z$@~axrfLyXt+fWD}xD07he3OsMXU^PqvdyxBQm7vVVQn+d8TH z3(TJU@!fL%UjPq5@V**)c;bsUeyHG+_Ymn{m%iv(2=d4x2S{j0fR%~9X6V^&m1TCT zZM%nv6$MPu$`}4$NP!>~^sVJ;;PBy$4Iq#J2+*Jv?%N9d*p{7??GGV!V%_TsxIuM! zjx2hkOdLeOB!xvRhJ||w9C%^7ukh(T2;@^~=%|n?4UTSZoShp%#~O=;j)w_xp^@D5 zxU$IbUj8dv++;+BLmO^Vl|1xeM}W9QSQ-t9v!rD$Efh;!@(Ko1@s$&~62&PZ`YtU@YuC#1tD?zyfGsim(aO z7Y$GV1AvjN93=n&#G)EPR1pIOm=h5WnSvi;kbns+qH0~SWI|pRM?}F3e|D_g-QdT^ z%FyADO*#!G2RRV~uCOa^ddxyfNV{>MAt9%^lm09NIEsx>Qy*Oj4OdA!+d*m;28-Xv z?6n!1;*>V1MC40-O0!lbXjMVXWl>vYOQa@MsXZ}jQ&ZAJrTuaOQcOrH5>SIAYzr6) z{t4q4m-UMi{K6Oi^hJ%Psa1raGX`RvfH1hJfEjE67&Iv77#XsPXFhEP444{1T*Lqx z{6Yo^D618QF@ppI)&@>U!Y~vd1F^Vt%EdqJiUl>f)YOgvK@+P>x>s z632$-F)jW3Umo`bNb;B`Fst}Qrx^G*aG*y7e$y-rC&oJCSeMzXutx>hSr31m755dK_tGQ14JO!d}m$$z*dt$ zgYxO%3ybKQG8xPW4G)8`4aorn9$<za=^Wt| zy!g=!jzPfNS`0r00WVl0Nyvm0DoJs`PYl3u2K^afAS%d!Cn%{>$non4upmeb!Vw?s zrc#b{fyE3|U}y;%VHP6zlX)5KX!Bs=qQLE`dp(UJ_t=UXLOtqL$2%sergyz@CGS|a zx+DLkNYkG73mY_Iakfr^f|aR&eI_IiVGFjjq{f0)3{=|*2X+Kl0B(fTKmmEw$6V$!Pxrg!OH_R4JSFz#dCxJV^Cjw=BmABS z^rV-CDRjKTTrGJQw?zYBXDzEsPeKtIAq)v9-~nkS zYbV4MzK(jg2yTT%*Z}Rx(q4cUB8-zK;Sg{|2whu&h#X{L*lj;Kh9{8)*vDS)v!{LS zZJ&3(>#Xp8AAIk9&(z%q@9@A%d@vXC1qVbR3kb==37U?8UnHam7@n}y5u9|t%Af%( z>ikrVpO70Q)_uTW@f2e4fFmcN`6X`!0+5Z68@u)P^QV9P?eE^)&o}t^{(b-bzklEv zKBAKd&s&Hh7`6>)1sf=d$8!K0V1-uLfW%6=hD!opn1NPUgF`xIY}s{y`nwL7Vv%cmu$A^FJZ%Js>n1 z0W3a;$N>y%xnK}6uTlUKWH|=-g>0!nVc@F-XaHa6Fc18`gg6AcYB?H6g>*uM4Pdzk z7>3pJD_>x_8A!TC2*WI-fj{6uJG?_Y%)^DqKb$MV{Tf0*^f^E5nIq&1Mkt$y5Ccgt z1xe6>EHH(t5rawSr?`lO&wLXM9Fz zj7Iw7!(=42W4y*wt43WZL}~0sZ~R7Z^fYSz)JFQkMsr*$a)cFb3`cfsM|XTj9vR1U zG^%r~NBx?|R#``Q+(&-wM}IsORQW-Cj3s+4NF*9a5YfkfTu6p&NN$UKBdiyR_~9LeDc$p}$Mk4#CGTuHnGNs~+-l8i~9dC3PsNtVPN zKCvl=FsYmD$(wXZn*1G^9Lib=$_BAXpX7=*2nI}>G6{+Z@_4d_;K`({N{$3dqwE=? z+{z8f%BMg|tE>n~g8>bw0Z?#-2kNw~ph}8>gJ00eu#8Jz#7eK+6|TI?3#rSd086=q zh}c4gQfd=cV6U!V%ZaeEzD!Izq)Yz2gcZDe%n51CrQl1&WC-H2r~olci9pQC>`eP( zOvyYd$Q;e02+f(GOwXhb;d%&%>XUzAgJ7UE8ps5mq_fQlho@AC!w3@Fv4dWqGz};Q z0!mHdq&d(uO%EYW5(uG8+ z3s9PyIq{Nu@uND5PYA_7VeGs7bjggOi22mer@&A* zwFx$j3XFtKSKA6JfCNfV1VY$TKJ8OK{Zl{E7Jyb+Z)IOzy2Ka_PRRtTc zfn2arLa>7d@P zTCG)Ey;WSzRbAaxUhP$1P4Oej;*K2i?M#)yQzyu+11IoBowNO_fARHlx8*D|Bc*Ouv zAO(HZ*HKUdZGBg3HJ~)W)^sITgFRS;O<09pScYv_hkaOxjaZ3=SSOeQLXZSrqzGeO z)|p6F4CUC9;LwF2ghj~Ml`NPH@{}2(m(~GLI$;+`(jSBYkjEicp;;l_FRK zLeQNF)jg1{PmjINp)CoKRftna)0;e;4CoXk8>Q8B+U)3@x(KO}8i6~310AIZv4C0z zRR{;&S+Z3WEI0+A4ai|UTKg(m`()dsO$bqt%fnFt8X$&HKuZYv7|Z|+Qs@O>aM|H1 zuH#BBOX=JG#UO=Xz)Z;zhf^3#Pg&3Q1f;U9TmqR}t=L$$Z3(x1+oO$Jgb0PcJc2s- z%}1kwGlP>o%K%Qe&VR8@JHxYoDc#MPfntD5g@^@8`-a7#-GVp-iy%OE>!n`t9bZoi--^KA>_v&~ zCC%o2PG<#Q@{M2leJS(R*yHWP^zGR7h0OM4#^;6K`3+zJzMcA=2=vY0lGtDV?Oyl& z--{^V0ghk^77z%IhyzAo1%Ax_&B*A4-U5>8(wUSbCJ-|yYwC>~?@OgRKF00c;5HBMtRW-$*oUbUrAB-Y<9 zmPsZKV<#qKJtodGHUK~VV?h36Dt==%rQtcI<2okEJMLfrwg^O^D+Snq$V-S-z$XUq z1!`-EN6scmW{7dhCI|>8hsXjN$gG60f*&>(Xmf~PP=HkEI2vF81&D!d+GAS=nLy6v zKqg{1HexwGWSB@~JN{x0uG2=Qh)8Gv2SA?&U;wUbtXYN{1z>?}S%_p_=5=yrh5m4? z6VNMDHo#Vpnjy}r7%-=hQ-E=%A_YKzT|TdwC(L1U83XMN7+Gv?(& zj$@$(=9duWm|SFI7GsK-g1x$dFZcpg;FhEl0|z((5X%A3`(~|K=!SmiH$;e1FegU% zf-J~`OjZb1U?&GifN^eR8^{3&n*jxQ=8RtFc2?*GSOqa4w-b1PYPM&e4iEznBLo`i zxJUp4@aO9_WPu)Nf*whOUSUF>h$<>8gb)G@Q-matgb|Ao(z9kOvKFgW0IXJMYLpYH3{2x^HiYNRe!{-s`O&TVRn zeCnYa?1St33L{I>%G8KHmoiy|7h6L=05bUTXY=A~y!`5EJo=C+;yxoonjYGt=N&vT-0t}<) zJRm2T&Nu}??j)Ezx3U3O_61pv08w^`&`!2=LI^Qv02Qbj7uf(YXuo!zyx2wvM(FBN znQgFG%BCcS+P~h6rrxu;jL|96&5$SpZhx z#RXT0@76dLSgUnP0M52>mF6}XSb%4~F{(Pi1~4D>7Vie&>4YHuKV}n}_;MCuS91>;!)Z$D8CNScU5;f*JmBfNBp1X3Wj0s$N#Ig7|(gGnIU6nO?|^;aJVjl6nzH&~0p?R zzr&7Sh>xF$kVlA--`tWv$CLl>h)}i|xWqhgfc}mK^;4DsobR{>=zCWL{G?O14KQ!* zE9r&!ZiiR|#ZLk&h&|YYY#Yb|Ui@ep;SpWWsaY@-&dMb547A^Bh&SI1{kAcrj}M1hE(?j zA&Bw^C>!KY0Ohv<<{zUX0KM%ed}yVEQZCIvNO1z%Wz2)J^Ffb%4<0bhVX4BLRC zR}i2y-^o<4u}+(|POO$Q#1B1Os|0tyo_ zV8n%T*|KKOqD`xIE!(zk-@=V6cP`z!VDIA1t9S3! zrzTKDV32gMgP}3A3~P`;fecke2o^ClW5MDF!^9*hLPLQhf`}C}c3cqg0|g3L*szj$ zb7zL85&(1UKtTcqG$K7d*$P3cf;JQXgyN~D-1{P^ObtI;wlTuo#rI!Mj1&?oX%AF)!%2?EkM=jOVQ!1jGs;Xd> z*s80q!WyfrtI}F)S1blLss}O3G$W?J0*exv$}#6$c5{B?k}Mivq^+}sru4fb6EG{oU_h5zh$$}DDtc8zc9JXve7Utm%%5koN;hLYL2Ok z2F7srN)6#w6rTz-5EF_kzrX-e5_7;1PAI12;!DM2mwk5H=Pf4=5J|kT%c8Q((CyKC z^WC@KHx=Cy%!A2n;m?O3&a>i+GmbCfkLwlms6)RL_}`Z&0Y@(?faG+V*})f#2r9%t zgC{B-QAaPMm;Qc?8sNp!0q34vgx<79#6ElNvykKw3>abODCWZxU%b(luQYg4g+t!F zzKug4z4RbDU;V8x{FUqE4;tUS_XJ@V>G$K4U;co|tEBvdrW$U&`>0MIzx?y3^}hX8 zN$xNA=JS8_M_BhSfC3!gNzj)P^^uA~GrJ!HGeo}!LU4KwWMKXzL^+ojkboMj)SOJV z!4HCvd>K3m0zJUI38GLh5nLe)cb3BURgf_I3n2}~REJgM0%SGZArJXBLX(v6gfARo zS6XPqBhHG5&WmAEF4&SE_ArVtk%bDz5fUk4F^lAaB13|x!1gIIj8#D*8OtalF+z@s zNO2-d{SGy3F1Zep)rqBF(V)QC>K2*PK_|4Nhz8%$3r4Ak%|=16iOkg zQ3(-{V)P>=D_K8D+DwqUq6s7jvB*z?GL)iB2_YcyNOpY@lW4RgD_g0`nrV`aE3v{U zur$hB;xd<56vHWgB$GS3>y=7uB{3-}Ont?&CSsrjB>a$vXF@ZY(wrtWt7*+^Vl$iC z+$J}>>CJC~Go0caCppV$&U2zOo$6dCJKO2bZ2AEbl(40`bQQ^CqOh3yG$TIamCTw< zAqRvQC_xKq(1Rj0p$c6nLmTSQhe9->5}hbTD{9e;Vl<-~-6%&p>d}vaG^8SZXbuei z2_bu?vY#p3Crgj0(tTmCMMAqt5rkmVo8mO5I^8Kxd+O7l0yU^Y9V$_aYSg15HK|Hn zDpQ;4)Tcrk z$6Bwkn&la0ffiHk>94Y)9W811cG=D@cC)H=9BMNZS%&x_wz8cqZEI`W+u}C2y4@{r zd+XcZ0yntA9WHT;Yuw`^H@V7PE_0jf+~-0!y0=ZAT7%hI#H}{F^t!HVKimE<3zjy# z;vMg}PRre&X*a#FI`4&EOWyawH@?L&FMDgI-usrQzI$=6eEaL){~oZqdev{f@N3`@ z5jZdW1u%mf9AEk-7+wdSaEBs%mjydG!x|PXge_bv3WNBM9`*``H*De)+qJ_ZR#k{w z?3NW@FMHpWA&P5kTD}mLuRLb_ad~@SUNf6(DCRS(u*^z^^HiSP<~!q= zcyFfjUF1AxKF7e$c^)*Ojkae%-^|Z0Mzo*{?dV6F>(GeiilTYU=>9Z^7SfvDG|D7B zX{}Ux(SU9=r%P?>0eSkIPpE}mEo>Zz;Z539B*wr#s^Q?RAYXH^S)>OeY zh;uZBM+;%jww(-L41ACj- z2KvGVX5dS4!+XQocJ{dqobF7^#0oPojcFni2r0k0;^a!$<5kuTR;515vTFQCjfywWFZHTpg{sy zAt@WoAQdraMKEXps*(delqXkp%GJAaYSV<`6DT-ABB20Z{z%FczF7Y z9Qvn=p5CLcu_j7qdJ=N5fEgq~-@Y(K3>1(GwKGH!G+=-N7*K;INn!&FSilBaW0HW< zoB^NGI^m0~)wP!UD_++w*aw;P2`s%JsYpN#l0b0>%s>@eqBzBxGEGd z0blr{G^RjFDi|;f82AFKg`a&ExjyN|XSea2e0=1mu!;sOfDx9TfC5A_{LU|;0S}N; z7R2y}vO^#SjrhVBOo4fmLT2&M%Vj|pm=p#Q1P0Ck1pHh< z07C-Mz%TG157s~qj9?Ik83HEYR-B+_H6ZVi9Ye_A@e#yk2wz1ALjtVA3tC|o$es{t z;Q=0=brm6~9U)^SVar9HNi-n_wn75LUPZhH4P@aK!l9cH;TNu282Z&1vLNIwVf;-% z=gnXr5=0NsoDA5&Dhz`!SiuwwVjhENFtnjPL@3ci}U#l+a1#2Er2LFB+M zGyrWl05CW~+5G|oBnSh{!0JI_D-w_-@)`am_7xt=1S3S@NiYI&Fhnjg1Q%3EBwz^_ zc!`x90s*?>F^&%`(wQv26)hs;Gg6i^!WlEVl`}%)H4>IIo*6ZMl{I4HH`0|hju|(4 zl{bRpIg*t)Y8g4UlsTf~JC2e%RvA08lsm%XJuZ?wHW@wclRe_&KhBXpA{jsGlRpCF zL28je{un_PlR+ZnL-vqD>KH>3lS4w}MMmNr(&4R9Br91YMuOxkYUD-^TSr>bM}}ld z@{dHqm`R?bCGHx&spL$45KFF@OI8v}(&SDSk4=skP8t(T9vjQ?WKs5yPkIA}|xc!30uTSXr8-P)=Le%|sDM0wGL+6Ij(^GG=2s=3_!; zWJ=~_Qf6gZ=4I-X6HEaiNWvSkgkMG&VDgh-ej7{>!XkL4QL1Kt6u}~RQdXf7;*I4P zi6$AHg1?YofXn02G z`gmb~Zd-*u(1m8`gBECPb|{5{==_N2hz@9pKIe%>XNtnrf)b@kT;Yvo0W09>j`C=a z`sj}WX^;x(kP>N;8tIWDX_6}Gk}_$NI_Z-_X_QLolu~JxT4|2@D0La=kqM`aswj;j zU6%Byj$Ub*n(3LMX_~6(nzCt|y6Kz3DV&lik7}uj9%zhuY5cgOkIw0icFLauYM=`0 zpb~1K8tS1UYN9IYqB3fuI_jfBYNSf)q*Cgk#_6SEs*(07j@Idm-f5TS>0f=P3f5>v z@TrehYO1R0sZ)dHt=j6CW@&(JsfX@Ss7lYC;%biyYAS3%3~&l5 z_<{m-APBTVpbA3+?8F1u0H6W`0vPM8Vr#Z)>$Y-hw|Z-*+-kUr>!#jlr|u_oqNuMr z7MK#InDQvOULl~8LNF++1H1_-$N&N`fDAkU0xSS4{OK=rpbVTq2M$B0r~(5RfW3Ze z!#eE4LTto7thiEat-`AnnyZAOE1s(Bx{m54vL{2FstxeypAJI;bRYsSEO&4q1lRy8 zv;qwvz$$V|!X`j4z^pGIzzKAU%pSnXN^H;y?a&f!(H3gOBJG>b0G9S>#&YPVqG!i? zES)VFpW6Na$@*!h{6YfEK(zvG3?RV4a>pttzyfIAo1`HFkOFtG!eX2)ci>;a0g}4&zzkgM3p#BAZ7irt?cx9{k6s2} z7P~s0yWZ&4CNAy*D)YL@@Y1X);2#1AL#MC;*zN=Z(7@XYY|fc4^x|*+>hHu(Z~sPV z_5NBfr(&r^xIA$N&h?1~72P z$xZ;kO7Q-g@ClJ8AVc?Es%Ej1ukv=M3%Q==f%B`HC)gkV0bYL;`F83-m6h z3zOsVmlJYSl^XZ=QG6Sh9 z!?4E6@b`&GP83#6D>2t z^SfrTA!jclC-O8?Gb5|SsR}DL11&2sK>RYmFPtqY^y|U)Fbbe-2YNs*yU9Acb3{w@ zx5jftTk||u1nlY;KEtv;rvyJga;NlgE~Bv;3xf?9Gu#ft+qS|m1j8Bw?4OSGMALLl zcdJF?v@^f%7H=d+=W_xNWtg4>NaJ)-8}(5mby7>OPHXWYBeG9#mq&;Gu`DZfRa^B{ zV|7+jDO1xk0o(J3LUpXHD2w8!i^ee28gN*zmsA4`S(E673T`x~wOYH%Si7}*nl&_| zH5b$MtJw8jk7r&#Z2|LjU$@F%1NL7bP$8CART29S%2w!L~~*Q!{mCbzAp!V|R9I_jYr4cXwqx%~MTi zbbUSdYnOIu#za8HB_xQ#DhTs?!*_hk_k7cLecSha3-c<7LMQ&=WqvnX%L`^*=7R=KWV5U?}!7^dNgkyMyYxst9c!zsM} zN||?$o0~a+p*d=)Ib5)LrNDXd;kC|NF9I+ zfvApo%s?mDL@dC7F_3~Kn8X^ug6wEOF}%*Dv_URR`j$I2uVQ*z7^JBqL<~SWr%y_# z`wg|@1gpEcxEKK~sDL=wKo9pqs!z<{u)!_Bz_^>l5x_#W#{}7c!`W<3naD)kPn3r)ZQubas&#JWt($)YgC5sZSJBmu?$dvOelmj%3H4g6Zzqsya&v`dPi z+d{KM#B})lp#O)?8x6Fa#KrH8o_K-~Tue%M{tiwUeM}ULOHBQL#JrTvJYdzlkI{J4 zR|L@;$ev3_vj|G<42;8X`ogme+1UEgPeks_K(iddEA#@bpH31S!7T_6K}d|mH_D?R zhe#*{9q@t*Xu#bUgdNnq3V?$f*bPfG{n1m$d#L*iAOsC)!b^OF#G8cTk4~@;`$0@c z$D2gep9C9-jta~G;*-f6)O`#T!`v7IbtuG{#KGop!qd1uh z$VBkSEfvL1nd$|@8^Kr^E)is-OGPJ-x|Strvnv_FIT?V73uP)-$bxf5hy!IR*o+Yw z3-;`33qu;81>L|5XUdcsle#n*GexSGij+f#MjQu(YLZwmY?^{4VjP+zc1(>pN=Zo8 zf^tTPq}oPThMTislr*`k293EG36dRA4C#*}xWW}vnq)A~B(h*oWSHR$;#+b}y`mvh zZD!4zId}H_8FXl$4m^}LZJI#@6eeK6i18YBY}vDE*S38dcW&LgdH3f14|s6l!-*F+ zejIsn<;$5jcm5oDbm`N5SGWFt9eeiLtxceaz~FRv2bu?~5IA&Y%a<|TYUO(KYuF@g zIYE?YH{!RUkTjp<6Puu&O;EA}qaB*+$G3$pRd0uh-3!J!tM0TBm>qEjq8F~D;dJ^54#Ob-L~lTbquRdmEi z)q3M1hYTwBh+HttC7iShI_X~hl9=TiS*}`aU=eRU(<-dy=&>h$H_KA3#P;3Au4fmG zn6Y+!n&n((GZ4yQ&EVjrP6#RP3EI1^+^8dTJsen2o@NoSpk{+OsY-Ws-kE1eNrTmc zN?CJl)uN3)x;ImmUYhBqoqihWsHNVm)$f4zK-SIRg+bnfyR`Y=j+3zE<2?tSW1Km@ zO=6`!drG#y{$0+r<;rClownM7uFY0kpH8Zn(E38w2+WmQepya~|D~B(VsVzUXP@9; z3dzM7AI$NSd%}Dmj?<{OlQ=ZUBqE*^H~c3757KgQEE(Uj#jQHA1-m&#?fRoGE+53iJX?Bk6W@b?&saXa$twcnngpJ5gH(y7HCKh>wr zKOg<{)hC~Q@vD9n)~q?3T!YF{uUWv{AzzG4!}na~BqE`OvyjypyV0#-D0vj#5|o6! z6$owwA)fS**F5Fz=zh*i;8biuK^0I>1lGfz_71hH)%^(XnTIfhKHaZ4UsAvjswQEVt zyP*bA$dlZ?q>5p-}Ya6IqZ64!cmsNiwIRiF9LQI;+99VwPhLu>10}j0)W&t^KKmrCXQh3_{wiqSJ zL_*S=JsBkqOF5{FCPAE9qRJ7<8Lddw!4f?=6i;Hw!hx8nCpoIz*u;U0W2tQxyF%AL z1(c?ql+&206Y1tsD7-zDOH5)T2rZPT7N0)LS1QYjqJ|i;Ta;{r8a3zOz&R+kXpAb& zOy^k1nw51@N;N~n=UT~EPq)4muAySP!|Ypn(le5sYxPtp25(^Uy>p zauF!H9r)xIrdCOiX%7FN8rm%^(wZF>*ym;L?<*^a6@oItnPwkQK&s zCJt``${&PP1R40`D~eI9EnZMi8Tdpi&d^n!0By{~kxb0gjDbC&f=gik7sdEnF~Z_FVXgAZLU!XT3IHOi5R3mb3&BVw)r79CJQ48YOcx9q}${z0vSj%Q%2>4uhq zIqb8bEV77VZ_*uMYJ&Iei9okh&7hbNx1Nn01am&i*nSzQ^7Zc z(Bdr~LC?i2v!7cn=v1dV%D)!&u!&u4N7c79hko?3tJ7#_KiiJXrfZ~6V_;*i+GHl} zpq*_iY-}4F-05V?vBF($bDulh$PU_l-6(B$;|ALCmN(SijZbQu#@faHHo7&lZ+`z9 zQh>rHzzJS(gGWl;%C7gqWixMwKYUaShv&Ux#czKf9I+Vw*Z60S@C#zR#1*{IfG0Ly za+9BYC<$k`#996th`$`>&}q3IDULOZqns)i$GO3c5DOh^fEX#=`Ot~ZZsROc+S%TAw{OPl z_$@oL$6j})&z*f|N4MGu&iA+f9q@rCdfbzacSPGA@enus`1F2mzyJI3f|vZ{DUWW# zFMipH*Sx$jKefi2JMw$4{OCzvdV*iR^M~L3>KmQ_-gP&*i~AbLOy{D2VhP!IQz5Bty$|NamV15pqMkq`rs8V(T=6HyTtkr5k_5epF# zBT*9j&=16*2O^Gps-iOfMFfkr|sY8Zb@_{0|qW5feEv z7?0)`v(Zzo(KqPu6qV5#!%-YDjuxrW93jvexpBX=ksY5y9eINeKMWkjksg;(D`{JBHC!{`x307BUqzQX@IiBV+RRK++_ygCuVfIBJqrP_h{B zN-bD&^jz{KF%BqY(kLm9CUw#`aPlUVQZ_EqAcc}1Ve%-ea`KYWDdmVMM=~p611d{T zDiM+@t&%MN4lBD7-nMcg(J}_UvL(ZEDv7cz=ko2&k}YdPE!Pq)-7+ZQGA<9UDCtr# zi_R|ZayIf(BH5BJE6*?g(%=GfFe4M?3ezxS12F+oF?kYx3T!1YvN6MPEG1JkPmVGx z)8#I+9W#>{H&fDn(lbA^8AEe4XA|Q}(=<^tHTP08Rnj$wEf#8E;L->-ol!Pv(>MXn zHY*c1*-lG8AkQyZJJCpi;3I|CMK02C%66^7v#Km_Ly@)pwV7=pnVAZI~G zR5WnyK|LcvB~%hv!3J_vM|YG*d(=mN6i9SWAnKq7j7(Npqz!JhI*q|?7IdbPAXr0$SZe@AH$x-a^i9W6JYS(j@AFt0v>@yt z7^c%$34#t{OoD!)6T+1`e<4{lgHLBO3uYh&Dga*NRbJFH{ih&YV zR!=n}THQ1}J3~%^pbdaQW_fl*!}S;_0VlQ-*NOov$ka^PU=mn#5+(tOHp62@a~L*Y zU(Xh8(^hTubpwVWGn_#l=;0pbmTv3TZtoUv^Hy*7mT&vkZ|9aClL<>c4L8NKlW*5l@frVJ!G_ZCv+%?*MJY0crzn;otJ?d*n$0)9;8`(epQ8qf`x^|g?ZLz#n=s4mW@6BLw*Ys zcI6~QJK=|g){G}XmBurL^Q>samVkYti5HoX<@JfD7?LCTZ>yM{t{97RLyL!yi}8&^ zqf?B-m_<5QEqwJ1V&Q3LRw&XJgz;B=lK_lS_LGhFhLKi}m3D{oOlY-Le}~F_Yv2@W zV5S5Zi4(ae8rhhe_>m=9nU}e4DH*LO_>!|YlMir{E6$5INoE2lJT!`GAv|nFl(O zo!P#iIhrwfnh~&?ZSI;iBb#GbOBU2RzqS=l`8U-Wm21}Ha5iWUqv!s9!5FAk7=~em zDPj^#L33GmmR*-P-T8D$I83B-q*HnrjI4gknIP`-6HMV`5t*0?0-%Rlcm% zI@v5aq49E|saa#4lW{w?RbyG38-``8Gw4u;h(Vbs4m4LO7BPsm7%X8~xpg|NbDw1y zA#u2t>Gzg5=RimF2T1-q~_TVD@5u{(Q`M|FA|+p%c_veB=hr>>v3uCkf2I3-lGU)x?e z+p}j|Zx@>aNBb~KTl!ABlizZ+W%06u8n%bqk=25>kGpSeoBpYB8#Z)%x1)MKHJGZS z^0zlKxQUs#vs<>2o4b`;w3)lPo!j?#`=KYVx?!=k*)zL|d%L;&xV`)9z&p3aoAt8(OTzLh&@Ce+%>l?Z?l#|O_@)n%IAJf5wcLr=g5*7i*8DSM*+Z3$e7b@JiC3zbx zp$LQk6E^&Ax1kd*!4itR6XLA%{(Q+Tv&l8@$$cWqvu?^)F}>IG z%5xwKYyeOv3Q)oP#?#iqnRmz0ISI~S8|*e7F5w59!BXcT$w7O9CT;e#5oqq zUvtX;{5aKi2C}?tA-u*D-LP|9iW|Kk&LA5wy>7MP2h2boIJ}uP-HN|kzCRt*C3`nl zl`8Pjw^95aS3GTPUDwr1+v>AcfDUD)d`&wJt<6}->>$uSwN9BoZu3a!0f z9dGBM6NJDLoFeF;p+0Zpp%Z>U4KM*3^xYgfAsQyt>wlourykAc z_UxhI9#UT!D76!&z!@gK?Vp*`>pcGMF+S9dohnQb74f^&3yu~)9^}uq%PIU`6+d2U zUx3Tyz}<5lE`AznAY4{`u_i~iL?|8JdvVn@I9wc+aT7J9P* z6P(}-1|A^p-J2J0o<1=;+s>GYXYS0Ia{}){`_U<*$B!SAh#X0>WJw1e zQmRzRAOZ>#Fkr-(NwcQSn>cgo+{v@2&!0ep0{us{sL`WHlPX=xw5ijlP@_tnO0}xh zt3tDC-O9CV&X^`pL}0M8tOJuKt%%9tr>)z!aO29IOSi7wyLjtH+sn7F-@kwZ1I|mh zu;I8l#8^SgxUu8MkRwZ;O#ZpD<;x^1Xx_}Zvt~tBetG5`;}@$^lX4_Mq}kMz8k=dX zrBPuK7hj$iB@wfzw;~}uaGMG}y0~V?Ad_d5x9rDAC!H)68EHnFLFFC^M!PfxQ#^s^ zmUY5(>4y+!_u`p3v+bU;Daz<&GjGO{{WD1{VONeBWm%Rk!6cJc1QuxEfdyWr;DQV` z=-`78Mu-%G6jo>`%8=A($C4`*~@=bg%Q8Pa9`aoEyJF);haIwL>7|%vs_CYjcIv5RP4qG7`02j<_UrGz00;abu$*lm zNfDBi+L;YWtg;y^Mez7!tVOm`gefz025~CAdNwh^6$m?Sl_VY8{(WtZ_NbH)$&tI>%$^ioy5gDKADSX1Ja!Y*>$@LTJVAmnxF`$j1bM@sEJKU?2Hd#{c+kjfhO7A{QAMI6Cr?aFnARCrQal zlFNZZ)8imF*_A+g@{>*DxwfYi`K4@Cr|*MLZqCZN*P(4-?G(v3IoIq!MTJ@>=?aKGMJdu2_Y ztYoccX3fl#-`@NGZ*Y#i^vrlPcW*y?Ce%v#5yC8;Y6?f9D@Q4ojyz~e$r?8klP;!4 zqId4+?2VLZtQoTf4cFwPbC+u!4Oy~e{Vqt-FIPvXo0_$a z&x}9DIW`CbqXZt9$wXpee4a$s550=niInWX5~KKaec9p3jJRvXa(}q5Xqrq(U=N(L z^(BnWhp&ZfPJ2l{s<4Vaoy2jonJB)lunzZ_&=5K(Z`rP}c}smg1eQ*)AFY(|44STa zYzRqwHDEoUE*-pJQ*xbe#pX-fhlZN1O2?N~WashYc!7{lRSL(Ew`&A#>ra){_FMWL z9&Xw;*8i!+N=uiJ)W7trvj@dbEZ%5u1ASHMXWqvz-TY_57;Jy5*7CZvzy(uBxwy|) z6P{K3*zwc~?fF9#jw|RKadFb}WmI`F(HblAN#9Nnn~C%_0nw%lOWa2-{a^hx)ZONX zo$E3pGfYdWLj~h01z~w`#I#O{XDx@!2W9Ze)dtvy7`-sFCV@gwjFh@yT2DG z1F|G=I$YzJsOLu?zLQUnx&ek-48n{A($?ehz{?ux5CQ6l!#1AknuvP{Hy!t8kj%PF zkm|^ynZqKjD^*?06|*JgoZ~)mi@G?no%E8dw1aWoOMEi2%>SE{ z&h~WT;q|33I0|)xEpaa*lXqCylpZdP#zJ}JRze>i58IE`KdF+wia_CDwGZoeab_N+ zu?{|0^U+X>$}C5KD$X(SZSI=J^ja7Z#^8m9iekWW1;JtN3V;DZ9n}~Yx@Yy zJ?e!(lLnuQ2JS*fw_G;c(DKF)p-2FW;5?h5Jr1kS9NqS~d^S6g*wj#NzT@L`Ha9cY z)YLq>bNA`lJc*&XWq@qH`yl6RVcnv+ZKxA-TOeoV>Fz_^i9^G>=4a248K1rRk| z&J1u9!vMF~3*$K_QCYV1a*XXoT|QrAN^0p7v-lO~biTwn-qNo+_ABw}`7)BRb@0l! zUoe1|bRiiiFi+kJ)!X?d_aym4C-ZhK9{-(r?+H|>79)LpzJ_LOn~1hJDB}6MZe-au znK^b)cKPpyRZ`n@xy7GKr@x!_<87at$Ntnj<=dj22_Akpww8%G$x|%18~IX$Z+Idy zb7qKLSW5)MrGM@QjkkY08awJb`}-5a*g-;A9{2K)_hKwNmN>?b`!AD!B`0;Ph*_Qt zJ8A9H;m;Nvo|7Lpf63Xw7sRbSK^#5HAsvX;o~_!ApMGv9|EW#t-1f9Qo0}&e)_MY) zmg8aH2B15|c6RI0jOnCQ^3k9th9zVC{Kw^gClg6s2j!N3H=X{S&Wv{*Hjn?^efsZ= z#Mpg2U`gK3`FFl<*?s!u=5sjm-`{?1?q6%;X~*4v{|B8+emCM^;A zUg2bo;|J>N7|R(pt-%P}ph$aMq+?5@^Gu}6aisKm#5FIatKyNj32fJ?qI_DS{AQx= z9!CXmMqd$+@-)(MH+u01$L1{_9Xb>J{5TrJ851TR5r~UUeh?kx6@&f=JeP|}JdR1` zj7>qs`UFu$5@MVqV)~+EwHJYR=vX{wToEd+#6FG>MaMvljV8ptE05EZ2gwIem7(Gr z?Bkn);$4EMq=EPvTx>N}Nar96lN_WJ6W6%(=1NXthmyz45b~3rrQRm+h?WYjM5Lw(p^r{UAZ#4 z`_nr`GdzMbys|QA3^KyXGVY#a1aM`d1~agtnU8}rgR(N=x|xqEGM}GhVz_Xj4jxzs zTvRa5TMc(73YRd8OQcSZ8@iLEmX+p^rOK6M>XDV*nw47-gHv{ZJh zXw4m&&DDIB8@-x4sg^fJo#$teHjje~+sGvyrbMQg9etaNoEUbrt@BpOoWeWl1IvPgQa=vGELGdzYGu7G8hDF-nx%E7q~p|} zsMetG+hFpv(CCcS^sJ$Cron=?(Pk^ldY<)qPUEAXM*FHpmk;62PA_g=ZaU;>VlZg( z+6wllV)dSHl4xsUS!#N4IV0c<^YCf2r)~4&_~uYrw-8^}XFM&Ff0_*hTcVuoBih5G z+gr5LTmBJSk}q2)^0cP$SjIZF;&@6jb6Rsb+Kp4^Tk%ynIXrD8RXPPuZG`!f2p%Rt z@B|8?0{#Kg2><|aLFpjn^o-1m7g(5>Sue1#F|)Gs3knMfi;0Ly$}6GNHPPC-1_nl^ zCgxU_*4MAwIXb(zy4|{c=gu7u4-ZdIFCV|V{sDphflvJdL;W9x-hKT1LC}kkXP6h* zu<*#JsMv(iD4f=#ucCL4Mem)7-6vB*`~g`ikgO0wzKkVbiT!Jne0)1|_gPkd60SHs zGYglUlbw^Bo0nIBFDxk|5Gt!{YU>-D+nT!u8{f@04sCXPSbjG&IWRapG(0jkJ~1&l zJux*iIsN6+=b4$=x%q{!^WT;hzOQ~;Tw7dOTV7pXU0eULzPYx(wYKs9jP?I9va`Lj zx3l|eXP5H&-?6>(YjgMD$Ij`-&y$^B$G?6b?*BgculTe7`_I9j!{Zamc6$6@addn_ z8KDdxQuaahtPv-PF+_J@4)_9p)?B@eg0jkfP^ekX?03Ut*fgX%j|rEZQn zOZ{4#C^o&hFz5GsYv!$Ql3Hi`(N9t*nH}Zwxc%h!dS>*^@vhFZ1lU+vfn_&&1q-I( zoEh)#rmWuJ;v~#}P#h{z!vCQ-;)@X!inAEW>46gjbF1590LZKuh2pe{FoCGONMJhY zruC(Gxqk8G1f^c4cP~*t2+N5YhwIBpXt=~mvOc@_$}1z$ij@>Im5r5DD?^FZG@E^K zy>yc{O4HU#`ub|7tD!OgVmy}{&GIU%_>t|`wDBV+pkHDwH}JFfT3*nPinaXE!;Q59 z44jhPieUFyFMLYgBi?sYp+FpY>SPRajIGaqL!6Crd{jsUGc^^kQ9;P3s8<&?ZEjYP zYx^a)svAE0NZ}Qr$(uDD8B}QIX1LULZ6CYucHLk|HWcVo*^&+cgr#;Grfq$98fP91 zZ@*o5-0s{k8zr^dvXbFjQ#&70wcA#Nefl31=V!-3f0j)9@sBecMXu^UD30G&=PA3N zobx$N^h@kfR6zPypM%Kx-g{2Z>bmX=*S3ERX!F(n8Whg-d(g-iUcEo8Y!I;j zL2f|$AwlA;-|tZ=W4YgB8b{lT1i?(D z(vkvkoTr@rd~)5&dGzH@roYOtTlrsksAu!e;e5~Y*M|$^?7-32ptYR}@1D^_Q{SrTVp+_MwLP-OKk{e#)HhF&vT4eie(L&-X`E{WSI`>^$!O zp0@k9alt^m?n>@c@vBhgU@d{a$I0f}Qp_61$ml=YPP-t43~OCy&QsP!FoHkAl1v`S z(iS`2bV}umAVP#j-dOU>VZbpHU2uglI3K3qe9or(>=6-ux?BJcUe;C<3Bda9>q6+P zuzyZA!s$w;`0LS7Y1Cfi)p$L6ASZQ-#{~B3 z(g|5XIMpwBE0iok?|F6e?pj$cofWcwV%A3q%9{%b7gAp!5Lw4!5od)xEMJb_ikk#H zM@w=RpncPf($4SQD@<$gyEhw8q900i@M(-)VDo2xW8kZmhwKPtJ`J9%nV;M)tsH|pIzceP zo_K{L0DvFhIZj3-h<66D`48{~WGKPvtB{q-g@zbWx)Ly92r5K$&7l+T&BE;g5Md%j z7uQQKEN97NahrjEkH|D^1sCvA0_ox4yu$(Ee@8IYc_X^8vEXn;0v16h2f(T;rn)A5 z8TIxg5K*r03>f~@I)@6QdSYxmc0EBJaRk~Qvwhw(=n@&sdRDTW?wdIsYLvk>`onOY z0U8B!RTKaY!j!qxvVgSq$W?xeY*!@Mo1$Yzcdo~^l@-T*Y~ZggWJ0ZAT}X>LE-%F& zjH2i--w~wNrvgh``p)TCEVsbzG4zrSLmRe_n@DVSLY~L{ZkvZ4*B4)Bht3apRC?1~ zTmbkef_@MU%o{J=CH~}qa85q}tYm&Md*P|*DZ^mfqIp0gGgtJ@Z=Wq3^xs5WE&8S; zA_vm7pJLsw#9DCM5WVMWK`T|Tm)29kVAkMuFrJhNhKhEue30RT?~ySWxAnHIint4!^dbB$uA>>TuNRpqEx4%y2U zqC?_xdcwdi2aur+d&??LQiERH3U`ytJadFk%qm0#Gsgp?pek9z@O2{RFXEW?6c%Fp zrzf=>z-nh4H(zQ5#f*l&qm`N)#Tl~aP6@AFHfR}J>-?>R!(WBAps9?|y-Xgp<_I~^ z1WhfL{fDnDM2W{cQ zs6(AL+|cCx2>SfnHS=hwK)x3J=0aQ>hw@C>>q~eLB1Q?M98_=32S9ix@YC`*0Txl@ zBsE3SkcZNeOD06M3K1bHwK}kU$z?&mhad$!2>ziK#Gr$LtG4LSlbUxD2Wa57=ZD$k z1HtEfQRI&tgqLds&SfjPg z0f&Y1<3T(@EsclaL;%iLNxdgZGohm0+ABHz2RBSJA5^-=+>C z!H-AVeyE8=OOV_wf^fZ@f@X)4Z~L|bC4c|0yVq2glaC{4FPAu2KCNjb|4B&b%(c0B z_U+2fVauE1-Q~Wg-+69&_b`(87H!U#FTe04T9O$v|CROqK0cZG>2Od=?$+7#{C8$O zuXS{?_G~ZbpVyLr_Q~)I^5Jjkzne+?XJ0K};Ci&lgE=q$9$D6(E&qFRI`9G;I5*TPkBPBO*e=wrDH6X9!r!gYcoXcQy#*Taow zB0$9vra|_G>k&36Su4&+UFFE@Es<*vBJGbY9S0+CiOW!EP9JO3ZCuo6>nM*wqYJeN z3dDJUiVn1oejF4Xgo_So`M*INR7`|@OjJ+|IR+OK*AkO3^B)w45JSN~k61wu0%CEv z*zA_r+?m+?6BCIFeqsvHR+5qxo9$p9HaqABvZ{wKpm319wt+t zB;)Fn=^QRIP*Wg|IECg^Uwg$d`zkEu6}Or?@5U?PSuqOD$yQ7eX-x@wkRr~dCOJe- zQBV_;IZ26TNma~By=$GSGOLOrq@uILG-grrMFxXb=J0cR%(T8 zx_8!UOjcH`Y|c=Y_j*=At4yIp_AR6A(v3^yvDr?9?5d$luQ#%7sB-Eyq~99nn0w_k z&q}pc1>tirp`r+=e~=TeD9sB7Lz+fEkUuUQCQC%-w^*Oktb!8_le9U`Xx3` zgpfCXBJy=3kDn@k(Lre0IG@8Se@#t@;!(pin7`vKK=G)d7BBd1Ebzy>031_rlEr^E zRB*Od@GqDjB#A$`f`_&7A?BPNBJtnL@wC}|z7=pSS9GY5t{bATU#yTNgwJ;fLW2fr zToHSShKjHm)7KXA&OPNnEgZR;aeo5DNdl^`i|NUMtV{nF-Dx-~lB?u(cYxAQK#p%C zFlo-*o5f>@5}i4oo3VFUh_(#KyPiS_t>oYsJAYjyWX~4;6kj;_8KM;cHHs4ru!0g+ zAO-qmXjs?{qC9z-5Tww*rYj77a5Y zYy}bm<)BK*fXW^OF09Lj2ek%Pan@=Dq9L>tm8w7pD-lq|ToY<2e{!W#-Mzfbgxet& zA%g~aVmy=C2;teHQJb)lk`gYFyH5f07Q>RnI8jF{&`hNnC9^+E^SV_1bxf;RNq>35 z8X&V5JjGP?ErhV>V<=?f?DYV`>ES@d1ocU|>#baSPwdT!@aqF^?rXEODi}bKctZmX zVnmz%oqO%I{~FYOMJij=tItu12)yyAM@*0*yK}`%PDad^>k8!4AJ&S{CBIc`2dGGQ z1f;4Ifm*mo4b|iNDJuvq#+MKYc+{83^SoBt!iDHUX#t3KK%?C}gaHo{xelelyzyxS z>3)EC8Pps20@d#!norSzByi1Py(MkqRnx5CdW1rF|V z_Zm}~h^c$^DvS*Y(!#*p@z)uX9RhfoFHr1Z;>BFhPb9KMwJ~)8Mv#j>7r7@uy75p( z031F%Ur-YYiFmri$^cudt~`Xi#aXsOJPoX2MvZua3_Os#*&Q zHSplQ40(*cAFoOuo9UKAUIjn21F7s)P9Zy6<1O1iv?qPUe{T<7lUF}Lc zLiAZAGV;1yknVBP>0#4w;z;OmDD2_Uc*8#;h2-shaJje7yH|atN8FiBq`H?h-z!1) zZc5@^#eRAa8lm3tPGjMn*7-X$Z=bFPMcB5_FtpDox6h=b&upR3;=Ip__r0~odmHEX zwxRFsbKe_|yb0;;RpDj3){009fmvJidxZ9T<@Wn@^!qLJ-#zaS;2n6NF%alH@HliJ zD0d*FV<2>4;Q9Fg8N)jmrZE_C-fu^OJ=}9uI(c6nmfD#Nqf}|TB*W62hcZHkaJfU- z9YeVbL;2@Jc;4Y6jo}jK;j++SLhf*7$8hz+aLxH}E$@eVjSu5k^IW{E-SgdohrMg*cGV`Jd@k@yVhafq@^0g_^e*&#VvO`3Wd%R7TykQg7vp&O@lxSOp09R% ze?HZoK*ib>HlC-_9e3k%Vx))+H%)r>L&x^gpZVd)8HoXb?xK6%Wz*t+loS z@-uBMz{uobc0=6e20{1fr`nWHKJ}mUc0T#*A~cX7dc2-y?fn-%Qk}_uw0Mvb(+n>W zVA+Gjor~SqtRk6w2?37`B#34_6MLK|8uV-`q*Jt$3CcifwzQq8yDsH`2hkHDrGF_G z5s07mi;MfGw3lL9Ku6{!gbEr|enTwhrD)#Y$%5CSK9prLFzRm&*F~54XNwl3ncRM) zr%%Q}ebDI8bl8U-h*1Dsi)sFA&eu`;IgYKjKDteq)3W=HW!eFj*Crsp)akF)euEi8 zH76jH?v%HhUmE?z3^{y@%jaqE)!FnD&i?%G@0pBwaKQcehDJVewF9h`cpg9Q)LIH)Le1Why)cOoH( zfZ|Rj2qQ_?-3oH+E5K?6`Ncik(E0sw?*sC)QWYjrwE}6ynKbW~7If>2idEA+A%qMO zP~3xPG6mGJ%`pHVW#9)t9+0uJ=Gg^gi6&FTRaz2Qiv*$EV8i=XT^N3lZ*_?}>;X{P zxrPrOqw0{nKzB{sfU+h{9)9O{>T8eke`v+8oW5Rp)Vrb*5NkOGT$NdUQj}&>!`B0$ zoRIoDP4q%!p%#;G;VO)Y$@w7>bUj2*5f5-REz&3ZPt|TJ0#_60P1)@kIWjII@MW`I?VSobqgW~R*| z{;B&Z^-}Ylv`+#Jp^&<=y6sB1F>&Lb9h5fU5lTW zok9XIGxj7vxfVh7$ykXGC|Qifg3u=0`t~;S z5<5F5AR3IvVJ}4G0?uBG_=n#)Yhe`A3b;N}ZFYm4cs8JA@@TD6^bZi0qYM8q=cjO5 zGA>cked<5HdtVod@_^_A<;Elk#?D%=7U17&cE`Z)!R} z0HtDzT~-&xi>c6^QooR$fgaUI4$@iFVTybp8B`l{9}DMHP-!v3SSz@Hz$uGq zvh0JR-@kMpsqkWUHxQ;}I=4a%=z=+A%Kx15AOu{_gZ5WP z3tpJuBprx5U%R6PZjwV!|LlDClxnFAsc`r63nF2sLNR87>OsIBmfjC}fVo4n4P$6htk$FG1N7e*ixosDm`IeDC`ge@ZZT?KYF?=~mF>OgXcS)YssV?4!__Ms zeA5yd|4JIHO=aIJO`%KU(o8PLtrO@(?s~a~EAksCQ*uD=jh_hW?mm-do~4bpPWN_v zr|edx!y$~7zlm6CrbmtTx04K1X2soZnAkcOM5;J?EAyFIpnQyK!Q5q5O-}c^VX6xU z{n<^<562BMO>Y$5vUPs)JyO*rxYJiv!gK1q>dj|I&wRh$UxT4su?SIAMaZkR%$t!M z9zl*T^3+>gW5vo^ZmC~v5?_o`{n4_lEpV6ScKj95);p;^EDnM%H9cD0Gk-$Vs#877 zT0L@FO@g!2Z~kcYEcio?3zk5-bhLUECv~-E<~|{}dY2biNO_gUiC^%pdefinsvL*p z@Oje>KNF}(?FCa`t~b2w-`Lp*p%(f=d--l_Fh7rkMncOi21*rU`@QaeaE*W-gjh$w zJH{&-_uq4PcHAEjh}L*8Bv#(>;DhXd#=}un)!dhAHFDsjnl;hRgUBtz%9p~)$wiO8 z+>F+IJnLEB`FQ@`faa60Pu4o0e1Cz^3R;X7>k3*vN?tz)3M? zOhky?VWqm#qRT#J5H23!M(2La#?~|urJ68D_ozjW|9N>73R*;eb4E{y{Z+I!-7RJV zl>SAPkFg^9Ma-o$Xi=??adsN6tmQ2RfbE6&o6zD<4TA;>85A)_{oCA@D*Xyg@_wE+ zw|Q6Xb2eyQG+ZQi|3RcRcTA{E3GEcg_G%T&XH2?vklh0lNrstU!@<- z);lguW_Blhl8Gb_)w_VFa0520a_J{^w^gRHl$<@3*lb5UZCTQX(mYgp^v!)AzfGN) z_CPiFncvGueMMsRRNvCGc-WMhv~J_6vG~s7$!EpHy);j)fBU_fOjv{wa!zT5@^IA| zV$gL>(PVQ}3f-J4M7PIz)76#~GlBH4PWD1VD4vtwstXxm-mXH9ASl5&kgaY#U_vo6 z-;0Pa6Yn*?tUmSXnNo>rww?&8m`cjTZll1DY;nWjoI6r~gJl*63X?z*K(wxY2E$em8YNc| zWz==+VGmd^ya~yE(~c^=*?=2=Ubm(^h(As5Oweu_A$1a$pE7( z5w48`-5)nZaGQNbXzgLZewaCz833#wpo2IqcigRMYW&_f?pwYXJ_H_U3Lxq5(rtm@ za*NHhOv6eYOdzP)6Yjuu3?#ui0zQbZdN_lIVIHz-Ot`ig?V)wr+era+>>Vh!pZs?y z52u6PrdLB?=BT~!b(;4|+JimcEePyIgs}g{bkZ~#$vO+&Cd0pQIx{>E zFnWKPUfK!+zE=C1HzdG@)(j1rlc)EQTmtRV8C+IE5y7mNS7+yDhJW|oPZVfd{w0Zo z>jILDoJbHCuj)m9t(OKkKUOi?QaDXZ595lor=Z`_@Dp~sjK*q9nJGcxdlrNIMyA3V z9l($`rLVSJ2ePw(1hMr$Ea`0bG)bM1EUUoemG?lY(4?Y3*AXVFB?t{K#bnpvp#kS5 z)*O<)m_~3;iM#)x$rp85XA5gE9fp}l91ngyON5)f_Aq#Js`fF<;!%yFuZMu?coX{? zt^86LlhZnk5qFgr)t)1`Kr)(YNjC66e-wUprlw6ZnVj9ZYfIMTnVTySYhTrrf70!g z{VV@T7mL@u=W90K|K+=Oo@tteLKaBD{6W2+toOoIJDk9F$I@K80dYLEOBXy>`=q*l zUBAJ*Ts(~$FxVAOdf}WZC=fh++j~Ev*m+ep`r42KgK_4&g&&?NCnJmwzjKZ>Ow_)d z2n6pwEGkB<>ohM<#CIM1;^o`$w^5%e-Q_FS&Py=sgRC`lJ*s)~b?YYL>CAhr$Mux7W+t=9pgj=2;x~wgG!$ zGE{bZ{8v(R=!%GT@UY#t{mg;TAIkqUWrY{19MC&?bT@tJhslLh)OjJBo!6p-ytqw^ z-!#C#mW9lPm;3odYX&LXf0;Ytmkva-FFbhTPXA-%Xy6UYZuHMNAHnY@w$|kRJje4j zyY7?TO!AY8d(U=%#_i31`TM6``+1>(z_~iR_Q|JvuS)Z}8|QDnIA@!De)N-#ynj>s z@7DL}v*m*G)9>9mo7(@jv;aDEGB+CBpas!DN1LEwp;~Z1VrU4ud>tl&zZ5?K7UYzA zTNk5g6(&H!B8g!WTaiM0pfBOX-4r5qLOIQyIK^WuJ*sgH9ma{FWMtU{P&tE4V5A!c z5dgyI(n!nIA3N&6eRVj@#5hOzS3)olLJy}KhU=IN;)%iJTgONY_AY0GC}sjBl-?jT zuw$evqNFWKCnly(Be*Bc=tUJDpmdfUCFF|XM8@)<0si$1Tt)!@)fhpm3yK}Gn( zBcduAae_=#(q0(uK+xYxDxI8IZvs}Yf{Gsn2uu(e_5dzqpRUbo5&b@Wvu=W1EcXG% zq&kMn>y0-R7)Ah*#KSqfFm!inW))PfuE?w(oVt!g?(G7g}11w{5PPz}E3p&Del4Q7}DE_uBT8R^&S8wk}f zAds#^PB49(0R)mkRN~=k6PRux1_WMZ#>YGjv5Dv~)pvR&_$#$5;&r^H zfTZc$G{y$H#48Ok(j;JW51=4-I^Hm9FUq}_4n6@KO@6RiF)c|O>~_WzSx16z4VT4S zpma{C;Xohp0GWF*tQZ%@$wcq(Fj}&wB0MybxNkaE!asg)c7z<6TWFc@8=d?(`W2e+ z?Z7+^GDgbHSroSDmK$64Ygw@wYjGRwgJuAY_Mn+$MAU3ZjX$;n77zH z;AXZO|8vK(4Zwh@u;)~x`@F5c^~cNI#?NiWTLFwWX1oz;d77(w)-hi8(eiIvJo#Y! zc%<+zlU2dR3GkmR$mlrqb<98gc;MN@qj)RoRW2I;@fItqNTSu-i3xi5CWb#&nV^qt zoL8CMC+fw!CiFhWUCSPI{#fgM^+-RC`4h6T;%fRlH}B}jH{RnktK-u>R`ilQ8FZ6z zzB%?!$(=$l{2ysr;YOeE#zbL&!67}!;4XSTyAecHHm z+N5#X^!>EiOB=S_xL&>KP_B<~3CvZ#PlTtFFMdy3nsdOeLjZdg0nJakX4kK4W|I9r zF>zwNQDCUtM|;h84yB(SfH1c1*cak})*XN;`RYw`T~~TrZwUaH!PZlOK;q0`ds~l4 zwCA(W4<&$6qHW#B&;C2MGBh9v25@Kla$f{}_mW+x{PoA~Do>u-1;*M1rz?lNwtGl! zwF`Zz^z7>w+x;)ckQvO&jOTnaQd0Ke&)6v*H9SuCQJriQj~aNqeQalboJe>4`x%Eq z`LlA40a ziaaqd)tu(v)Ix*^)%1H|(NxZ^aq~T}(dt@pEosI}>lm&WEG6;CFhdynQ%W9gbpAFS zH=-;p#2MBw1r|Vshi8LPXq~1?ZYI_q0kl*J9wG=BKuG|9vi0OMktxluOJ+A<6VAZJ zy14a7)eo_79Cq*lM!pKWGY1hwzD8~X9L8~)>mVwmv4zMtU-fVLCN86SaLwFT-d5o> zGeENx8v_A!p&FohNG*&5s8KRJ_7|e{X)X}}E++6x$(zm!-+nhLRa<>c!2r27F-Ruq zll^MCK5&07C1Z?rs*d5e`c{ILlTJ=hR&#YSafN-0m-Hd6#bDu9VS^YDm0X-npcALp z8^sua#>k1s9+=dRt0}5ujw)p_Ty!$M84tYOXd`h3P%om$G=@^(R3i-DMw*N1maou~ zP!}y5nKZco(BmNT?ewX8i)+bP>@*m$j(MH-mab#TWBAr3c8QUlrMQ?xLE>wWVk|wO zNg+m3nX)Kk8d8-hM`hgRP`?%L3Qh^c94g1cTd)%15K%yh%eRKxD6IYtSSY|+w`@UA zg-^!z=DRR@E*UdgLIS6&ECb+5soRDh({TlW810=cRotvpF1|JjqXG0I_dw79Y!6GK zpliZ3-K9v1rwtQ5^&TJ);N&E8!&#KiqOt}C=!->pBr4qTeoSj&4WWR0N=#3Zx*`ns=n{aBxf}}ZP#(% zEPK3J9<@ox*sS=>M`Y31(D5nP(RhDb!~De7r!@p_!hkCT#VduYU})2wS}&ado!|i6Wpb@Tg8M3* z^T*v?868t$BPWX1iRk(r37v(jWp~5scDMM;SF~stW9r*)U=S?~9f>p=IL#Uoh-Q8D z7dviW<=#2k6tx1nPy(7{zM@hUr-;9KF3LG|@g_``rT5#t5yN}8E(V($~4ahdA1XXU5sQjZq|G;I3fhJ<#0ttBdx=MG~hUN7>^g# z>p7XZQAq*uFrU;L$mScPCOvV3d2UZKmSJO3iRp_|m`5hF>ix;YJ^h?L z;aR=Q2S8Rzc(O*gA|`qBeUmq?7J^%n{GCKYa6u3-JTo#1WiDG^W$-bwmjXuNRJ{%f z`>JZUC1qc_+yVJ-+9s7M4dHt*~I+%F#Vc7A>!TM#9| z6zjc?h2mam1{oen8qRG-ruP0&57j5KxzeE0uQa*RB|cJ=1`G3sL9GsMtUZD!%jnA< z8T_0!Z2sa}0B38aGA557C{X^LVdyR;V_Xg8VHj*K(~nRK`N`TCQ+-zMCMurCvJTx; z8O&h*H#!fsQ+2=0Kk__Mee?v|8C0HpWER@6h66F|Vqv6tg#auZm&o7pJ2aop^j|Dw zhT!u=q2|>e7c@nuONJ%@fW`#HzDZGpKdzqmnb5uP@?Kmb2f@US>T)&6L||o&ShL9| zO~aqaZI59|eYcD!DeOinK6i7l3%A<^xYt4QTfqh8%-mKIL2qK*5UaN=rFaOvHAR8+ zNHAjXfWLxD1cNaVUN)g9Lgb&*mzC8d=rU0TPTzxRSU+@pA7gh!U`pZ_)>I zlY$46LN67Z=S3bZ7BO&4VEO~FvIVj)IXgHAzy~V!voOeEQ6dX%7;tq22e_u9S2?WQ z?cuHtNw47nActMdz|phYug*!|#exd30Cn=((YNAt7zY}-At2j7^OB!aLj+)E0AeJj zC=gU|Q3uB31Go4+iRouzU=*J~y|Xfk6o$kH1tGEURC-0u6lw2$;o&q%yL!KkeUTBI zg6Cwl_ixd$T=ggW+ZzwXn6jD47cTi6h)T|U z;a)u4sWC|GT8-a{!jF+`)vY^psj^EGMORW~{7;oOE8^Tk`n^4ASU4DQ`p*YXRCX8I zp8Vd;Yi%^0sEB5fy?c(@pRT$MZmxK55Dixi`Q);7rhd3R*Zi>iYi{Y@%F;lp>^<`N z1KfA-{6%C>e}0p@%EJ2He_G`8)1w0CHwx#$AQ}`B3wx0M&6NDB85vHmevFJ5p>{_` zvN;A7VyW6nTqF2Gjs;@`m--itfm=aBaT1mGxTs67#Dx;%hfx<_R-3m7C6d)PTQ1t) z`gD9TS%>CiIbI}d@M4OwWbmzcX*M>GXsatCIJY>pA2&KR zh9+J)R`9OZMrFH9lacU8LvwHT%d(vg{5dJS4(si*-G5KdWQibJ4LNcTj3-pCms+Yr z?j8N*bBaW&sfPS}Hm6Yeel8yA0rUOOXYzw;-*UuJu*(pDT>WU)zxX zpgixF|3P7^LvdViGE{Lwhb5DOYI&X=JkzG_RGPXg^jB&6>RNf=)ODx793QQHJC(mY zxcW?a#_e|cqc83`&mMQ&s_JaAyHosEW#NA6f%5#L`5S5T54JjwJ_mmP+dLQiTNAaY zc}9;~vZZxFEx*hO4O)6d+u5?5?qnghlH%*4xSIKt9GsSQPfL9;FZ{Xsrb3*B`qumG zeD&=*y_S%zM!nOv?bfYCft{waF|pltTJ4T|o&TP9Wc09fYy8gUN+N3gzPWyM}=H=tsKo{u)Q!q=E|3oYsqLP$4c z0F^FtS40Y9l$GdXCS7V-@ptm>0pTi2bhCzo;e7i@s%tTprd|_(EMA|1ZI6gfo&Y$Y zQX;y-OJ=-b`YnSxRJ=KY?A=e^UGgA^8tMZSk0t;Sgr-6}53$4t^iExUPmAQKTggtQW zHwwmOhA(An0qI#PMA9RLqc}Bv4b>`bX+rL&^KKci`y>PWBWc27?rUIY5|;nm6;3-t zRCkxm@}_V+*<&oDYwa~|aSTNMScg$k?n~+fw(jZ97KBO8KrPS}^1Va{tPUX5=|BxC z$2vNzBrtpgsHYSrGU|(m(;(d-@?L_D4|zCV)-*O7UtNU+afX*T-l>JO`kF8zA;?4B znm{%`;~TXY&cmWu3XP=07)5mCuTTY!EGvcFhm2+?Bkpq!@@o)*D?(4WwX87oT`MrE zARtjRP{;2D39Pn3Q8vB1`1&5ijP-h$e1d62(fx9)^F&eFOSmk2nC=-RtGz zYByH4!b1*4q`_fmX7A7U867Bfo6kug7yium5G*J(crcu@IO!JNfISM>{?6A7BZ3cK zOER8>3z+FdQUnGe-0zc3O@ff_0Xh&QDU9DsafnV{NXb+e0=IvNY)#W+yh8&0FTN^s z_YH!Ew_ncIHBaNY;*HSr<;IW$VFoU0y}P8POHYEi&4L0Ve7zT3n0jESPMuI>>}rz2 zoeC39c`ddPfO?SBAcJ}vU%m)JggzY9;|KGRq&L5gwN7Iy9$w{}z=|$``o&@Xeh8s& z(CPA_MY4MgGt%mI{@8<$q7u@KHWUj7q)y@zz--LR`9w1A)#24LoKH*iy$+^ zt3m<uv>xOV%gd6@gF73jq_5joc38Ak({`6u8L+647ZS>hp zh&j^ zkFxr@DYOD|UOOhQP2PX+8M=0@JLqFKS-b4!-<>u1=}c1oVXN%( zYtL_FoeOev zo^)>O?)1gtf^5U@@p4GkF^A6>N4Cd>PRZ=-9)%e9(X60CuDeE@ae~PwgIrC5Rwaep zlUzJ)f_!uOTo&O>{ccOiZhVJ}y#4z8n}VdhLIL($VZ=hDVSWp+^J20w4#!CFeS9b zPMYyS7&~YFBRVMGIU1pXwrIsTyo%rrz3tPcgEp>0} z^p5L1u+ddvWt2lBCRh;C#6U9$pYz=9Spcd;lxOF^rY>Uhd?;0!NQ<0A=S8p!vqN}^ z#*|}?B2p%Q^AZ|?a+BSjH1jEi?~yT#&e?R%!j@X}04o54mbo%`xUvHPt4I*4qiiN!p2@pu=T|yOzc=j1(g|rgo;l|6HPJm7Te2z7PurR~B&&+;a_oFXbK#pH2CCTwD4GA4Lp8!-Q zlTbo{3z|}J)dyddu(y>V1cNCoQu+d`D{7Tfr=%??uh5XPgvC$1%pYgf!D`V5i|+N&TE=6yNt8gpFndREV9XGP+?w zFWaInax(Jk!>6ZQ+4Z6Byr=;w4n+dX<^l?x6PNe=-b=`Rwxx?z%QAb%4TG_g?Z<?oZA`cf4i6KDe**Wo4Sle*w z(7X^H3*Mx11q0cG3AH{q?-egUEN;91VC5ru1=}TKKCrC1DhwF`xZj36O(Q*jD&y|r zd55)4D3BVseKT7b!cjH?lb*KnCkX4rK-z2zl#S3j0O2MAV=aXaY6BGWus-s}icBs9k=MD4MO9Zdtm zZ2<+`>5*)0ZBE`GMPb7I@BVeKN{WljH9B%$j%UXu1Em3w)kS|fY^Ruaue7(t-IWK{ z-&;S~wq5k#9MrE3B?`ZG&)^pZkyo(*ISaNmRV45(FnLgp%AUKb*~i#niDnP}L>^>3 zi3r?k#c&)}nhNde&4)m<+g%|=e)smAW8$kY739*rn2+pqL#CHw?G^R z*kkP_s9qmNb4OL@CFFqmnX&&ZkSYWyrL}x7VQb@GE#bisS&@%Uvwg=RE$W1uk@)P% zbtC{oKoypLEA{;*253Dd_VBIGx282?9W2D*0z~%ZBRLLOBi0l$u1X^YZYQHBr6}=An&0er*+i>YH14qu0dd--ZT#`ZM%a-Hd0|aq&w-Q-5OY6X4Zb` zn|&UvT7=A0Pbtj!H8r#i=?*lf5?MV6rnOjOE5qKK)Phlk=C2CoTtpTu0U{&=7$*QS zj5zLcn@i}|>Jo1JC^F|#=w>Dw(RHx!1H$R-H{IxF7`m9ro(gl9T>bg_pyk-w1I6u- zD=ZC)2QB!+?oH&(7nUi-pR;(jKVR5>;Wzg-QM{MXEamI${_L+%hhqL5+N&HjGwj;s zt1|vvF*cm`{@jK?xTmanyncK;=g%8C!xgEt68D2o9K|19#t(mzh4&YDWIfhqF6ehD zkLoYvXFY~w_8s-#llv>|p_tst{997FVwj*He}-RR- z8!-mU85@p|hbv3RR7fW&%VY!`Z(wPpDM@Y2TFpOXd#5bhSs~l6EH_>uH}mtPwkXS+ z3a&rpad%EAykR=rQ~nOTMOXZVQu9PTc(#B%pO(+lLO7ghs_IA1DJSL2c8mQ>)v$xRpIr;W_)x%v;!bpAgR6mE`;|})Qm*>&!U74tx)jVcY z*m8wc>InhiM2;sbs2wFavMsYHPnZ*HH_Ccy#KS%_UG02ClX5y?>4mG|897Hq)mOr?9QTG zZQ27ip~xI>Y*El@Rc~z7(`mc$5RpPT!F%`Aun}`9M&3`SGpMmMT&F9hu}cJr+Q(%T zkeXhFvL6#|nnQ6ut+qSg*gV|E^;U=Oc6qg@@rk!6Y^w1O;d0-1oz2wpeioDfOH&j2 z-r)DXLGi=1yFZ3DtcSImwxsWkboPzdpH9IZj()Hn^Eyn#-y3i38;@-2ayguMVm+Bd zKYS2-@6)S$?UkqX3J#~j`aXSVIz4=E+O=GtU8&f9FUKOt^gbI>{f5X*VkE>;9Z zva=)H4(E>EAhNohSk8%GPP%V$=AA_s@cQh#M@>#%`XgX7h0y9^c%eO17GRY^;xHp@ zF5Q2+s=Em#-Fnknw)kB-|FJJkJ@K$AJ>?WvlNu3P1(`!9~vJ-T7@M2`sL)=KrTD=za1WwZ?C@BTYNQ_d-L^k95*E zb}9S!;XpW#PA2|xYYh8b;J&|~=?fHly$cp{*%_KD4)doGJ6VyODVUM329fEVA$HH4 znzCt)l*s<}GQiaH8ODqv9xP-GL74#t5++zB|X z*ic)7K5>V!3Mdwf!-9_mH(n+(2WLKQ5si}_>Jm@Rjct3V3>oY`o*#eK;;GSR5A%mY z@r<-!oig#Kd;(|=QBiblGi-UljRt`5m5Fw%&&J#LX@0M-cq;X**S`Ps-sdulgw;an zGo+o(eBd#Ol*>d>^tY%Oh;QcC81v%`mw~MJ(U1D9G}lIkZP=Lu#dQA2G9tb0SXcYw zjnX`HwI5KQ#>?CtAVjJZuR!BO7BizY<{GI62o?d27RR?(x|P%9wJh#8qp@aIj-PJ6 zC>bkuR0`#Jx>rG?M)BzoC?E+)i=px&tt=VD>qek_Je?TzdNO3CWc*@Xm9g}Buf4VL z8JY4X=}W|(2^=hTF;mo-*`q6BKtOfbPe3b}MgubXTg|d@%(}Z@lJwcmxnpnq8J~Y- zx2}kL2s<{pka0ONt0?`q)#PH1zr6RtgY)T=OHYVw=f$#b$$wfdIQ*3LG%w2c)5^0o zNr9CYFG{nI7p0NTe=n)yIp_JRnXSR|bK^r;#aiR>Q+j_s;j5_ zTsJ&tqs@F9fGD@ktTSJxHe0RMv`3ox{XYMw+ca_e*-d}!;6`~b((iWbqxiGWzxu~3 z?+Wy)D@+GAXu~gTkNR;6$0pb$UDz24Gk?52vbXf{EtpA`+4Rf)_lF$9DDl$FNLENQ>e9iFZiShHUxPN64!0-$W)2xfz$NlfnPcE`HW?(lOH%%(Z6z+XBx}-vd0DR#j*PHbcaf#Zf*J&zKGQcD7hf^1({ zocsAO?M>B!oHOT#bL(f%SGO%F5H)!({7lI#`gu(;Ijc7nS(*8 z@34?ncbnhV{^#%$=x7#}J=@lUKQ&(j^qg)Wnr#+wD)s4^5Dz1z2c2U+beSc_4bcG^Q?3INU`;(w@uUu^CAn!5`&K~ofkZuY6Qk8w?|)bL0`EH3aC`1 zr{&+U`tEA{*6A(JND03BRnxrI`2Df%(tFpOE^eQ zFHPu%W`9=S?YF-k|H!?;*e}G=G>qVHp`$(YQP~4gr?&FhAA1-pWDmOY1!O;}zkaGx zip`8M?CwFnY2}wa{MW;)FYIZTbbeT^7Rd3Hz^*|Og`dQ4zq%~!b*?{qtorSCiT~s8 zLZn#?j8t{@xX&q_T`E{mai=`_vG+BFoXL-Ob}I9myivOp0(Y|^n=KyX=bi=?V7|<=(7~IQ=a59A`(aVviTaSN*fqBg9J}|V4eES24@{>JhuhQzr3XfN`Yq|#V zkKKOph`Ma5?lqJ@7FgnUIAil2XHVbs ztkE8yq~B?ZJiQ(;b85VXTosmE5LCv6x9+5$J`&hz*yBl-(14|Mie=(r%)PWcU{ zHRAi72eiChHowF5rte`{&?kFu73klRlJ4%E(7WD?diU$e(cbbIz4s$AS=(9bL>@eD zegdV%>_Coqa^uq1sU=-P(@_OI*N+Nbz2eNGgAEg-UWP4*+@Ba^9k4B(wZ%XkXnb0oj3LTgD(AD7$=R zK;c!OY4p4f1x^F7L=fQK6!={VT)FH>W8D&TH2^njje&n6j0WJCZegGO%#AE;* zQ^v&a3tgmRkX*L2%xK_f5=7c=)|v*eUxy$!0j9|dpEp@WWY`wa5+;eCf(bL{aflv9 z4;af9oA4zT!{$ptR51J(EMlL0CK$ugN8wMVLY1k|Xc{tDi6xlI-e3z3Cxac?rc>}x zS*6(yGEp^o)`0?X20+>RxPq*ZZMadYKh(+R&ddwKsRvf^2o%`}2+1;P# z^p$xsfbA`QCcPZ)jXAqcRjD6f^DYy820;0;gSD`TiUCVs3S5T@CNny!6wyamKBApq zGa7MR9^P2UyRRhFS&kI(9iPX*9k9Zj>p}^XQS#<7dw?)!qU1w7w2d%Icf!Cw`?ET- zVZaqhuoR5umHA8xauYw}Nr8P^gKbg}gmT_k3d)DTmV*1@i($Dy`w~oL^NjlP&6Y`* zjibhn!_gW}lXSkQEcIb<))EIz#34JVQsMH@9(HI8h1EzAzJr0YtwXlh7vceIsmjw2 zHbwHwWFD``Q}@`?FmB!cS>Evd~AxuaIAed5TE5HMg@8vNQqmO$ljB)m*~DcLGG50l-@X zwsZ*>HcXp3Z66!KTVSI8rz0h!Ag3x}|>We-E*acop2IA&OLmcaJ8+^`*| zEpuzSQDv{?);4=G# z!rr!*lu5*j8%Uk&g9K1`xhjumD2n7ff>aDkfj=^74oY85&^8V<%IOALj2IbP!-C6U zP9tA@aVQcNyu60>5)kZctd96)YzwflD*G56W0?~*AB<(Ipu*f};%g}I5EuVb;`1 z5(RefOZ>YZ*c-q`1{@hxqxQJA54LQ+pEZ~Cg~sEcXK^n5c5I|-rI<8nMxKtd6)Srm zqbtakjdx+)^;XOk(JGO;D)9EGti1RnGpa7Zi0Bz_k z5u01;yg!)7Z#ljQ&=0aU8vkKd6Bt!`%T7JjA?Ws8;cfWF?aRE&?m>5yUfl8dZH0H< z3=9f#Ee*Q&JDH#!oZMy|!@H(R6>Av`{@n*5tB0`O49OZd)1ihusae??5Id0^y4?pk zOA9TpNvaB>hsDjq=GVe<dNqt7c7B9zLLcZ^h%@WR1ZH1$qh#R>gpkyNtJb zB6l#6zm_PxOBCHDFa?9pQ~RYNkPbA6B^6>pi9Ed6@rN*dY* z0edy%gWusY5Ec)r)8*}Ge~p;i!7(AVG52<3Zq-6P2%+*%MTV2kCu_u|1v7F);vVnD z=w3l6kW}3QQ(* z(h(`*{Jm0HDX6X#g>xU2&pmn*^GG|SN0&b}*)-L(uG?ZVH36Pxzt`oImFC}>c1g4A z%DMD&G3j3CI(_*w98EKVLOMbxGxXq@ky-80S(!4OnMrkRDd(~zW3qB4Tl4s{QO7~c zxa`SzwwIIHzpsN74RdPZ5mMBgc$!5+cw_Rm`9o9*phiiUOMTIW{i4fS#n(cMZ`K$4Fvilg{z5oH>YrV@xBrZ& z^*k!{d0hSTg#G8qS})QF+5(ol;{w6}<{~$tH09FuI z@G}Mu$|!~sib8WB*-$8U4m3L_gA4tS;^Gw$#z;sUmz9xKR8&>h*3~yKHZ?IdH!(9e zKVxZaXMfhg+4=m1OPAfR-SG7C_4oC^?Hdr}%Wy+)|K*1I+`i`@bpKB1y`ZrBL3fF6 zK`*8K7-HzbKMPNn`n&$2hsxffD+SP1Zqe0(=o%4pY&_jD>+n*}!R73YAaZrggTx09 z6CTDV#3v*sB$1OJrKM-(X5~J~ee$$`;fcO@%@9RP-jr8VR==&OtE+EpYE)e=4IdAw0|#v*2VG--K8)=TOzn-$ZcWdv)8>|GbBnWci?pwEwArsSvvZ7tx%q{K zMFvW`!YGDI`geU_T>h*6Gf?`UXwubh-`CdGHrCevS(}?b8SE&de*FCF_J38swze6y z#i;F_?VaB{jQahTNXn?+|11Vm`WH{isK0^Izit^{e*>k5|I$bQA0Pb(#`!;g&wsn? zzkT~3KmTvf|Id^E^9Te>H)vKC8gnA7BMTD+(zVzz+|AStBeG^`O`*+X_%P}E7 z-_K2d6QQ-`b9tn{f?od0d6Asf{VV5Xsh<*c<(O4{6@v&pDc~enU;P&mx?#m2Lf58h zr%J6)Hq>k|h)}_gR*khk=DHNtO-?q}{aPB(JO0GFss8rVhklcpzNUttit$$ZLlK)V zK6heRk3Ij32o3wq#v^-R{r=tIpHm;c&-A}P>i&gPvTY{(g9vq^QSa`mF@j#cJmvy2 ziS6EC5TRF`2SMx-%d;^Yx$s#=(2MjGSi;Ih)R5H;4PsJEqyQoOV;*w}PC$>eI0g|a zepOrtKmf2AVVeI*gj$gGQQE2@5-`mzoFvL=rwo{anI|_xaM3c0neOQ~7yoxesOEL( z{XTvo7zDr$Br$Scp1VkRF!qugNaVK_rv6QYo|uJjJIE%>aOPUfLW-=6ezX;y!SAd$w+uhqCz zmq*^ErF+R&3+`gO>Q>)=_pKwjVWfc1@uU^%01`(>U z^!jfi^jAL?F1Iyc#OuQ#LXVgHmGiQ;HOwGFw?`bDr$=>M`o-3deMYJ|1Em4#j0oh~2O zP5+kPPv2jt&pEBVQJmx3u-0_-^udoyv%Yud+J8;!{CaO_6SmQXvbncCaii$&c)P;P z>E9#Y?+>?G3H^o?+Whfm=C?+~2Ej{9G#-6~@<7C;s}aQpgH5*a5123zQCP+j zwNEJ@js=kZbS>%sD6;j|#Wb^JV_QC7ljEXWO#qqh;#-;DDMm+ElF*@eh)wT+ueU3O zE%ydhfJe#C2K|*SY*`26`Gd*Xh{7fS0G=H2ITlfd1)svj@$bufS9yKr5?<~|C0$`P zqZqKX@~LyK(?nd|<9LB9B-_no!c|%E>7m+=Q=Vmkl{p21N;T1}wiJZj0Zlaj6iV+K zIp)NVr)(@YYpt#;Bwv>m6ra>EH{-ERNm|X}6xc+GxerAb#|w<<@OOpB2EYqtugNFJ z^ccTPPAflfmB^3%aPAZ}{ovJ%V%Cn~agXGf_sC+!XEz(Jy!@G&7#NvWX#3!V><_r9 z3-6514-$saptb6PoInMciXTwmx^(FlfxLV*nJogC)r0yd6cd%IbCuP2Qy)dzgxGjL z$}znvsE~thvlCE`M6XHlmrzq2wUi|dJq%!&0RY?<1D~>p!$c5>@YF4k0bjETl!IB^ zyBi2h0Klm(9|-%Z6eG0R@x(GB0-SauV3 zN5(Lgi6ZFQWt%LgGzUjXbeBFCLJ2PUoE-!`jNz6Z0I={ivyvzVD7W(_`E0WY{{fQJ z7+?U7ZO+KX(G9Rsl=Fu5vmjP9ko#15+zAhg@hz9v!v@WewiE(WG?(vo@i!NI={!j0 zuu~Y?L7t>k4VC9I`SOsTl3%tcwsjVN7StZGTuMk! zf7$04hsw+6I7wE87i>b91QdzO7V7W>$L|8Uc!+2$;Q3-y85UyMapD>irT?|UP{qxU zHbc&>&##tR{QBN2`g$Ja#;t#xZFU+ddqvV7`jqVy9>|OZJmcr-3bAkb`ea|D6LakR zDMO_}6#U#R9Wzvzj$W&?Pl zYgS3m-VUCpux1qtuV2eiiJ68W^0`i$N1P#|XJL@bk~R~+^kjcbF|X=Na>@Hh9kV1# z^j_xd$Eaj!|G=>vT<$Xss}!Dl?P7USen9T4hsBpN;+ATDzW^>1dukT^n|_tc{63X^ zQx<&^UtJYxTL3#DNCb8ti?LwfR7_=IdDz zJH>C%#4`99m#-)rd`o2z&yDAANg2$SYH7I?6XlCEkcp37+ijr%78e{?6HT0s3WHvcY)K$v|aFdtA69P~~p z5(T5Ye;^Wp2EokE4)F|BF285~xC z2vjs6%BE}{WxCspiY@Dx+QlMX>PoZU2aqI%T3Byhuf(#ILq4KrXFz)puINp$2%s6^ zFaVkJ8e=jTI4?z8YumIlU0h(~ydaab896Wavee!)a$awj zE>Zu=dC4@OY)0YuqOWK~ySqeR503W8{4Y5#|CR_1nTQe>WBPYQ=-)vvsV;Hp!T*j3 zU5<-Dh~|?2JrP=)`H&%fHcmYJpG0VD@Pq#y5&C}>^zwJkOKsA@L=t^B3BXSVX_6u5 z$gmJHBJ2M)=Or%EPJ+Q=4QaWy8c0v3tUXQXh0t~6H6JZ0W0gd)vgVJpZp!&XG-TaV zwE0u@ICNwu2@Vd1nlh;tOhT#-sU}&LB~__s`Gsn>Om4WRZh{}#*QMn)>+7wg(ypdm zexY_u;fQ_k@c!KSB-)Gboah4AZ|Yi8w{^IoomFV7n(KG)~v zvKk&{SfSaZN*xm{mEN;V#Z=X>6;L4Tj&WO!|Y(ZK0ys|cmuRE zZp^689AQcW>y<%9vp9C{*yxcVvuRmg7>H8aW6*i7X~&BM0#Lu~LN*jA=zN9;gLp&( z^U<8eFp$S&lXpvCaRQJB=Y2E)(;@@K2y%Qh@ItzYHU@Iyr6>5)Q@wHs&!%6&CYaAQ zgyj>(Xp>T~2{Qoztp;FWo5-6aAl4S@L%qhYh&WPYIt{RQ8i1YM1am7wNNFbgWstn3 zr{_O$=3qrzexqzKz=unhH1;W4(T|ZqG3AEWJAT-q^zUNuydCnq52pa~( z7#HEj0&7i+qdkk8ql!2tEJUNID4+dd$B z@Aa#Flmi;5k9l^+0>npETofqzsdf3ZEzqxwqhAq%2AIT@0eJ`zFI%YWwU_pr0Bjk| zfyVUX!EI)BCLJ8mz!vI-hU(&hCbmT%G~WpPfjM@T%3OxB)4+L~NGk%67ZA{N<7EUE z#6zV6vG{!cu+k$MOp^c^H!j$rt6n_Tl)YMINROPio(*rkr{4OWi4^$5 z2zsdrbgj7)R^umF65LR8cdF+8pBe%SaX=vJ`gd-UHs$5H+7iuLR8ejBaIGA3U7}ZQ zq;}m4`?_?N?980H0MRWg3LW==7s+CC@~Y^cy~sB&#! zOe5FkG}JdVRGncWy{vzyiF$%zv`OI|VU1lmjXe#Gy;F^Se;Nk_n})QTMqHc5=wVG0 zIZdA$nm$i8efiTw6MXko``x_jyP-4ih)pKyhwLIO+)okFDER)T_WLc@_d8+lcXJrW z2tO>mGvft`3j1AG@0QHujlP%_N`)M71Cb@p6w1!ibf_k?b6NdRm8PzlmRB7W^uj!r zUH@rAv(P~jCYNuffSbcD5gSq~BxEX!%yud~EvA#$qtc=tQhPd1v$P6(N)wy@qV!*{)UvOKJ({>5LHdS_v!iuhtiF+2w&5rtt~%f;1M(+8?c15Bb|q?-`X=X6U(@ zDrUAUE;pYNdSthfCNGqM>+QJuqT`u)`okA`zB(NZA&I=X9RcwgMRi$pL!C^Kwv3?0 z_P_(}>#sXcb$8zDZDVX-cj`{>cGs}+&Xk+)jJ9k$;npthmgN|Ch9KMRfb2=?wv4%( zYLVL=lA9R!q3ikG)K{zN(?=9ZC)Y&Srv z`=TjFlsu7z54#$uej03tWP`lM6tmjyd^hbyZgYalM>D+5UKOke-Cgz>TZsI4WX5EI z0l8EIg&qKP)Y=>QKUl4P%%ebr2|#{8|M4&g_;m(Rr}xGQ&zP5eyBbXTc%XzW#HI{p zV+)b6&2=68P{csz05aBq!STg&$IfuIf1}81C5BUc@0t({_6b4~N*e7NL>S~qI z9@m9DJj7BFZZrV)#eDQak8WFFehIti9#oopYl`WK}t-9WS~w> zzcBe+dKpki5t96S)E>>i13=Sa>_ZR~C%$f%ph;hU2EJ%3w~|AhS(W z*fpTeCd8)Hj2;eM9MHnE z$Ymepg)MQ(0dkPR))LRLn@GzCK)|an=rb;&7bb?RrpFSd5z{YaN{r4886A-so80|V z00DXEQUP2+KOVwP!RPxtlWB&q6ChH&bER@<>C&&ViI=K+IP`JF!TUw2)XzO|sHEqd zBNm90fO6s>QcFxawu=2$6N5g9!>mB3mI=(UuN?U5Gg^;@(7@O8;N&#P(>Nd>9x>gM z>xTt~^L&z^mSS;pA}m1qa?v8sbxGfM4kwbm!0$M?8|2eHZC%yjMQBKhG4PEeWPS%_ zGVsDX56DHx6MVPe_AUrlI&!icg2H=($_sqRC9ey?+Rt8ze*-_FT{53`JFVz}d3H^J zT3Ow(1j_%W)A_CR9Y^XwKln9A7Gub%jHyR+9=HT~L;7sQ2o(P9n8O$J{|Pxg9pip!#>tlch zgsH{*l|Cc%0wKLH0SZv&0<$uk$yO=He!YJI^~LhFpDLHV1aMG|L!=WL#7Fzg;>xTG zkdYv)TI0%j@zpjMmm{x>dLLJWXA;iZ*59I5XyPHZWjF&YFk~O)N9{Mo%{byA%X>&O z#dSd+Xi6SR~z4A48wTFg$0kge{Ji&IQC=#Y}mr}+d(p|5FJQ-~8~gW7TUxQaZNfATs}moO8g1GEe$2<@ghP)`d)d#&phT^BxC6zFZ1qnVsq(jF+Rd3H z3ZK3Y;XgZXmLh4DXOwkz!6IGm!aEYb%3Nc}S@$n(S@uiTd8hBuAp#D|0|{q6{zZg7 z9-nXKc>bS>P^h5Os!PS+MChqkR!{#$g!&6Odfhpj$mI2t4i$3Q#I;1RikRfO$htNp z2CLS@N}BJ^RxC73=4p&D(XXddztiMA|%C@MWNI( z0~Wc$O#@c-dBswsHblv2zm(6|h||VM>6u-rS-COqk*(4pqq8@Vj0`Uf-y5qbnswbh49R@oY&j8*?hgo;F|o;5#S^baD`-b&pu5N*2& zQ5$)yl|OG~Z}U$g)Y17;l$z7IXN85Fc7E+@&KH6fs+})|Lr=L}j*)!(HxYX7TE?}v z=WhH>ggz^Jd*16!`zcqSnuUK5p>F=2k~M!3q3RbHL*+FW{y~H;71dk}+xVLZU8uPf ze)JC_v=$eMGSQgLNMQgjHHl|6t}uwuhnM3qcUZ1IU=X2KAE(w&Tz;DQv)28QjXaZk zq$FeDcmMLpAY}OLv0tts*f(7uxt28-Bd!=e@hqrM{%|xk~1Dj(4G{ zLjA2_oA+an#6vxvralA$Ta?=s-ej#8vQ`)&B5WB%=w-P{3J`f`W|A2Zix8S`_k#b~ ziD2udG0i-CcF~!}XcomH$L2LpQ<4Nl!5^uYyDqX<&@QEI-E<5G?FLKF!w* z*Hvsercr@7F;8WDa4`_F7}4W-t7vqTL*kIeKy0|$2uGU`_EU-=c6R`{n_zeVg(y+m7j+48HHv;C&U}jkvMtL$h**vk zb;)P7()cP7Q43^2E0bPx3A32g5M_DIS0rT`FRf#OzW zvHGflwj^niD4V&rr(?tUvA1K@Z=&RSoK##tF}7gVwEOtpK9fFi%B$u*)E6J6?e>*N zUAD<8-9N3tZSmB2UH@rhKvI$B%KF3l(e2ThvMGf%U-gEkzvP3O1;4DO{Ju1&woy8e zbMbCTMpI3|M%a|prR^d0OFydLJl@Q?6ttG{-r(m(_$W6HxDiW*o*E~zTZ#`Rdpe<_ z@gzx|%goLbExdV-C5)sd?T>Su5ftzCP5d7?HeTVWnP`uA8i~=($I;mu zo^u5Tw_+3tj`oabJDa7(z`~1(muQ$*B zW@O7rsW@0Pc@96WAM9mOdv)zl!|Hv#FEQtKsfhZ6wu24%Ow#->%c?6ResL6q$@=5C8nEB4N!bliWa>nN+ zN&CHvw`l>95MXL*6&3~ifmDyjf(PiP{N|hRr}WR?w6#bI3!H)Ro1e=_6I9*S1R%#2 z2Evaw&^m2LLM~T)bB_5F+-3{rrBMGxgiddS!|&3dNkP0LSft@>C{T_}+zeR+eU7iM zRvR!xO5{fu0qWR2cXw)o^0cqu^{3%_p+gz;FI&(0!x0s%z)6(yqeEt zN+qB_OGl-j@naSMfFuu2SoQN>(hfAe_cQJN-38u@(j^LJ(ob=dqOWJ+{1nJm0OkFK zw;O1QVC-aj7IBlMnWMv0@0L;j-JP15!?2*{U(W072JQev5xy0vq|D6Wjzbw6Nmm3A zX3C1TRIp!z-$NXzJCEKs^~BmLMzEB{>EUZZ2Vf+PU>*!kvv?t*@j_jr5X{v)=|bgD zZ5}$qRG`7MJPeVnEszN=#!MWuL4cSyi61>8geU};Aw-{G^X~IFBkktjDnK|Mz{%G_ zJ){3Z&Swh17JMo)HZuJKo#6X{fWa5WZ#Ii~Ct-}LB)s+DxCn7PK&9b9l4Y`@6vIS5IfYbI_AXh%&~VX}V7Cl`VO#V+Ypan;O#<6Y zNo{7{rP$X>#t!eGlsITvo3Rm7Be~56(r(MuZYPVhm{%Oi0m^SiI936T+uA|~+N^pT zxQx`!R<*mfwY#;okD*%zUjgI!z|OsG@L&L^qRF{JV?7ABy_@3DALB?whyLAmCW?&e#12NHI zy=tPf*8u`I2GEglcSf|irDM+`bObVE6lxoS;yW!1<6vDztnP%nI&t?uo3fX89qnsJ za4|8i()5aWmKG6015pjlqDHhsa^bOV-Ij%BkGi@Zu97o*-@GpXCOqd%M0Yian_)3s zk3To$78N(<{h+wk}iPQ4Su_j-p;RMsh zxvmI;R)rB!zKj%|3qLCc$)+&7xbZ(T0vhdiHC(kwAb)r_*YO;g@}f{dl4Q~tW>Plt zq3obNztKF>i1BeZvVF^hRaGI0#q3WZp*jx$dU~g}KU@z{#_?x>Wm&@5Q5c;5ULhG3Cg(M%S zv-S3vzhn|#ZG2FCJdic%)-`9U{dmwq;+-_-cah_v_Y${r#zPYH!srXm^VoNH)0~&S zj}s-?23nm7Q0Gzci74*GI&Bxy;b_aSMRbviAHUiYjp_%Z6QH_@ysn7^=((fiiQL+1 zvf3nYZz5BA^3k=)LvoJ8tDIA>+SR-#v*nU9u2tEps8p@U=WI{vk<^O#s~>Zp&pw^=5(r|t*yo-@h`MQU(zxgXmHiqMAm8Z^h@)G}bxd z6P4ELG#3a45W!vx!0ZCwyH8I~GmYQFh+{y5XyNZ+k)M-62H1!wglIe^5wlFh1cN$1 zy;sLZFa-ld$|7QD(`!-4nfCl+WWak&jvXR`*&{Ln0TS&ZO4kE~yNdBSI_xw6t40J` zHC9OM^^3VLhqsX%hj8gwfH+zhTc%-STPJ%r;#3(3Lm`MtvrE?!j%7xiiUo1h5^gES zY7PJ-@L>6`GpJ&gqcl?Y$+uDzfa+OIB&ODwMnJldth*TN)UhYX1c?a*Ryx8sI9duT zj^3HA*_;WNj$k57*-VI;@50l55d#e_*^1F23?J_p-?KarDADY=6n$2f=K;nyk{Jy; zs3eF|VpnE1fgQ>70vJEUU+1VibdFL7hJAXr3nswldb|3Lrtk?`XLaUH;quziWL!^Z*TwZ6=9}rFm zj(Bn9N}70tx->{6({TL{+yW2!00N1-fMul?eb(d7@_|^&uA1%~^OahvN0X2q^HNm= zfBB_5^thtu5hnl&S>#g2_tim{-2kDjDESc3Ew`Kb367-+E{2yQg<&;sray zxSp|3hF-28=&`l;+~`v)pL+b=ise2SpIZuI!6;?)XlrqWAzmC@%7Mb+zN_gq#JH#X||SKM8Hit{(E z&pgar3)u}QrUKObJtJ2v^8@+M&U zQzOZl{HiGs)Z#2o{4B@?lB|R5MF-BAY%X?jrxEgdLxY}703(Wu#0|WqiJog5Ppo_h z(qVzkx=*Cxp!F{s%zNkg3jk6!SP2D?K$zFW#p}rcZAFUB@t0|RG~sL?T*Q=eg9j#6 zrxa_h0HU1+ZXEes6`-BCIxQAU7CVg)XvK+PekX8+Tbr>$N0YA{j6uO>HHZQ#F(Mlnxs8 z0cT1V(~rJVOC}r!leJB-G*`*NEw>gTs3#G18I4v?2`6j}z=$Fk8m7K09D02rTB z`00M~6x{1ftSAnUqz$68kr6EeEHp%ltiEQ16Z~_-wcqS}2LiqeT~^*GjXM*?*ZE?H z@lFCw8v`J`_*-R4%l?7b{=>5Ei`4!2uuaztwCAy(qff|d2evi5JA3Mlg)x zgw3uCEo?o7iF1`mgq;{7TEoO6 z&B?*qE)kMjczOi_(zeZ}lwezm^Q;Y99KdV)fdrFViYG62zrUXX4`y6VVCbjz<%O4F`K!u|H&_A{fb;M8pF9mS>o)PIQ3 z8-|r8iZ?gb4wP3%i*zqE`B90`@e1oR3uw=eKc?%gH=hL@{TmUwex$xd?*2C-bZIcF z_>0b==Jx7`7xtVNc@9|VEYqj1Zk%ZEZ~co1)j8Z8u51Y0r05>+pHb(WGFqmEu|&4I zqEadPxPK9$JYi&C#%c+{e-WW}a{a7AqFx20Nd0wop_qS&P{}J?!jHsq!-{TU0_-3N z+d9>BaU&bNaDwVg*rFXpWT90gN%wFyHBp~VQ#8fcgrg+IT)Iv4u9?!oUn2B-NxGv; z_?1K_zc#TfRl84riO}#5S(kIe#dFg#a>Snm(6yC52_Dq^W*PJ$Tp|zQu4s{W|M0-u zqSy^6Ss10%4;6}*ZZFG;tRqp0P{N9jSgOk%-_#6L9F+()Fpd)pgxAN4{%?rTcA45& zhletCBsy)`m$mZ3{k#v77o-~A3)2ju9+>@~h|rGp_9OYuUj%KqJ=RhBhX@^%s_ayHC)e?p2z{rc{9g6*J!R^YKa~j8 zJvycmq4c^cV^ktk<%78ll?b)e{!4_O)m5EvbiJ=SiG0%cVe(XT+HOiM>Y3`ND^K1# z_$wtO*iBu!8NhCJO;Bv_)2+|djsA*b>#DQ&_D*&k)z_bWASCYexKs^pi`Hz-yS&|>`24(Gi=oXG%H7RQdVSp;;hzs)tqxquySM&yQ{eD- zk80rEo#iKi!C(4hYVUtvfBohD`l6t|{_*-Zcm2op+HU25A%r03%@%||p4d`DUpwX8_~xcA#s zb3&&#L8H;~EIYb>V68OB2AzOR_o-PO?Uf@M5?)&@QlXN9< z`&NK#zz2wU6$b3+W58Oa@y^%oqsgOL90%`j2pl0K-s51d;Qjl3E*q;j&v)u_4<1r| zjtJ9NAgEMIjf6i~&HZ!?L&=gO9)<<$UI&1LqQOSTdf^%IN45ukj@ zc!}eAk?8br zIF|EDj|7|w;7P=50eCq08OXK;w%C|kmgoQ zK1HV7!1mH%k|Y|HR#-P5Md}CFHGeF!!3d`<`rjG(>qj+6WAs9QtK=k$Z)if^B8_5Gh8YN$dwvrHC0KlMN>^qp=tdOyp(!9gF-@AJ8 zPrFnxwJ@%rKv<((X4ORf0jCl(sf|$}>;A@jw@#8U4qhxE#$|(-<;Vm!OzsHQ0DsCt zhr||?_J#fiKeczG-D{uQa38GYU7!^>hn73f1%f485=8x*;T$MT(T6Heai1_oYa;Pl z&HdCcumPA;QZD8;V&iXl{Xu@3J4NzIl$Np^YF|E>Vx))X<_P-)MBGN zt%<>Rl-DgV7Xs)<^93Ouh|(7|tLo-OZhC8Az)&F))A?uSl2{^2b05geCksb9;lSwC zUgccupS-<;H`1qC)2>K5Q52>SD}wAv8oGAKLigXgojLmSv1_;aweCh1_$Yq4Yp?56cPrw|F>syYSt6r1 zmY8&pPF~+n*uSeGkNITjX7J%&Mb}PB^vT+3(vjuou02f}$`&l(cquFWVC1#Nj%ogh z>Dkvuj5MeFU;QcDr)ejf`VGfF1+DQPFLXox0}(2Y?Up@vb^Gh{p&ki1h`*nn=6@hU z;hyyT@NNmpRz7&xTxyiW%Rm4%{|6%U!yu{?$lv>sRw=I7tDDI){`$0$xc?xt5*-VN z#~VnYr3M{RelRbdNyhxcZc371IMdQliajy-(L zzH%se_Bh#qgHuEaOb1mSJnqTj2AjMI)puilp*9IY495EDPd&o>z!PXRP8S>*p0V3dM)}PO6Idp~YSR5sI?GImMZI zg*dy_5+U&OB1OGo2aRGi6Hh4tPgPF@-TKJPel(k&r@C~MqYkE|8iLRPYL$v0?-#=! z6>Cghmg5mdEf?z;L_2N+z;zJtHd<$Qv1oN(l!6fYU35IlbbWk5g2&66iv&jlfbjs6 ztD+`I03;smZ|=1%G!if>#7{{)T=Oug?uET#aoLSlH0L@ig0 z&P882_du-S7|$FDx$qs3chbWai8k}c87uToWsA97#kmwwAnfNL*kIg+HcP2060-v? zPPJE*0S}GDx%vS*p7#oRp~12%g2!kxv?IKL)mbU(tP<|(b#ZUM(zEX3FXFoqPDF%1 zM+hS@-v&hM2DoO4VKO5&&ia|0-55GLh0F?1fGqc!KaJ@@S9$1Rdc)=epf;mEt$!kM3@A3iv)6qBuccL1{79*< z$b0ZJe<(NSBqF|Vk_U@s(!uanQN_T>HFrfZ+j7}mX0C<{v92Q<{ zeHQrOlL*AxHC7E=#_yl;dA&liKo=B-7YismkcO48z*KM(G~*e()GCi&NI^6rE!su)BM*7g# z{`2TS^Di{0)r2VYHG`>JAN&vug#KOX6hCHT@H2CADf{f_uyD{8U2T<`{I%drCNH9A zsZqCDuX4a7G9CxrFJ0^F1*rfK>9q%Wfd^_t5Ipf&NK!R!VI7 zQ8R>Ahk7I`F55}+(>*A1d z2%?YS(iW5c3{PPs3Iz>x#y6Hn^6nD{+DOj*7kR_#=xTfU7=U4+!3YM-%5daWua{X2 z`P})6JTG4I)CM1=2H$gg%k%an--sgr)USt)FL__X?oTTU?!6Q|RYb|y3gp8Dn3bNe z)eG6fgeB^8WR*k=W2j1Kwo$!k3{>nweWsg|`0Z%%z#ADM^%Aa7$(Y}1@k&x>qowk1 zq?Xi6Tfbp#u78RXl70J@WmxHnLZRGi*z=_uxjuu~UpH>y;>waO7&#g!R2)=EqCx4* zp9;RSRB=?H1=bjeQoYcidP!N$yFo2bS^bjoDIHif;(wTGm_H4PYal23xyHVrd^(8 zht!sbcq0);trlE(>Isu)2Mu-LIa^1=k+$!3H>WxwOn4b!5&6*r80>d4@p%Q!^|Lh< zb`TQ5YN!}4e!usIno%(Sh1J}RRBz3+YfsXO{WL7sS!|ZoZavA&YD>ErZsD(@1zC2&6;>F?S%a)3k_R7~h79Cyb397zdvUM9)Waa|ScpS=sPb5LMnu4~ z`2ANM!>P+KkDYf%#}@gbiq}WwkoWC*U#aMc4$8bT$P(ce7VS5@-|-mX@>y8PMc0zq zYV>Gy^5*@qkHyx3O~a2*ERwoe{V8QrTcV8idCcOAI{xF#qioBacxII3OxCt?C+5Kh zz+%)7e$4L1gu&ipbeUKNSzkb`PJYSS7K8u`@}(_W@feLMwly@3=pl8j{@U1->B94% zq92QwLfG5@v}nnS%-oC(Aaom-%ulFO9HLG^v8CYPt&ZOxZu9by1k>#e_t9-0Ia`9Q zYiYQe=jH2n2_Aa*ymdWu@TvYPaVy^lv7KGqvL6&km>c#rL}Q?$Btaeh?YoWJEmaxF zZs^)I!$uNLYvQNjrhXL=whs_9dw5{lxb2Fk3CSSchoFs|{v=^B(tPrf=c6Go9w z(qI}(9hU_}7TDe^z!unKP6NPWN8Lk0SP|i{WBcQ|@?1 zwdqSya+A|Tu@qe@5o&m4@{{+x1qYP~b+noBd-*=J^jg#Ur0dt#lk>B|`gB>dH^-j6 zn+^GN5;_+;pKzh-_HuRBCmEBM7rx$q!?R5H063hcZ42(@xv&Tzi|4-x9TlH*(Rmk1qp{`M?I0}~%#++N@$ahWJ4ro>R!o02sgU~xD|_b=wyP?a%`F4y-sSR;uBx?g4_~~cEb?{exyG2Y%ni@pr|uTt zv@cUn?2XFVTaDgDOU{TpU()hpl|BkqA#CtW=>;^Zs~9Q~8YQ1z@KECgMg5f*R521? z#NM=Ote9(?a6P@4f5*r44K_MvH?71u_pK0hW(`%9{#@?X_p=^6_Bq4prK-2SCo$QM z+z=qptJPr`aXb!%Oc`aysy}Q~avh$FPrPvJ_cbrfeQw2uhj7u69AD--R$tGkytwn@ z0*Pm`>U(Um=3CDx*5!)=$@Yo(pZm88x?>e!6&L!3`!EwMqmKEt<@WNCwdH z{~|EBk@-3MiS+kx$;LlGfXI<#7=Jm5p7@8rqm$XdBn-TYM$Dw#%M{5@FsHZq3~J48 zZm6EK^YNf}&F>GDE4QpR@xSIewQ=6<<<7dlab@Ogk(x-)E4e^Q%44~&lxB%WTMJEId1kWxHX*P6lrhTxc!3NHBnZ*4k8p7^uA;EVR8#Dqt48B%_Ph3{o`D;;hcgYJ=m zoUPQTq=5%wRoGdk+ayF{-GgOU4|e_4?sd7^Xj;C@zdW;>7Xn^do;&B6ShC;RzM~i` z*y$-GvD(LTwdQ6(JQh^h(yub0cuyPTc|g&4YuJ1v{Q9g1*E^>HldCtfZvI|cjqdH5 zeWnyq`*dY0U7wWz4R&hw5gI#`N>xplg))FQPIz?;kS7<>?w+ z64-Mh*{u92KAQDVr{@{w6WBr|k4Ds$WTRBbAWolAtYZFjM{M+V`EAx2KKMM`JV+H8 zOJ3%F?cA6t5ab*(>wBh`aeOWS$mqZ2>oJ1r-D0QyqMogd9usLFX7{32&~OVCqe)z8 zW7BJYtcOM#aZVSbjbu&CMZYb8Q_7A_g0y{q%$sVr|i9!^@ zUv3OEcRb?=y4`*5aUIa)>Qv?=`g{(GZRZal;t)RQUEN)?87=J*c zjp@@RxU_-zhl1}3$+(FcJrIJ9;QI4 zlAMBn^5}&iOj8V?c;h+j=%eq++c9Q$g!SEH!EpBGiL(NsZDx2Qe(r8w=&xu^AHo^P zOM^FaWTF-#FNHg{ zkk!3aw)<7`h7zCWFKRQQ=pgDAua^OX@>U~i$R=7}_RDwA+pk<^Z64tQBc+Ytpf9Gs zAT3#*%xZ5>u#{h5b*FAxgH~OZ8-Pgt<3e~#Qnxr=rQr3WCHj&ryKlEFgU+Zv6H!AM zO7sz<-m#WIy;gne#DrpbhR8=t;<4QW@1rOdk%jYD3XCQ%t{aR6ig(t ziW=x!%-6!Z;aWmWqVH(+gy`;U2p6Euf`(!6d7+ZP-OwWX#y|nB!0*jxeyc6e5Z*IL zV;F?b)CyQZXEp^}0c>4>1|KqWQ6hAZNTwsuOIx3YjmoazkZXw|21Hma5uS{qGx1=W z9cGOyKoQ6YK;gF;6l*j}WR`fzO^!AbixekqFa%2Ypy!9YehDNU=?T}i0}xsp^S|SM zP_S(M)lhkb@sLq^vt*h_IX9l*8oKLFNtgvTNMhV>}gIR!(-7@-k&vH0esU6c{eyjmsax}umngXlf# zHF6nZ7*h-|WWOac4`7GAIgzitPQN5REzh+vT;E=r>EN)XrDqrn3D;UxO=XQ~Ga zScgaG-NsI+dK^&b2i$;98^f^ja;jfe=3*-6lQm(d8ak~N=Ar;3v>Udz&P+|yDnWDe z2k*w#*BcbTXK_fjU(Az4m>Ga}7mZv&uTz)dkjkQQLnO2(S?Pm_4~jvnk70<67{vW@ zOGa>bu)o2HPADyzkeK*45e^LuLs*6%zeLb~&~xhBw^vDtdJ6W4SLIQ6UHW;_fRjCuIgjTkBS;y zSK`kK`Ds5?Q|E?W0R8lKvhK%^^7sbW`d=c)(U93T#Ehd^Lk!IujXpLQ{!%h>3^A4q={>h??7`M=lMZukGzmx- zzAtBTOU1-{+%Rz4R6oS%c8HmIqbUuWSxSgORJvKtI3^+8Bu&MFKE(V8_ej!mdxs zE-pIL;jxrwDso8QJNlK{xrEv{INP6hadNqc_3-e#>~;CdRiA6u z{ewdT{sA9v-oA79-rWZeA4EpS#3v?aWaZ`+6qUXxuc&@mUEkK!-qZfNkJ!`S`*yIm zf4F<_Q}^)KH>2}IA7@8COpT0<4}Y8<{`l!XZ~y+v#Fz2O*{PYi&vWEC^3vS=@|T4b z^5VBIi{CyjtPd>hj;!oYf8YD^V|RJ&&yS5?R9A6heRFg3uc)}ayZ6s+pUNUqUBttq zM$>%#=J6cc_)k^s5c2^7{_N`Uowy;`Jcr`aU-ajE8Xls!;6vpf5gVdva$ap zHa@dxs+cHN5cuG=YU2^{NEO9)FWDff?~%aGzhYzc=a!&Fs@S+EHr$S?{W15h<=@1{ za~cZ9)yi$c?$dR^UK*cY7XK0(vz6bzstiZZj}#a_{+HNz$~5Irr4Yr)B`EaS>~q^+ zvGL~5FP5ndSI3DF^nzBMt-)m#j25xMFQe&UaL%%9r{Fi9lMrst_-T!K!eg>B#qa5t z*>+3~gWG2XZ7ja`u|mP0JnO$=W7BxM`J~& zZ642Q->GgxW*bPvWf(@>gArA~hc#sJGxIR~5pWx8Os_VMdZ5rJxfrifQ6hL1v{JU1 zsIwdE!pL{kG=R2zK6byk3jjd*P6QqluQZ4* zdMphf(Vtfv^nsk|1OSSeJA;J4vYpsx&r`)Md?8Ov`XkJWhCXdZ%!D?ycMmxY0 zLZs6#AZ>JRPhQ)6wUhg+hmJ1$@#bp)Om@qr_PfGgv9W5a+hMK%=gsg}Y6vQN_j>1`LnlU$Id!YhGzsXK(Evu`wh_oB7|xMl|R9 ze-|5H{0y0J@?K|yxZGafnZjIT+@1D%Y`Oc%M!luDgA;~<8rpCPWZ~x+XB-oc`+Lj zt3_GY+wDv8YwkQOuiZHOsoTVKv{pJ`b+lgeIq_&C;`{K?X37!M@zw=e>*HS!d6SNR zTS|=_{|V4$KG`-jw?5es+AF@VZxk?cVmEpD3`Kw5b@^m}_1o&n9=dvD9Q6IIpySVP zdrJ=-cHY%K4F1^=czR+X^_7xr`g;8Ug0mjDWXq;Ogt|X}NMVITa)i+^P%Umo8wGw+ zk0}fpC7{k>Ps5ZjbkSRpFK-S)S;`E+0?QGS@$>Yi`$@=Ln`nt%EaV!zr)1kEg2LTf zh`0~O@TdjGqQ->~5l%*&sdbOmt`$KZx3WqLD@JQmV=%(tZyuuNq1vtU?69)l(>6pL z=Bejt5Vj9#k@8rLub3tfogx>?Ld({M=USG0O?RFp;p;VF-h9b721O}J9KDzM=fm`j zXRwdSh9#8avOamG4|gMui-kr25S}d}4wqg6=6@6^occSq=$xP!ce%OvO08hdQ%~NQ zBBEgF?>i-HU!`or&;F`L;xp5+vaSQ&YF#h04&N>Bh7O$dvfIqEsw!dm%sG?~xDhkV zc1eFLJJ;^|N9bIyxZU}j_kB%?2`ps<>%IcQ!(JkTo`)f`!zd2c3!p!tC`T}fjsoCh zECWoZhZzgNLp2I$(6QjXuu&WoUQ)=oU$VOZh~&^H07{SIxj#5r1^6YU53;?m?f+!k z`|OY4_jr`{9IbWU8UTg}SOpV^y6cYkJjE+O2D5A^Pj6!(Q$Iz*CX49xw=WQ7sTPaa{-TO%&=tSX68IpU+TL9QL z_HN54M!!7Sc{L%qK5O=J@WYl*(%T~qa&wOur^&is)NlzcINyOzbr;X;XW)7yIa@sa zNA_6K-PVNF8#&+f%H`{`MJ{e`*94S7^&Cc*>nZ_+U@A61 zzq_gKa}@PbQ{#$zDO3IBc^~TaNo$ddR7iJ5y}fr^n(+f*4jAb8>{J8HBu_WiSFzX3 zI8lA!A&l{1d6Of?au^n6w+jMKz4a^JLs!SVp}m)Vcd?F@<2C?)Rm zTNA5(2Z9gPs-B&=tb9vwM#WeS=Flf}$!z@r>TyXI9fW_YE7}*d5U4?ij@t0meQHdI zQVO9FUgZS07dEn+F>9Upny{W3i)Cu4eA(htYQ|k8O9V2x6Bji0AjN1z4@=ktPL;lQ z%%QZK{RRO4_($70W-^|u9t-CD%r%zah@sZ{A|J-$X&4hoEL#>d{BHh}jS)LmP}9{+8Xh`x;mpJ#0^!?YS}b(Q>Hs z{vZ8%n+X5gci(B*1nFKRf^j!yZ|RK|*>&XwsDy_+u;ah9I zuYO{gwSRTV@76!z5B1XTn3)>hZSFW(4@&Bo{bse-{`q7hY^3AM-tb=6(a9!`xswdD z-tXq6Y{go4E^v9~;k5B`)M-GPXK2Vrqc(rP3efZ%CWxLG! z)sG7!hm#$Yow}q~Yu?sJGoLBD&8NrjgGP?N98va&%w1bC*2fFHr~CcPuQmcQk5{N- z<7iSBRct)@;i{kbZlr6sg;J}^5%jR_%Rgcx<@b}*<5jBISQs7ke-s;?aMZku|1LJd zS|9vR#YTaBJc^6(KM@=E2?|^hO8-S{oQ}}@eeenSpF+RDyg#!2z*Oj@3T#(_xQiM4;4$SVfdW&G_T{{jB4wv6I=D%kG!|`YVvh_7Q0BNk7Dc0omQYuK z?#0r0j9F{EwM7?zAT3E;1Dv1jX^?fsx)YbURg%Bl4Ddxkv;aVzx`6!iVAuMvCK=a`HO(`sB`_J}?7^3snw6u~?Fp})> z)dbAjlpw3%sf|fTf6BnL1$AZ8Ad@etWu%LggG{E&|#qhfsoUJ?0exkwzhuy zs#%dzULV7kj7?E53_(I=k!_XkG z3VIl*Ea1F1(VvkBG9zc3+@{w>0GWcoem2i`+E^VB-~=(C=BU?+^HTs%k+4>gs7sOf zog&HHBI))b*_k5w!y*NqVkNC&p0N9BcZxM~i?!N|b$;9vnJGr|lo)807`c?_(iNEG zmRPixoSP}JsUzF8n5IN8>rO!}Gi0&z)S@-KfzIJX|h6GA{F!+S!((2Xwt` zXzUO)*AGjBcwXGldJ*FCBJ|FSu-q4S+F#t8dGX-z1&*hTpjAeRbSaCzQx=PtXjHv66 zD{SO^D;@D&@_Fu{!6hvoVq~?AZM9;n!55y=W)({{6--ZV9Dj)3Tcf!7)f#+bwbXR= z;>`0!KjXm2n)4xX+Kn~UW`;XGHP_h^)xz`}%PPM3nb95906J=ud@TQDCv6np)9OYWMmd|FWnfnVAWgf_Wd?jI&c-ifPxgoQ+R_M=(9E{LCdN zn+(=V29u%jQ(h*$@cQA3su|@#t|+iJ{dE;`vdGViAo_;#)(G3XFTYNv)JMgeZGmlE z8xB^h3|*^EP&b)J!NGN`EdU4tn_>C0vEHdl%gjyUXHfefR1=W#tiN`Kr-7Ni-sqjH zPC-`13PArtT&CAc^;Rl26Rgw7sty1?cCJh;1=rtdISHc25JBp&9An-P=mZF((DoC0 zUB%co`v{<)UHZdvBu4bj5c@r!Yq z&6kfZQzpH{TfKVa*_M&r72h*$KV3OdurWC(#{_x5)23;-mEB?PP~aP(HPq8N2xb}W z5#xsF2Ni5V>{X&OO|QCkmV^9z&r{rF5gO>c$nb!$WBY5eh`Sv9GPl9!N^>96W<@^- zA33^c0?r%n*xO|GG37?Qc|z2!s_eXyr#serdkCbDdh${V;#>Dtmt^&j5BxF`yf?wz zBGq43HHaY&>K49s`@{;30~=l`1PNv8Z3UPWyw>FgL;SK-%ip>84Llm^)8HO#m(DwW zMZ^cVx=$<1zFdo(!8@})a8gnavo| z5lkG(+bz^3fn~7Z;81(bElU3>*++=q9WpgAG8kciDpafk>k}Io3o?`>y2@w4is+m# zeW2;eS7#LL;rwT>Qk|8KS8530RP)D0UWgv!_|GMK&AT7Tq2MvG5tMA9L8%uKH3VYm zIztA}Tmw(-jwsGWTpoSTDF)o4bv{jo{_(Qm|54c`~&5Q}rii+pYXYxz7UQpULK*oA|3{L}tI5&sw+7 z4$aLDpUh6g%)X_R&yHT4o4h|a{cNs6Vy;hWcIIS`%>QL!ZWctEtM>guoMT;0$f?Qw zf)=VQ`*CGsowbTCuSn~wjz>k<$+OJ3@;~p(^Q4Qe&6Fm(kf9IA@H{eI7n$J;nTbM1 z2+Rl5l^-R1<#;g9l{e4RHP82DUVt)B6%~c`7DU|_#2+k3<}FBfEy#XZkf$st2rMe; zEvmRLsy$fL$XnFvTGaWnD45;yX8rl^AB!6Br6Su}qX!WyT1(DaP1NbCZ8{#+qb04d z8quGRKl0S?hSfQ^N9+&QSwC5}uUWpBR|P(*XO+1V_PN%|eMNN|pgCH9KXzH^>^Gox ztbcjHxs4Ud87J$IHX{##mQ$W4^NSYuHX>vSK<@Vv52X`db~N$!f>p8SYc7I+-(S^| z%u4M@d6vDBm=`;gOQS=)#{ceJc1^?;95^^W-Ch*RIcu#M1f`_W&~pR5&i)KR{@jCi zGLZq@ylkW$z)9#2Dh1Zz^RDJfk79DZ497QZTCk3S&DaV^3jukr=K$aXgU%7>CsI^L zKlIi_pb-J8Azs=ZP+indj}8GCBhVCu___j^`)r?du1D@}j~|)!8V;O#mPSrtbY4E9 zlrNie&8_90c~F%V`0MDGV`la54p;8=0Roz@+@(+E-%@VfI@)o9<$I#*uF*lSJe2Fd z_LQ<^WPDj7`WL2kt7+L4cBxaX4m>IUyMBmO!{)cm%1}EWB&+7PZvSsz8?ZD0V#R+& z1O4fV$)Dw?-Qpu7JwN{#_5YT6#aH>sKL5FwMc^NeS}WN(KbzOTX>~tv-U`sJ8BRXphv8rRmwxOL;Eb5J07Sfqd06;o33@USfZu)_L| zZTq+WxTSQSr9Qc%AFGEWen*F9M}7Ry`D%`)%S!#F=ezZfdoLaLJv{EuKOQ_Y&*pAu zOPTpvOE(Lkl%Ixw<*fPot9pLt zT(#Mrshj3(+^Quo)-8GKJ#u?+Dx7@^7_%-QQpH9_6^**D7y=CokJmn8!6=Sh&i#KY zHrlV8%T*2dM{FFlJ00Gs@Q0n=k_nL zF-Ac5Ae!!}cW6RHWYjl;{|y}?(91NE(+iSY2*kjWd6{n1X&#>G2a|W!|B8*LlrIvo zXJHD|XbDl9Hb$$0a-g(B5Fi>ZZU6!aTxVH@)6&p&;|1y3#bV$U`;QnnMfXP~DON^` z#_SioUcO0{mQ*m|rizUONEB`!t|&Q(iQ@0*5P~Wn&d(c05PVSZD6M!*4D$62MGL7H zB~-By9Fbx|6&r78^49jiVL}lzq_+=N47&>i@_KDR(s2-$L78tQlm;v9&EAjCWjmG{ zthryOKhlm1Qn-m?#ux=gNiQG_2zy<~h$z}WCI5(xnL+NdpJ@A{9}82owM{?bELCWmYtUPGEO27?hi&x27+6idUtX*`D~ zy(f(JdRYb|pVL0e@Wt0O>Qu4uO2q~2$g;z9R;+4hk@C|>M!3LvR73)=3s(+XF6HZ7?GNBfJZFR!ikf_{+ zE9FTyTg76}Xf3)cQ53<@>pKZ#=)O2I%(r30L_2_#dw#<=qA2gqj|%7Z8I+R$YM~1| zKpy@G9s&iy;0|>~MfDRVI>B!^^W)YRT8Rq~dGQ}GdREkFVB5evQ}SbFmqgySw!5iq z7b6C_+JWN_RN#+!P(El7pOeIAv%bK$y0_;%Zp=m|9M0=#GIuFlW>~ezz6@W~f$45z zFMrX!^Zmt(2U5+ttAt{eT+^CJ<=EAjyD!qH4M$^+$fi3xQ{JynlBYv?i&UHIt_zE# z|H08K>g-GG|H?RZWS0K`{(~904>Q7oC@lTWEa!$%`7*=sZe&|?N>cdS`Fu<-nMjB& z1aq#TDP5kO3#dRi6T{cv0+M<_yGR@jBn@;$!;oiTI9O06mMw9ygOF^a$tjD`2TbE% zq|`xNQNjlTFcK;?DC``Y**G<(l>HnI7BxJRD9R`)?>!Dl%BFZF&gjl)0Azv zOz-XTh>)RZ(VS8Y=7c@wp#Xyr=RF@jR(WQ^9UUt~F^7>(C>Dg?!h-?dpUQWQYGONM zxu!G*emqY}{dkj)R>R4Rj{`y&pj|-Vr}b^5e?{c;x^MmV?$qP(2Kw88!5TdS%ka^Z zB)&&nZ^O*p#jQ|&YtJ{x6w@{-L=2qu5tvW#LJEfNWqQ%^Q`Gl<3wwDqiavHxUr$rS z%*80{F3?-!ji%L&%#TmM8F_0>P{qdPkIyzEy>*r~t?x{J%-ier*4sH?#X>(uzkif( zaySoOnq`SNEhtq=gTH4jxsgk+ny7k&x6~H!dJO(?)wrw8Ix%#-Sdhlo%vj4VHFLZ~ zLe5wJWI*F>u!6|tY!Q}c;e4`cDlQ}2mkl|c4ak`BjH#zMcB#=p{pEUDNn<}ds@Pbn zHc?Iu*tVlD`j8<#9BlnKf>Rn9vsR9Q(a;D9njfg>2q;FXU-W#J>+|*u*UMZgddnn^ z0)8sQfo4_w9CzX+I(Fez7l{-@0>!ijZFRxQEA)!bBzqnSmISfyC|jP$!55WA^Y{mY9Hg8 zP`)T1zmx_Sd}DJHo1Be_ltHv~SZK=#BPU-)o$9J|bxU_tq7gR=0cYFGt!Fgn@cB9W zBXiF#s9&ye=yBsu&)b@u`@Z`1D8!%bMcCJblp8YLZc;|1*QYc=I2s)+=)bY|)SA+f2}eX1e~7*x2tBEYN0(>jv)9 zNICLIm@>Yi4ne{-=|tgzj5*OIOWzW|iL?+mgV)D4_4bY7li73vNCJNJf%D(Q28nOf z&s_K8s%c31jT*gy>q_%5y-my)w@3vy_Y%4Lfl+ccnF5lBU!pmuymwm%K9feZffSOb zQ$koGX1_WH*Fwv@)-gu?(yK1sreCzZmi*l#WzKbm+dqW-m1IZSTizvSkt00?=~jfu z1VG$d?B7ZlDte*mQXs%--e=zb;}e>I#g_hZ^^OTrw!?^}V7rZWqbRF@JAlw9hZ7Cd zHQCtzt|C7N8ErxuqzRD0Wq<^9@6OE($X`C|9nA$5`5|tQbFIslu(#2fpPTM?ZK!Xz zcW|4ZUq*9l>XUGIn>@d;E$`Mc+3w(qAT}-@2fMXxN;rB<&o5o|yLEW8eoMQ4viuv( z{X_q(<0I6C6?C1kPBSFcK%s?ImQx`WFx)9zhf)}i_KP}m#ZP}4#&r_(_k%bAZ^BX% z)(L1L248fXb|#8*Z=PQdv=hEbnqJt_EtWwMovLQ=eZtKx^u>sU4xbuiohX>f_Cf@Ttv#Q#fh;(?7tWuv!0jA^z;6MdTYiuyP@K;SSe@EQfVhxo4qE=0%*6&G z9u>oyZO6rsBus>25_RTOkz(iqr&viyAySh8ewAS)Bz}IQniAxIR5Cf44t{8WpA^9X z?dc=`L+L2`NRlpVIO2{G7!CL%!$$X9L@bIN%jteMF9XzbtaF@Iicd@S_n8DScF$wO z9^tlj>Kz~n_)#~ZtjI*qTo0@@H-kB_M}nvq%FrwGxK~!LS5B+i4UgP~s4^Zy_=suVt}BhrxT)6(jDVcw^Gz@nK)los%0H?B`FFFv}q zZ?~(@Fg@OA& z-sY5J@Y4Z5qCptLp#S5+0J*_Ht-&Dk!Qk{peV4(|yv!zB%+SQa2o!mrM;H+Ypy=Mg z7%j>mEQ}bGp`t92c#a`rXm}PfMxx44__pi!(OB|_wra&v-bbHYc(L=(lB zUqd2cLm4AO9SY4&KNRBmhqEcevapm25BmIThl&yS1`1)CqORP;;rP+Pin93V_W+Vn z;G`~2$8~eyNlT=xQr52!y6TQhlrM#KL(S=g7$?B79>g?vKlB}#aBNF0kxCc~GUX24 z=M>R4kV?~|r>(uA1ui4(1Oebt{0zg9^g2*4k;?F_N_gZ*RA^^pMCbQBLVR=JUWpQX z@Vuo}cc|`MWxOqv%FmC21v3Dg_AB5k3qj}?StK^FOi)$w50p%>J77kQka8!5`3=>K zY5R?Te7Bf5SfPz~4}E+^8Qlt~_vLHkO!91AX!h#IL-Dv6vWWC`;5?uWHkcX_hEDWz+qdHgj41_<5GKqJ3 z7q*Zf4(V)LO!Q+vX_ILV5&-nVLW%T&>Lgjf>0co$n$OoXkzd6Nz(VmC0!KF!0LORe zCzM~oeRwjw%0YupgpAsrD+<4U6Z1ekInMHiD=^R=5NAM zyVN6e)hND>-;b(?ryzl5VsVGMZWffPZ2=@Fzyai5Khv(TL41SS&vRqtkg5!WL4U*? z7h=B*`2M*6jw*Wlm{fTTcLvCIY}6OQJqGyujKY3A4n4>MqOW{>r6|ibjv$Brh|uk1 zo8&xp0+4h9X|91kXthFTlF=nztng@g$5FA?M^S_lfdxX@)L^{TS^*{+JYLEeqhh!y zgq>#-fb>Kw-pLo7p&Wx+<`$DNyrBltNW|A^FmSuC;)JiRI__8+Ph`qME-}t4*c5-L z5GROKMM`XvlUAC~=p8`HV#@`c_P3w;&~eHm;$ zAHuqW3>RV-h9ts#>J}COgCq7~o*N4bqXXZK!rX`!;XNq><3?d`1D{TOzJtcr) zb>2Ulzc^RFIN!IpFuAyRDDM=wxQx2ALcFxfxU?p)wEkpi#@iakt1wA^wA#2XRB%3&>#{;DUr0hN zn(AVT-!P0UX@U`@ls+bLU8P7X-(1Z?(m&BlMGar0_8E$%{mdU~8V31(9RxD)jzJEN zXGdF0WzV=~!~&z4eXE-khP^5_htU)zkvjP~+JEIL=+0?-nd>z5aYIE!?-dhQC|eeg z#lj>6j0`pzcs|#sZ6Dd%-`r0HG9V6~wLSngM&5aHMqI zN@he2GKQlsdID)oVqEXd!>ztwMSib@LnN;rtAT|5jYJdB-M2gA0Jp**KX2VDlYqzg zNX0lv3?|4=I)HMoVEF=+Bw0wLDf-SniUI&641Dc({jp(I0Ls{LgHc!))+5}DQGf7m z^_wmu%rRQU4QeNV`7V&{2wiaI2Mu%@#`ApX*O--$t)$*7&iGkQJ$ zre#;0*k?5jES&U-bDZ8Av@S*k?t~f1JPI0YHzUJ>?OMaENVZirAiLt`N}mm?HuL%w z{EW=9hWu|mWkaoI8uP}-32^+{_r&Ei1uQf>EUEn3W$);xnIlv9LFuF>`17;2-{+-f zvSgZFm3kd)#RGfV3+UK5lHlrS2ZEd+#eA)~Uv}nUuwGZqxh{<-8R`@Y?JcsSLrWxr zKAkyTc2yGx;qLa`0XFljp*-!WW8e0}swR0A?SB{?e&qtu`1!H=fwTy4RK7t2z%g?q zN7Mw{i$}vt1)vkLJ%4~ykpqCLYLj9@Z5=*qcOPOfGqqV^Gj+5Mg6xh@!Q$Z9Hmp)XOWTZ@O&6JV+y3jPchJa^yuZ-<7*4_Q3;Q_pFE^zyv%2O zLTCI>&mQZX3A{cNbUPCYITKDk3$$GjZ9Eeja8_Gb65l?PygHN8VLL!Qhcchb2)TH) z7{f0do{$>jaydVhGFG5*R^(pl*K$_YF;;o%{OsvcP^{4s>V+EVg*x+vhR}uPbDrhR za|InEA-BaBLdN4!XFuwVzkfIzEjJ$daP~Fh%=qeEEVha6?{}B&tES)2o%t>mo?bq| z8*Ujf6Rmji)$5hU)@tI&>f%xp#+F&X%cii;8h)m$$xGMfOjG;DRZ-Qo7|&-#dCREO zS9#Ryz2ckha2gfZt08=!%U^x#pNK-)PISYsfsgwSgyk)K1u@@0HRbDnm7aG=+5kkU z0-;m^m2_VE7ru-Ta_cj6_b7CWqETW%3|ftKr-0nV`(A^pfW`u^{ij!>Xhxj4-C3-a zT|>+Zy#OekH|f*wGnlR3CRgsHe+z&_IcCZP2#M1sf2(z|w2DqP<3Oh9#Nx*noQaL< zI>2wk56C8aYw0?iadn&i^4!}RNF)6d?&XO1hq|J~bI4Y$X8uLO^Gj|EhMol!L{MFY zMFp>6(4L@pFk84HCxR& z`%I-03iWS?pMER!(J5e#UNFb?a|kp5L=2DRK}8QlWAp1Ro;ju&PGtKXrT%6;3ChR$ zDg|mCjD{=7PHk^r_DbT8w)kcZ7$fR%H#>;c;LJBFHunR2jV$xFFEGw zY^H1M_b)jYe1)|li<^GFloAvrKcRB3$uVqkePo=tLf4N+!%fM8Vwd<82SW>U>2%d^ zOG;3f2~z;s>{XYrXFxxv{U5|eo#d_CNpsz)n%6%n{vb9wZcj}rq&$lTiTJZF)e^mO; zUDyUxAD$f_|3(lS=L(SDO+Q)bk&>2%$SDbRsU;|(gquSAyVSGC@$ew(M6RqB>H)~f zF9>ASpmKi3@3)H|qhjNVJINBWu`oa$h>i3%a6{U9nrMmJYx-E|Qok$;X#qoEaI9(4 zINp;Axx6?Q+Gg6gf&4-`bt>EsL70*X1EeV?@+O-~nsQayvDPKcOtGTWee@5+M&=A> zRbUq$fkvS`4o@O1JJ@2acso!*+>cJ_nLKM^lFYkAR0;(Y-rYRUUHslp?29?FSmqNq ztVP*d;I8ObVIFKH#U*KJuYGbD`Y}ZoPQT-Z2nsI-vel=tmes)5$#C$Mt{@?S1n+_{ zJ1{M%bJ%HVp?IZA2x6mBvo%rrq)jVl<6^;8Czj-OC(>(*= zgCnV*;lGgHAH|2oCn;oMp(u0__SwOeBvt@&Znzs8oIN-{iaU{|6~uY_2&J<8ddO_s zs?!weR@QKu=j2R~@p_$l%Wexccn9fndvhWLOknZDXx|2p2k0(h<<(J=8)ZT{VtaYV zo}hz}kr2ej^Kl;VU&KcA&|W+}+xB-;R{Hk>Go}#|f(T-xx8R(0X}jROee1p8!kaG= zLW}R_y{{V7(*uQ;y({OQ6Zs&16+MqfKEi9(NSVUxQ9}7wOVP@bH(scysv=v7vY9m7 z8J=*Fo$Lrn(cS!yKB9ZYr5&RC<*jhhgX%AmVuuAUGewRf9gW3~+ke5uPP(w9#DDft z_^MtupoaApLD@kFkE=?rytg#v%DF9s+EHOY9UbE7PVKd^Z z5sHMyU(|*3wkm-74g!*8=_ZJ;3S<(e#nde7Ca$Rp;_{-!He=}_8?Oo$Y|94at4U*? zR)t93A#N^Z>7^yC4wVF15FjtaM-M?}9fT6r#0HBq z&^;<1e8LB>iHr7PV4!CmQq-u4PikXe^4&>Md0UgP_T{;{pdRtQdre}27R7cbol;5c zX<~&JIdx|eGpSRtg z(i%4?ZKRD!Pzp80jQWhm+#QNzqam8j!2fYed^@e1A(vnL2VLb`sBj@!v(=IP2Sf`n z{zBL{@6$(5Ij*7ju2o=|2!Gl}pyg{TzrgpGwb{6bc+XgRkkJ9AX>8TeT$|Qk6Hl_x z6p9e0jT-W;L|ql4S5q7e706mtyNYvy)VRr?==<5?&e9G&CJ)oKB; z($a8r8y3(AB_M#6$U+m(3ijnK+hlQOzZyse14~Bx*+o$nI+Q1c>^7Ua_YQytBUi#_ zI2j94uP=8niXiucz*O_)kaUETQ2Z?jd8+`T_pz$(fi-B9J1ZnwRxp%h1hG+jQ`yuX zT9H?q_c9K|C|*^n;{$-PYRMUyfrmNQs_@778tMw{!(HGa#T+BUOuX(xst6Nm!{e|OKmilN!mO@bIt&tJBR zTO+P*>Rargjx^&~C;NezGvD!3*oab)@~mk<63!bNz_Bs5J7Xg&$rqncw!z5X z?DnKUU;Yzz2a9s58CUr!Gg-I=yY2fg3#~QD0#lnj{Ej2$mr1GL)0-cc>KQOsLvYtQ zwnct4e{=2N&pa#JmN;wvPC1cXIJ01Bb0G_}Fj>i>LhoY3XBfjhqsgJ-6hR_a8(&QO zl+U01S;Y;@JKbmHmn7$&dP2)Yfuul*X8GQW+Lp-*AAvHndm5vpv#d+_!ybq6 zglW=p0f~2<2N(`S1?>&npvfZgdEk@PB6?FJ(`0)ku`RD7m~fed2-Z;XgSu! zaH4jqqLN!dH8&~Jr2z!coJ*q~i*6;ORlHeHhoUMmeo%@90I56kXx2A@vLPRe&(^Xw z&~{-cMBk30ei%B*_;nHFh%O?H9ia7EgkieR&4)vjA;Kx|zb0e~Q*snT_QFeCtV}fd z&L=m8x}ZuiTvqwc8II1ys!)H;AbT_*l9+-l86E%S^{Jn+kuThH-LEqx-q~7ZzAQ3; z!imW(tw_)5x7dKD4{9%YGH?ablbN$nj6I&2PtkcTB!|jz;1B!f0a%`(2D# zFoj`1y2Nz~?szHTalmJ|dW82}SolTa1P6`;APu>$a}s-=m(G%mV-_@0?;h>qOVbc;Q1r<`6rZ>e9+MpH)tftwK6B(oC zJX7tEoTq+^iJVNj)G)Xrfvrem_q zVRE2jcFke-p<@ZoVTq<=O+t_v>DUT#*edAQ8*PIQ#qVVbX@+?s9SX0 zmpR<+$>0@}F(#`J=gxq=S#Law<& zKJ>!Dxx&%(B1yR-ne?IsxuO;HVhy=s9rWV;x#HjGC0cSHFVRbGO&y1H3*1&VkWA$d> zGs;u&AXL=WRLC@E&d)2qhbX^|SFS*L+HcN8j6#T*W^oQu<20+UTfJ?hw$e5DjX zQ4yn__PA=vkO5(zn$NIdL%z`xoY8nI-}s2}B`zw~dHzeJ0B>DQRL|lV<5qU?5#!7i#&c zB+%BM$(pTzwz$B$YRjf~OG%f>o=eA!5X_ zzIOL`?Ow2DomFU+CQarAG&m}FpM&Blzx_^<+3S|jY^#%KLC0zY+a34yYxox8IDs-& zfy2zsxGb+uUqk)6d=V5}c#1SBQx|DUk*9t^0^BO1We2YeMuz=KX=2-5pCyQ^ z(0i>g2G=TCz9JC`V}s z#2t~wk+!i4gVtpQC%Zr~yevP#S+jznWL5d49>9WbC~1lx=o&!b1T#;Q2D@8@zU@*k z29m~F=VZpiiSvMXF5B1$;+Y?ikP=E>)^$=01BZ6i6#yyj06~~g%DgTjP#2Lo6n6qZ zyx`wJ-9=UeElHA(yX@ht+N(^0KIycvA_P*Vbm?dpq^1E$@nNJRwiqe9WpqpgRX~D3 z7VtS6ffHhUuysufAvh6+E4+`V#%3Cil1fBweFva0hdEvPk;iuR2{Kh`01LkX@X~?c zmLO6vN*7XbJ2^^6aDi_4Q}8ta!><5?a^EzmlQe5r%BhQj*Qg9Y3;AD2~Ds`MI64z|r|8sYGDhSCba zHWf-j2_!56ZfJCEsdABN9nDpsfYX75AmACFBmM?p+qL50+tCg=DhBvam&Cdk&5qRR zP-=&rAkmN1-6}P$ixeMtTTuC7ii`QDGv&CfgI*BQ;Rv zh7$LM3~HrM{yw~LDF?+jx|kf>I?D%&QB}#AUkWxns#%cP02r@p;CbxuppLS4`4$Ssw;NmXClxOv z3k2dM9FU*eEBU=4&Eh7F<;F{nFML(fRsf3wbb0qdNe)H`3*{dD?#Y#BBlqfcc?Kol z;3d&LA<1ylW<5ftWP-a;*0y!tD!Wy@Mn;oOyD-b@H$BR{`TEk8wH zjC}3m=llXX&VJO+6e52R8{KL-kc$LDYK3EJADf+Vd-97G){4sVi#!k;YeinyiXw=O zLi`ANqvZD4;{kq(F=+_|vC-Dj5VsGsQwyc3vzlU*${j00tCOAP*YDt!dHz^N=U65r z?z4EEd@jEZ`IFBYj}=;Lb&c!Dc{k-h)$vO)YA9GBTG@ql7!@nkRd4x~rd^ya^E6N_ zpskOe<5{W8+pD10tKkW#lh&)#2xu_ZYj6u_3e{`MW@8yL>Rkq4NtJ7gOY}W}OcL*45*Bc+dgc39t2etu z9uH3e(Q1!@3+Xx!Zm_8ov@MM$+hD*>JVEIPV7K{UEeJYnH#i&%I$kw6{uXpXZ*;;F zdPCayhDPWubK_fXA!ngRXDK0WT>MkD;8-pD zP&0F1J8ehr!=_R6nrXuKh<^Ze1X^3k6) zV-%pb2ToUAOJuB=@wZCUkBEbAM z3xm}NNB7V6dj>iGe`&uj`1(=UdGD|G`wZ4+vsESv32a8gb;Uml)pC{oXumJjt+iPk zt}mUgH0cSaQf?@ltni zC3R)Vq(oHFqqn(s`|s`dMVh6?Ut8+;r>o4qWIk*CTl>Aez6SFP1yUVqMEm{E^}&SS ziNWWZh1#2m%AZu*TQ2rz_LFQUcOPjq%=W+|Xr6b7TUexsJrVle(f;e|Wc@qGl~@Yj z&Gp&-^7H#0XE*?jWyKE#tbqme z#b5|SlGR$6goOWu7)!&>T7+y6cqEi(%4$7|s0551A$+-$8^bq#y&fw^!kQT^PF}nb zPlPtKk)S3&3y#;&wzlw6H7?#vGMtjLNHz%$GfaAwWL@y#WoGeKnrqz9)<>tQ6w7p% zsp5o>u3N>00nSIe+n-QYF?O;7JEmV}hjz1CSx<8tD9=EL4NCg`n)jja*zF44*a&58Ap0F z@X;XCKeykr&7+{;xObOUEx0PHRW0eWp`%PD*&a3T6zp@LytSh^YHjz&s?5cqEIn$! z-tu&OgwrH;{5fqHizf$r#}?6kFZIRmGqTV^Q7104zEd}mPWo{-oqXAwPId>5-CmLq z4!(Nu_nn_Z(K3;5GaxYsr(cGXI5vhK|1N&})v*B^F?#Y#wYJ}!Pkv)MJfC_c`1K-5P0AAuF;T(Zbp+eD+%?X)(#T@wTMqPc z*2VVla`AaX)D=9ziJqd5F?S++oaOBuzfv922k#@Pr30u?t?M!8O{~Xr2lHjsJc5L^ zuQsd0Qj03e^89`bUz*lqaxIBIPVlm09<1(o$f&%}-4zu%9z4R^4W=RF1)1+-M~QkR zP&@Ofg5v`DgFhjw>fkZTJyK9~*)hs0RgDXCY(J;6C+n*5RiID@8j^w+t~kNgsSy4S zqq6h8=M*D$Xt3MeHw<&Y;%_;i%y{ZIKiYGe3$>J{ds=#YBz!+=*G8!qS*m&<%1|WI zrWVj`EEJA^w;ICp6!jSq1O6~ykM!LD$KI-=@3<_M(Y48*CY$zZI z90(}dDWgQN9GM>FkfRgz3K)Z&jUj`N(3^TG*h&Lv5?_MKucRIsSHGF4T_RGxhVp?r z$=C7y1h=j^4l@X%_?>eZHh=Uhsunp~>dI#g3!)<722#f4nJ5hhKfS);^^KZezmv0i zf{$sUgB1G_&eboiJa?*2)oO8&#fX;b?xd$`XtATO*Qc4u72C~VPW}usKCLO4EV5VEBbv79$JL6@Hw|ku z0r2hxQaBV>eH52*_Bw>=H(*3BCn3>@0U2W;OlcthBo(g7%#Vr>lI~Rl0C@a>d3wrT z9*MkHcUC@3U^EHgF02#?h>da^Rk*V<0x^vT>ho0kZa2o4=K~9eX>*iT8)5G09eN-G z!+4G=lPm=vTR4;ZKr^sX@6n<)e`_`7>yilI?~~{3iNh}jDOsRKoCKPs*U#TTein~} z+wkYxOuCp7OQh1;=x(!--U7BIT`op-$CNnhZv~1*FoK=45~jOxEyNaYqD@8W5EpJE z3{_3G*jyPSjfjzwp!Wk7e6?gt?w7S$IOSGPmFLFOF6)Y(mD@>uK3P;q#)y$|` z%aD4V0Ql~V%4w;3UzxTVJ8>$ULX;QQ$gi6EgY50t9~;auVMTVY$YL9G&zBPBu{?!V zxHf)SJo30|UBRh*F@co1IXu<8Lx^CSm(G9Cnl3*Q2=m%jUcQ~XLLe6_eXhPN!*7LX zx2WhmzFW+fcbJv7+OxM*k*}bMxhsC9;sK!W;3l`x$F+M`1q<2bdf;3e0%rn(yi2%z z-dy*x$d5HidT{~oU@bgaq^%k%>*Oy(b^BkvsmF!@)EV4!w-F=K?Nm1CxCgb0YCgm# zkC^K|YpP*=KR|;rYL2#|q$B^WCJ8G@66i;#HnkG~sA}8f`*@?dn8HU%BTf)5a}5P} zO82F1tGrfzmrLvzO-nO1pWyc=sOgVPF&)4JR7Vm46aoMMAP|UzgoKQYjDmuKii(Pc zhK7!g4g!HNFfcGNF|n`^$R=zY92{I+Ts%BHe0+QY0s=xp!bguD5fKp)6BCn=kdTs+ zg27-iGBR>p!NI}F$;rjV#m&vl!^6YN%ge{d$Is9I`0--_0RcflK_MX_VPRnr5fM>Q zQ86(wadB}82?@|DJd%} ztEi}`Yw78~azb<6GgyL-5uK_~&VO_bj}B z{{JHyT!0TR!4ZGjBmXz```;ez->f2*{>|!t`$K+Rfg|*71wOh4|FI6A+=NeW!DqMO z^E>c`UHIZ2eCa>*SEji0{Zsq_{Y+-_3QtZDSmBjJYN1AsOce7WPkast@&(w5GNC=SqoX^ zcg?n4{?^`lb-eOtrr7p=9HD&N#?W~4Cf?3u==d6Vvh44ca*1|a+GDVU!mPg@y z#h~>l;RjID{LnRKROQUzL#Ak*7bl6tx)G-$xVw=+%*6UUL`~az^Mh_TGvfz6*WJxz z6Y@rjaML8~tyC*Gzh#v51E}d~1sMY(Q?%X=f6MiLJJah@(InFcjcq6ECs1i8JCq4C zBRgDhZzq?`L6|W$7Lh6DBk_js7Np~rSQlmmD{U9%B-z-cE}@RSzRTO*!#zZw~4vlE9q#la{6SZ$}*V z4;x>+!#ZkO3RgaAo=A&0Y8fv1a@5+>f_2>1GOT>uUOg9a+)=_L65|UvWk0FF5)@8R zIl?Kcs<{1$KF=P6+IG@gQZS%zg!h?_!k);DvczSg{OWrbAF(UghNZCVbeN+Nkty;F zaGZ@i<}R4)<8QtsH~9TB1Bv@_UtL=#e|m5VRCO}oZZEg;RC2i z<&B{M6g}S@0ct8NznrscJiJ7JnmFBL+3U|Wr2lRkJOl$K6si9^!2l5p{^wvo$IMO7 zANf>>Bqx)xp(gW*Z+f`!0-RX=l^f^K`i}!wQnAd(BA^> z0(@ZM_rSvzKDY=ULg+t&*28&!75;to;nY921|MJhHNFo2u>qgh_*)p5-?>}f`?bD* zvwd{Cdwjcpa&!3e`uOzv=h^jN!Jw$pSk!6xe-#Y;m35vkcP8_g4gdGS;B+FHEB~Ku zgYuMb`Qv}L4Xl2|w>Q@RgKZFaHSrg<58cwU@xeBD2nM=l#$A8d2F*1Vxwqv15e#@e z+ErTWc7GIU(%84Cf$*tCU;Tq^@ZSW3QMWSyU7)GxM-x1Wl!3j>S@4kNo1McdiSa*=%&Po9O<-n56^b#}4QOjZAE@8rfB7g*&b_U~Bbr&yLu=cT#c zuI6V3v+b#;N87OZXFUW1p$~{)0Kdq`+%GF@QQ9xx8VcX9$e0`6uT@#4#&ao3k%H6T+5I6Fq+YkQ5sS8tzmo_(hf!*;1A zxn7S!gO4zrjjA}Zx%_C;FsYkR`h|TlSu`7YQKIa4Sg)b)`-~NnwG4tHeyh)UIp-hr zRWO&UDb^o@sj3QT#OQOm8~nM$vHi{jd_@*%k!|DfYE|$esws;e5d9rQ!8EbDmKgCQ zM}|oo*LEGQmbD^;ZNt@~{)kO$btlsXqK3h{SQu+tG(fH8hl#@?mdDW<7$dFtn;!*= z9VE1L*gM~w>50{))0V}af*9V~e8zPz)sA(3BUI5vvUs`Rc6@)e62c9?-bi+Y-_$+R zp$hs!Z_|wruX2K_E(cluzQ5kC{0(PiUGDhA1o0mW?G#PN5B3GAAa1W7?EEIa)Tx}Z)azC8)Cla?D%(wC8yuZEyMP-V%!U;dMqwaU zxXEKl^3&Mod}(x8BC-Emi2(pbXb#AQcm$6S!Y3diBm$F=(UXv~5mE3HQArWg%7bZT z$sm&CG{O`#k0~MCR1h{Q2n#hG3xt6c!tk)AV`7tn%IfRuzkK=9)YR16+}y&#!t(X& z*H#Y?YsACG#>UnbAzM2;J9~SC>>V5sa&UBXbaMJrPH)~I^ycl`KlRqx+1bVAPr1B% z_ov+6JHg^@g0t9z{gble zv-Gozgo}&Bi;JwEXU)eyzaAVf?IY5+qr?59lij29ox`iG!(SVR_Zx?Bgay8S_%|V* z|0#sMeRK}LxPjl^A@txx-~76}x&3v0bNiolb$$DPONfL2n?wEkRm2zmPdnUPUH?s& zSJwz#TwWn`esTGy{(Sl85@P$;&j0zzAK&QjNBfr@{{1Rq=l^kszxF}w`B(5&sLJ|Z zc=mZi!AKe2Ana)GB{?_J37ks9TFILek5hQwHS!r4qAZwk`J(IeR(r zPo900hQM@txlzRCvp+rihe}KYF;=M+jTCpP8R6MK1mA~B3_BZMYJUI0L-zy`d|&?Q z*(ZlTS6sR~xqk5MAA;}irmxJ>-j^@X5tSIzpPv1S8WN!{#02l55(8Tntp@Ks0U5r3 zG}pTt`iE!FQec%5G7baNJ!AU=nfu_`(^T(FMhLC$tj9>Bv2MiT>rBCs|u67;BKNrT&4;b+SoiilOWO6Pa5W>^zRK zo{2!_B0PJK>B3Ksh)Q-4p8Z~tb;#|_PF~_eCFZCo!kCk0ity~Sg4t}Ir}^k@78Mmd zc=mK!C28b}at9nUn%c8pIJpMrDas&)1-6AS61Txoc zZ2bLU0|J?A?=b6sbJ(Gq@ zoElSa&z+7up61y3V${b`_7zcyIj0JL&a17FB1Ir`RnQK{N5|<75y;$uB9{RccFGF` zGS_}}LdCZ9V%j96oo4#QN9Ko0EULV~D5CVC5;LNlrTJoiwdg(|-v}Rhe|31Z90R4~ z9kI|vzg`Vx_DNo$Y%H%>i+#!^q8Ite@Mbb8tBKZ2&U3z&Ug0En}vB=F%A@}J-e@G?#*9rHC&l&Lm0+f6A?fJd!_0{q3 z*4z1|-)IWb4ydEvsEFVzP*8lC;RwTzT&cvpmd4OO@h{JTjPW3XZ?satv$HJFQw3Ih zkElQv6$C_cN01m1d|h9yuA38c)S`-nlgtVVaA_P^e2jXA{{a5(4c(F>4&Pwe2&+%PgLeklkUmxTl-616+d_M|B<}TfkYKm{8W;O zKh}V#pPyuSG+6XJ8$YT@?i1{Lxc-EQ+F+49e@kFASJ$VOgFNYNmR|Lw_%Ie>s7z4T zcv8!GK2KD!%4@dBh`IBEzS$l58;o&UfJ@3o@4CoX>Ii4_T9LxD5{=~Hi2~7!BH^eK zE!$kpsMETSt#_=v`&PaF1)BK+?j^bdN>l187iCtQ&tC9*Ogdg_q#F>I=tPiD)y!Q~ zSUxK?zG_LWm&q=d8DujIn0t|fG+yNXtW5W2c&4ANztWG`PWmaEPLKbK>Jf^1&ve9>?8YWSq<4c|A9(3=@I7OXF}FL!V=NSYSx`Utxy zwu)fYk-YpF7TU*YgSh>7OQx@}(|g|}Z2rZ134il&Uzsz)v(J?#&HIea^6tB}(MG0V zYxrS>$Mk-}alc@jG!?gKjHkhQL2~=`S4V|~eeG+s`X)4iO7Hs8Wh4qP{T)t)FDsVG z?JKuVSBa`XX6!f=Wu3OoG6%nXtW}Wabq_=^G$=@H5j(-H2k+=aS9W9#KgPZ5l#@H; zMcW$5ylyu)bw${==i=G8d$ka5jgPb8E9X<)PAR6+*yIsoIhMehTCSSjEKc2buh)ArpA?Qi8?2Jed}^&_ zWP9?P-x7N!YRT)I)7cRpxN{b%#3VHNQH-ZNOV0hsj*{}^SkRJFI#FJIu3QCsCzG=6L7FU0(=X_0NZLq9g--3Hd{{HKpq?`WC z;1X@Mfc*hK^RL;*hJxuI7cHy|41&fh1nLXD4jp1n>N|1lgkefMFX$h|`Y#AJwtqds z@)v7acc^XtoaUfP)4F(VywZA4b}ar~EcF5|P;vI`1nG#P^q%WV?K_piORTmP{NKx6 zpHok;_v2Q9q{3D7-`-q5GhA5xaMcapJv@2ocDHf-OE?V1dK!^nxTq-KJTg>x8XiHu z&iMIa#BHfPEo5Pt9^L($(buyagYVk_`}fcw#NFH!_q)TgqF-P~Zwuz#ucm8yx+%p-WooudiCSkUAJCEnLU5S&z4{J&Th;< z6KsE-mg@XE4*g`fVmk6dKfvgSO0{i+w$Ytxzx{-K`FcZWxp9~@^+fx7TMh!*()!-# zBs!*bb=v55YT)qvJ^KB+4vq8lys>>1&7t9I?%VlaaJ%NhvV#}Pzm_Rp+IAJ%@7=&p z*2Sc3h8*vX!am(>8!TIoefHWZh5Ozg{pR@9^SWcG{khM_a)Fu}s%>d#r3#^y-=!+| z=Q{&epV5Bprf$mObG<{K>r!txK!NW9-M}HpcdyW^eag3w)DJt97x~)Y>PoYx&Zln5 z=eW@iCk2Lm=9kT=`Y6=z&JDIu2xG9~p#;OIi+tx^!{9=0jMx6i&i<$@Ft$M-Se_p} zC_vPmn-6S=b`ASgXe~VBCZ-#BF&+^A&JPNDEj!~Se;s(}AGnJi$nG9Mrx2)?60}7Z zB&8cbY!$=_ey=Yayxtx3SOJFN9;B)eZ0F8tnc{B+_BREY+Utf)od(~KhR75JufGoQ znc?8Oe*V764E$8VYbFHln-bbf7^-*;lh+P?))X8r9M;wysyS#~QuCF4^wBMZyM~7L)z(LH{p<%b~0cQ%)zujXk z31cS&Vgs~d??YqpMVK&m-{lEMT@uHEhZrBdcV4rK+xZX&31g(Vas0ItH%lDPa>GDR z=E67>#d;I3R0EI4ZjKfKB?#`)^I^E*48pGupLOy`O-v(8+v!U6w@!^tHONU#TY;u|3Z@h`8hD3Y$7F_Zm* z5`mQ%AIIR$8BM$yidU{O?isVGdJB4)4XYWNIvID&nU$c3t(#1n59ycN0Ta9LR#}l| zW;0KkKNZ3s45GAyz z1--25wzzk$3~#k`NGbnIN$EHJa-6ObC2*9<(NDEj2NScvTv0 zE>`X6*&y2YTrI6(bTD3ty@ubjF^jxWVZYH1t4W2usaUDW#U-sIth?eMPRAM&AdA7b!Yh}@GO7u{uux;&BF6b5uc*~w^v)AhIvCXli?R>T^9B!j9>e(_b z*1liTTDspBk=8EJ+`jO!(L<~)%AjrS%ZClIf{FRiboTOn&!ofsj>U+M52a;i?8z4& z^N(9wS0dU6ezo4)=KcQFK5g43BUXoc@cHUXTW{%SWXg6N!#s4#24Gnyia`~zT`s9z z`<__W+{ zId|@vd;hw7p4qcQ*hwbCgePn5_4)Sn?DbIL!U)M$3a9q)hWIh#C6&FYU>of|ZRw@3 z>J}Sq;osg6l?6nN=P&J3*6G(RHL*C&w!+glUhS7Et#Y)< za*pU$D(yBK?Erh04v5nA+nf&A>llAq&GM$}@g42^k~$d9H)y^3$HZrV4|!;>X;4uo z#qDVz=rB5RbHiNjMUA?8l{W>FqD7E=?qe)AneWg8cTtW48V->PvSLS02 ztG&FZBP0W3T|R@~QN~xKMg;1{(oP1WOUF;1M$hoZE>8PL=q6T&#)I-4_De^vN+-r6 z#=K?5h3+OUOM78Z)1FSpYf~mYS|_WIzIvww8|O#1rHnMwP5MnDdS@cKU`&(nPm}3R zQ}|9(rGcku+NSB&rWu~6neb;=_-EL3XE=OkxYA~L+GhCHW(1yRgxaRPDiM7*5kKV( z)hA7@KaIV&#qg^{G`fUW=ATp5om2On(@dMwZky9to6~!qGr*rW;-5Fsoj3EHw@90Z zIJY)y^LEek4)_a3^a$Ptvm;-o@b68g3TGj!>gD(`{1g$L_!on97ejp)zo#vRw=G7j zEk->r8t5Xrr9o_rcI-A6pSID_(g{C|xnIvqnfS}u{L8tz%lW>`h0pLtOiNuqW(Sj& z9-bBg=ogE0SL%IN8q-#q+g4in=VRoS%G(wiy(DpL8vw0{YQFI5itwtFuVn5d{@OH{ ze{J^PWbSg?+UnZc`afhY|N5@(`o8b_VcPm}+xn^RnwkN;hT@zz)M`wsd-ro|Uu4tq z>XK^NYDb#QH`EQ)w&g*kB@CO5KS(RkYqP$S8|t0Q6Z?oT0&~8Kn_X#}J&_Yt^ecn> zbLxtSr|O96LUY$^%eTHugSne;=~ujj=G36JCifB5gyy^qwkXphlhU>xo|^!&h^lh% z_u}xXa)=!Alb(^ApUQS*p8c!Oc2rPz&nR|P-CKK9+kv@duw8$e-E^j5qm}%(ZX6k35ShKeHV_YdAj}VDS0g zUKl=pk}r;@g@JQz=e;X`yf1KA@7FF7b$a~aoOT@dR{jFGe!ApmH5qkeq&K;t7Xn2% z#pwhixCzUzcqOn2D@X*R;BkTc?$kBmvWVd;Im`2iZoCCZpv>_3y1TYZZFkZm$a9zJqy0&z?Zh6-qJnC0*3SG`{&I*7P z*1!Go0?TA^gY@mjApfSh>&E)@rV-`#5^Tk}4Xd63q>sKOFT6$Uy4Bx@pfEs})<6Zq zTWG;stByO~P9V-9P(JMamEtx5>;CcOTv34(J3sU?6KzT6?M zfoNob6%{0(GhwSc?sD`WW1=tO{Ld3QF7d&Gpt>W_d^!oc;*(Fs6{^K!0R4So)O8}G z=A>Z4G~+Gh`^WhVpdVqtG9yOggh{i1dI=#g`Qv)2IDz31Xtr+r`h#vy)Q+BI=)W-@DSdnjzlctGp8FK;GNXqZ*qlv zoh5+j=pS}_guYZQ*2&H^eq(SNjy9VrtGPgic$)UD)qI(5fjs0Y=bnZN+l{|u?u5?* zc+c1CvbS4~!|4V|nM^8{O0C-EjS7Wa3KysTz&Q6kuu*&5M-cWl;?MMk^JeGooG14p zv&N1vLVd6gsKmG=?X1$x7m}Cvf~ZKlF$=@cSrb}QSh<6t62ZJr;4RN`L{q}Ri_D1E zCxl9DWfeA^4jM-(7*&k!y%dit4nu{IxnkJ*qbCCOtASPGxc0rj%b}l#9ZR;tdC{7B z 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 P8GdQVTMf|(?Pc5M%vj?y1?ZnrWQAd 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�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%0DAj}33LXcvyq>oO4 zLTHK|128L+XxcMT zrS||>+$m6)P4x-W40R|4as+r62@(B26rJ}!)o&li&pFOQIQBly;n*{qjAQRTGmlNO zXF}&3JCUvWBAZmQLS-Byv}A>>Y_d10PPh9%xUL^Q*XMe?uh;YS+&M(&aarxygLrrEhO@D_Q%)E5b#q`n$)azGc0u`0`g(xP1+6kV%9Z_ zML3HerM1)-n%y>Q6eKNpoaw{3n)8@(K%U_Ign35&U#@S~0gug`zuBu+TA5_W9zbv5 zp*ZeIchyNx=SlClN#Eitarxx!`AOeWXwXRiO_SHo_hJ5vlhMUfF`ZMfUnczl&%#Wm ztiHga=BJY5rc;ZjJv*VH+|wKPtAa|Wb5y_Q%};7>Ps7uzT%Erc&3`X?34K)j-D>xH zrSnW0_Y5q(s=9OLMaER^-|33^nI_d)ufH?vbu%r+vn>I$J@;qd{+)gPWtOxx>;D%T ziGz`f=jz4hnhfXs#9_b{s*hyV`CDJ+zHra_tHQ)r=q3UtYf$q=&Qx<>CMQkmhMgxp z4EP`DY;{iV)^$S98 z7q4O)wB$tua*080i7CFU6+aQcJkKSJ4kKwX@*$U~-X2!NHG zRjEoAm!<0$;-!|w10N`stSEP_s4T3gkyo(D)z{IK1te<0XG?A-Q0D`PCmuR8FSt@X zIb%X|2v~4aRl7U#{m1S5Vyapmxwjrm-F?(@;Bqx zE~Pf|JJ*(W*ZuykksWT)z@9Ams7;3AVX@|$v5T<0WxC|RO)r{_kzKkd>_%i4G;Tz? z9`Q5mfY!DPT7y{g$5Yu#O#V=XRRh){Gog74(!T*z9>rVcU2ymLHJqwinc8G*ebtAC z2~66mFODj+RGTCr^?Gmh05#tt@e|hxeZEW;I|4fd{Pe|AjqI()NpJiK-E#YT1=Mct znQwgP5_xI9S+zjrMl*j&+KB}S+e&Q5Am~=(C);S(b)0fK;;FikJ3VSU!L*a1YTFB$ zPAm_29$8PZ6F&kK&_c zXV}3Am0Hjw58V-dINL`Y7TK_wO1qZsvYFws6CSwp4=H6RyCAW@de{Ja8UuT5dgzg{ zF_d}cCcfZFM<;vlY(;$GKx)^w^TdYZ$b0X^=L^LB%X&=Uq%hs2a5D^ik80BVG*)WE zCkz%tnxBf_U2xt8zB$Ao4_TB6Ii*)S& zPVufARe*(R#Kyg+yD=rw*$c<+Uw+PY9%((jT&9`-J@TuS{L7r<60LMuMK>A$@G^(| zif*s`;$PSFkH56{yMOhS?2bzwFRC88tE#a)J^Vx7cP{za=XyTyuX2bk=i`s_npcwq zp2_D&`|Fu|af`H(@$%y?uy65`#Yj2;@V?p8=-+3h8qLXhUAD0okH$8r&>TuNyvi-` zTkgX5;2R_vMGH)C9KT74_G8O6!vb;Vu0(dLb>k;;0So<)tu{N4LoS(0w2|WkxJ!LX4w|QB=NI`R1|raIxw=GF0`= zq3>9g$y428htr>fa(q{jk2}kpHzGBE3=}&?ZGP*F`v*ljT?CiB^y_kAzk43K{-u~P z1?hYlzV$7R<7t{xRp`ci=RH=MFa~Bvent}mZ|A=;XS?(N`X#LH8t%1qDh3}c5-23x zN&ocv(#4NvUs20MrhhDfT9mw5G^F*R z>E%9zMj{C)9c~od1Lb+qpvxK5pWQ<3_VEBCCm`C`Ov^X@FkPa3=qr%1SjK~z(m|HN z0FDW!SCDh}4CaBMKQ|glc0b4}DCmFTH&_@W`;!Kx;crQVb+G+RmngVR9!^IjoVb5f z3c5@2iTw>&##{pik)TI|ZVDsN48plW752*>G|j}hYY!0Ji!Z1_Z2&Edbk@XIg6b%$ zk08Exml17py0YBGU>AqCs{I^{1sMug9Fb@<`h!TO^vk^8C ze;$DzdH6AHx|r3aawmz@O;A6fyQXm1_tiG>V>Au~n2Qp$zArqr-ex|V$#(1o46|wN_Use3g8JTQL!P19+0q(BgaoXn zVg)_+%n`JI1S*QtpUfG^g9&y7Up*K7S_|}QeYRc@82KS2j|&s_)U(<=@}}PzB?hQv z4AO<7E0_48>;TAM8W`Sqm6Z|cmPd4-12-r^<P;J`qtdC0)eT zDPmJUKgabzTm%dN=ec4A0A`25goWJ%DzVx*H8PR__&54B{_!W*f!IOfn`iy*;zQH> zV0(t(Yx@k`PSzkc=A;ePGJrz+4{8RK^d2Q`tYjj(tiP@O@hB!vgy3Wpc+o`BkeN{U zsGkpq>J~wfJoL2DQY@QIIe+S@UNZI?)FCK59(xjKWO*5KQyFk19CT32K-xPv;pC4* zw7|0xG@hP9@Bjq0%1Zt#&zeN>fIdyLz5jj<|yG$ZtspEh$P&ymnIOh@R_TJl(YCSC%>p4W-+Gm)sG?LuRkyK zpDFD(s^ySe0E{^hoAxe$l@g8uiwKh4(!RXT%ED`VOMefe7BOFXBzxoOFHhbKVGNck z^LFu{cmudyL4U^eTBqI0jSso{Whu=RDNIz0-2stS{10&&*N|lf!79s8NyK-xcm<;w zlMpJb{zJ6=K_ZKJIVKfXdgBx>&MGoqM)#6dsv)h*muMtVhyd|D&4TMA%AXuH_fz8z z!1~6$^kxWlMNp5v7Wg{VmrraM^_vXQy(mOhv^Enl_?^l9yh;I`XNHxHZEX5Ih%Bi@ zCig|6#^=DNLhRZgs6&oX3jpeQB0%T)D-{JLT2PC#Yrj{vm1IA{q&lVDJa?lMA(0@G zSp>%*)QuT>cWCfS0wNJWPRjvkQAr)R(|DRg5^}~dWALk~<*ja^tfu;?d<~cLw>h5R zWoS^wHgz;A6{L2GDa7?4SE2#&0?SQTrWr({lxo9K_KR0Z;z<(@3@vq@tsnHYnVu*? z1Q*9JrxW7Lgt0~o!SifEgD zFPR+jz)Qu0%rP}RpfC`U8PVZ^Jf9v^hlXZ(bhxqepr9rip*i^-o_b>6KbR$l=2iXi zyk$**sT|nT)Mlj%M}7a~3JrVoUd3Cw@cU;U-LNO$I=toEzJCcy4l8;;w|aeWamb^( zx#(-`!(3B0s=oZ>5{Rm=ChN>dif(v0bEmIvv(i_$R++~<^S*|5Gh>AV;ni}Tex^|l zA9Bf|m4`cimW4ADHM$XXHl15C2{WI{OJtsVsroxi%}llpL_Bhy_p;wsp6Z51HYBOu zcHh1;Wwj^w=%Mp%Z-v?KUz1zw3c1%j@7eq}}eQTj$c1B>~?A(TK z)Z6Ckl+xsscc0oCbl$G12E|NqPPMk{yxSLBkMmt-{oN2nf~W-(C1ZHHN5G`*j-cxa zeJpSA(f#~tA@}X(mRSd*2jsd!GNa~Jcwl#ibkss~3g=b@_3nJM=?X1qn_H7SZx<(7 zct_p+9@}~Nm2_hXPw{F(~B9)?+UM0nEz>(5;IYy7Exz6zhx&F z6Z6^Wm>4y`?Fzf`>r^E@hU$ICTn`s>13+eYMWNcY_Z8OQTZSo}fI-@8k!KQ3wo z$cOpee~bm6{`#5{UtY`;w`Hfk`(Io9*=w_(KZAb!{&7$4tVccmsO`<~H9hrQV;WUrrRpgX5$$Mc}=dl_adbgiEQke(6&dEIH8; zp~*JUTmK)469Cf$l!(pspks-gBhT6JKrLS?5EE#gfymNM(90r9%?H7xN#n}@P_IR~aX-isEAmSiV)pfaac zTmw`jnrKj(q>b-;%tvBLC0ft?*AoMFz$UV!^2QDEvn`U077K)iH2LomQHx0~#!yWr z4K3|{cWb;T03yjZpzYMJ8=K-4o?sY0V4T+@QK8{Kl467>poV(PI$(y=@0WgcTkmMy zDkZ@tQtp<5u8qN>slXU3J@!X$_>B_(QY2&HvThGZUShi182l^pqb4tFZNX-3;|Ki) zc>_kV+I!Cjgx?KRBN7Rh1J{fPjj)M=Ss-?OfFVFfW=`kNho0&y-BUX_4xV^5_hZ8m zqQ?gdCSZh#ln5!1wkIGpOZpLJ$nT_y=rp7|-d|nY#DY&W``itC`zT{)NJL+HgHktJ z`=jfaR%a8BaJWHS|A+9aoG=PccpzQmBwg}Hy1{cu`tDG51Ni0(B+^M(L@Lqlg+L|- zTcs^st=*Kps{c&`>@Z@~DfY0g<)fCTZk&0_3*-JCSpc+DJI)-W{Xm!CNkm8iAPp36 zMqmvpAZ_qa2nsZW!Lye36S-2DgzyyYp!BS+{yNQ&RlTQn=1|%;17Y{zGNg4OwzW-hpKLGwrv8hLar+C?5{P~6P(2kx?OFxAW zKE7XD`?momy<$XDBf=9%TLfmRFkxyknVb0Hi2$*(>7Y0gF(+R%5)B@Q4=fuSuUeaG zJK-%J4fp-|?AKvTQJZkpT^ZMq61tf1@nn!f95y6tx~Kg`$m&aV13$&0h8|XnNwfYq z?^AWDQO&A;96nL`gzdM+;I9eI_?Vu|(N-}BLyTd}=AWGgL=j1tW^M84 z{s<|c_Nt-Qf9h91DrYXuhdE#GMoTQbh3HF>UxhOzGR=Px4Au~SZ{h$4tIyWnv9@6I zv;f%yRP57PAtNiEpV>3awL1p^qI+-n97?N zE94I=Li9t;fyxoX(ST3t{4M9(;|AO^`a0um&Q?WCmM>d|x$>z5xA%ZdFGXw>>Yfjwx3`)mZN0x$2@uowczghB+S($uuw~;j}9*_4N z*6g*{#+Yt#!29>oB}4k$2M)`8B19hHGF zFY~0LQBrt^>X*qFh>F4Mso2*yV#wd7;`6cbr&D;Z8?nsOL^%bb+;rkM`9z!P*`PBUB`+w!`zn*^ZQtrXG>CCIV{wJsh{!KRj_Z+$JxjNtTY`*7veJ_akUiezk z1EuhU!k)hZdc{$ij(jg(`(AST{V8OolzFC%f2Le+rb1_?(q^X0YvyY1T$40Yn?Lic zYNqb>%=7m%FXSAGs-RE!n{N++9rcqM`DdHtW}9_pTWn@ud(E~+%(f-Xw&%~jshWNJ zdiLG>*^Y0soolmQr?cIVITG_+`|Bj*M>nrit2&k@^?1zPg4Fzb^YUt`lou9UP=3 zB2k-diNx>PmgM@&WFDdB)=ZPAXFhgd<=VuYGRcg;+R;(OEE9Bb^>pDE_bfSXfyZ?A z(hCofaHP;(?CK=D0fv^i3mkcq7bo*^171nm(ID(%V)J_(&7LDI8TV~15qnU_Dlp5S z>(PDc)*7(#S$suCZI-RX&EB*NX<%;9j|B3Gk7Ozn|m||crhVY zTjN$f*?8H?yRj844ZmD!R0U0aOK^eWm8E7~eTm=^H&Aeb;hBrLR8nZLvp3SwUEUj@ zIPiCEQ8C&Wfc3UQISQH+fOvN?xTlUOWVsWhHVIn#=Bbei1P9Lt@y{9t0Aja35#bb&y$PN9n%&Bd!-kagEcXE&t##@`=I>$v?d3Gjgg-V5hwfmuf( zP!tpoiKYld&icn2``S8Moh@He^P2j*NbYpU1UoBd`NS-2=#!H&XnoWhX6+)^9M@+B zE}VhwMBY>{eH0Olz-N*-t_BmEghm^0ih~8n zqVLo^ajSTtrQY9AViR-)V}7}XUB3l5*h)V8(U`PJTjDFKb}J1z+kfUl?sxJBDEfSa z{%n!^X{qbit>fhq>5T4L*sxh2-dosF_5V^o`^?m%WYUrEk^jE)t=e zF6eltdE{(ea?6d$6cvHlP$7Wu-lO#bX zK*fCP$C?|7fAhE6W@lC4_WE|0#Byln+IH)5I2ppkw(8p8u82!=&GP?<45(JyrFIGU z2KDF)*tH%C20dMvwedb8L->TY{k@YyvVuTQ9oJ1Ed^NMz?8w`Y!ewhAkO~&(qEGmB zb|7E|5!l?a*gRa$@Eni}-GDZa!iL4&KO8D5+`+dp@MO>Kh!Biq(&Fg1CX zg2)5`0Ux=-{rfU9h(AJa2(d1akh2d$;@SxKS>7$25#8Xoo-kHiyrFqI#Ig znH!=z{J?viQ{9C&#f8>(+YUE7A>nBKW0vFIGOr6UN%#1lDlDbMg?E3AR^4?$!V&Y- z5hpR zLvdr#HOSG1$1&mSEQeW=okHa4z^b7@s7T2UZP#+UT&T-K$DOW|(0{j?O9S#-&jeuM z_n!t!PDM09j?EMHuKR%Q*Z60u&+a4rZwopG!tT)0MLa#jh0^^xf}B7u=6Ov)ZMJwW zc+6(LPt=d#E4Z8FzD&mOVg)!xHF@>Y%gBxL?;f;E^I77gNa)%i(0VTHv}Oc1VcND zf6KMba%?Ql1_UJs?$e#QW!Rm3WR87a(%ejU(&%+@o_QNEbZi}+D6+VI_{!zB0+d1F zo-Hnk9~-pP`DZz4|DS2nuY2pAyOvh4RBI57LCp7Hu}9lRp4k`#0B{loks#j@J+8F- zF_zbb%^S@`LQx_)hDoOVdIUz`kimQZ{yyawmhahnJ_{syz0s z3qf1bIvoX53y1I{d)?${1+)ol9#kr1d1lfV>ow%9>!+f8c*Pg-?C9r5Zbp?a0POrj zBH1G*X>7c^@1*xgp-5){Uc`J=OW{Rym44AjQ5y@1{}zAxk64sH249!y{qMW)oPJ+~fZ|93QWIK$C3_H98KQn)mvT%FK9#d`j^sZAqd?WZS;^pH9eOSb^d#C3 z8>q*R>vXGT*C+xrz=Ms*W7F}V&qCAjl<>#a54|!Bylxs1TdOpRjNMX0Mt}Y+Dv8^Y zDZc8q3$Ne=IhSj~*nAtXc_8LS4Jf<*2$iYk*-cY&P_8 zl}Zvb-$%;Q9HmB(Kq>@TyZiv0Rxl>1a}9uHxo7+hmBdn>=$88o%Rq69x&!^VNHHxM zA$q@qA)pi>tBfe)G;GIn8?HVvd{w&^;$g2mV8BRU2Leb01$7FrI!}mLdbS*S3nLil z+}OtSY4jVJ$UwWqkM)UwhOMn4x5#Jk!q9@}!R>G48=2adhdFboD&GGxVx)Ya3t+js zI?GxNWtaY-8m~E6^J(m~m6BPi1%XHW*La|b%D{k7D3EXto+eF}0ZuJ`AZIRN!-QM> z5Z4o9EhwdLAv$5<-zhiceD|;1^jKykMC1L{t#ZciEBo=MuZ^8^;ide&nlzTEtYd5> zwe$!^41Rr_kzz+YiwTIaG)GB{WJSzaZTB01tZ;G9XYw86mDV4#PDlbG^0*r!o}{Z? z=45tsa(%AhV{P-wQfZ`Iji$zcsV{6T?uwW(1-E0(*i6m&q>MEnE3i&!$UaD}DeH(@ zPMVyAumOkeVqbwRb!e>=moJ>GSIyruPQWbt0AjIUr!baqbRtu3)}|`+{b@txzo)bJ zx;5+qLmIwc{QlSd(>kSS;#p=yXBxMLZ;GS{3a6Z*k4J!4;q2`w+cJbE&5m`4vQ8$7 zFf;>uib_O{kRW1NL~l)vB;%e%s0L00A9GIRAdwPf z8G(pPRbcI}Ls+>2;}r=-tI(q!$E(|o$|E8#mj;|2g^x1Bm-^J<@od#(B9+a-1Il|t zY1)`ls?1=psKgLaP_~@jQXjzVt(gj*!y_`YTtV`+?`@iz@`t~p~0aItWarDp3-NtYvqRA}*gm`-yH$730jyOVLvuMdni%s&7xNch% z4CG_ZPA6zDMLl~|jb$LjgER_-7-(7rO8s zQi|(y(C9t_oNEvu`2Ghs&I{nI)`XbRYudEZPbg%{tx$JQe6PHuS?2Af&=s`{AjTCl5@cs5TptG7FwJPqdLw1~CjpB#wiC zX{q#{H3AtP21Ea6j+I`+(mZ{SA<`4In^Roo#69)_wba#)4mcv^%;$(Xd?J}YX2_5XZ$^9)uwz-ZqMPnl~(^CXd>JD*C(vbEwR-~ zMqmPME0(DVr%usZ*7jQEsv^9CE+g7#<=Xqi10AV?@qvts&-{LkhBUvM-=p2CJrCal zAtUGayA-;P#otHk)l5ip)^(nW9}pOwCe{LnJG$-nO<6mZXz#V(yO?iP^D19v>5fLR zl^te;b*v!&DGq5#9A)Pg(c`Ckcns^0@|!!>Bq~-p&l0>cWj8! z^}kOjp|li?RT@)N9?Q*4HJ9rAX?jn2qC(>InN{bOZMX7dbN%Vdu+D9lf6CK+5@(IM zojcy@H)h7`&tBi1pekYr{AlNQiyc^klW8t{|yz{toKmOm1MGDF27w?Mq^a|gV zT)THtMb~whc~51PPx99XtFEJ5$&M?BEBAY&gu{Y=Dw|r8m!r8|C)NLy*MHXE*$iGd zuDPeW<01L``*_z`;>Mq?$9=!F!+X!V{;3`$Nd8%R)ybGf>g?F4kJh5AKH%^&F}kVpi+K5{!i_qPm+Ad`j0-ho!rm(D%wRwvtdC{{m+Wzzh5ccj79i< zzGy=Hx>MotSOWy}XzC6P3dm9lM4~_fr638^6~9TLh63xBf=y8n+fs-N3hG@74Mf2r zOJSBczzp%kAb16~Nhr`oH>O7)3K#dSw`=ZtdZ*2hp9C(veXJ zXc>YQP0vzBk3=&Flrc!48Rg3u)zD13WlW}MX4^7mmn9|_A~^$h^z7-s3?fG@kmCWG zy`YS}1kF)h#!-*vY%SyLT4GOL61w2wo-E^DKqJ@7kb7vJvoans8U-y!(ek2M%F#$( z-kj32(IxIwG?yALMzN-h^7m+=bdaVzukSC@;_ zmy6W(2zBv_4U~%w^NLTFixb_2dG)xPcqPxuC7YJSp%qfJeAihjt|L8o*2~p)mL=sY z$TCN~(z+G0rhIa?6>`vWY3UW2Kt2VvWx04h#pDXbOg?dMKJG|9Qoc0a!|V)fSdjLQ7OxFv=Y6N@4)v4sNAd(zp{)NXnB+ z#Z!B%7}u_W?VVSwybojpJeShc-9sy-V)Y_1qknqD&sNl9mUWSMy&2%VaL+^i1Vu3o zI2#GH*dsIItUjPIhNfV^VYHN2f!N9=XV0-T3cdAJ)5|5S2oh6IKpp^X76=+HYs$3C zifkG{DUv2{F#}T-N|pc@!}Fk=l@hTm54>)ctj(q+P_p68lPhIW8bBfPl_HzK^cf5E z1Y*b5xHDIo;Y5_V#yd7F%V#&9f&`jaFS%+j7BCSd1>_Xntt@;DXjvo0=1IyNG@k3To2D9p@`(o zEcwkVP&K{FSG`qZthf(8w24%!T6$B4Z13eh(NGafd2~h)ZE)k+>`T&g=ebC*ao=R; zSWY3X<%#@^*YvSEUhNj)COv?lz()1ahUR;sRAZEN(kAY(0F&w&s% zR!RApzlxXia{U(SiBRE~b126%*=e7g;W~0E()nQtv8JoGsoqB^we~5fEV5)!!}<#e zk`VZo?yYA5p)L;YK(}fD5VKv%fM@2~@sY1G9tQBBxUXnm&n7I~*slk9yLZ98rfWWh zN;h+T&his9k;PAQyp@D%V&yl6;ssj_DLQRyI?uMdUA9}1^EGw8$Qa@I*JZ*D zU(`CDvkw#0HwkJDqMUW2bG>ALTZZK-!@fwaTI<^{W#@eL#(c(@UuJ`DV>2=Fp~$E5 zRVD7?K(_4{kz$h^*l&h?^io3A_emiF_2W;lEJHP7@wdnL33i4$8^i!goOkF)A=&9? z9wHhm0>#?`&l!fie0enn&t8nH0UJt4#pI=yI; z%-c|I*aw>B-OSn1B!8@QETCAF_hCr{&Fu=E7GQr$@287sfMjamB+TBxYSZP?PNvit zy9V{c>hfNJ5mRrt6Oi)8?$4vuZ)1`lz`cLhgK|JpEtwdX$ZF6FELD_W;?_c9^%6&x zUnuD(TRl)%DCJQ(`uE%C>?N9^?V7^)>l|5!Y}MC8OSjoR?mpoioO`>=`COc%T{4Um z^k*hu-;jbatMcm1YbjZaG!Fcf3A&9GS{e>CxU9NSy@zM;{zUtXudNO^l#)ifv#!}h zx$+XuB>~fu5b!xV9bSg=aF*8^xGKt!!PkR^U%u@<|L^z=FjB{<}s&c2P{+-g)qg=7^lX=}1C3;k z%Nr<+f?IfN;EU4x5|t264-q?Qhp`%CiT(1KD?4(7?(+k%mX!2=w-l}FyG0r-j+c}= zq_jExn=N;|y5}in0~$G80NrZ{PI;qTFZXfh)ca@Cwjq@9+Z-{6?1g3A&0!j|r*rEv zDz%a~U-`ca4Y_>cCS2<8_(_hVJ;3>S+3%wWSJ<+vf{?!iFiL=%)>X=8+)MrPl?Rk8M2^<7<2o_z$$Az9fM63;SUz(j*RzShO*NeJ$r-6SvX zm3nJf8|mCWc3aE5#j7AkIUP<3RuqyH9DiFwWhZy{(|Ii8ws>xNs3dRLt5@ph>sP|@ zOu<3>6`AnqW9L^dBUfaK?nkl5M@4=*ju<@TJ}>W3u2w|!+*StmD(?|oHBk0<0!&YX zw)vDR0j9PD)Q*?k+bV{WDoxlYCJ@w}SqGbttA^Je*N zDj}@j4P}R9JO~j%p9t_{c@^Zkn`iecfAG?&fZ|{4TblH+%eD24^urq+U&s$DdW7>7 z8WW~Vz{_v@loLg1BrTv@baOc^xP{WBuOSsb5Xex zh`}>kV@#xhbvf4zCqu`)Zdnj}=L;y_KELtq-yH)6>>I}C@L!@4-Zp$&(A#m_x?2?PM)E2q(6iZq%2&%(Z_dTLk1Afc-mP;1K4^>fE5BEdpXbFL_x_Gx>#uNYb> z%*psWZ18YaLFo%)+~{oQ#_y-w(tj1tDvUYZf82`~qa}}OEGz$$nRnse8YDC906sb> zRr&`h$^)4y0r&qS^9+(j>$+qc$QN4_)7@%26x|yNm9Ii?pxRZGCW9xA|L%+46QWYT zs;c00P(P3AKIg3X<_c<61^g=fM{(r|3ME{1kDk3-I`3BhGuSQU@E3zafVD|rZ2)-Z z9_z#k3l@OQ(vZo*X(Yht1+3e%&>VhrXx%);Y*6ZFA?c{6^y@xy+$xKQ)o(8#s z7S+~on#$D*CEW&6fw|RP=_HiuQLhe>LQ?&`EYnBx2NV*H$ncO6FJG$~Gs>ns<@{SV z&+Qt$zrD@(|Muj%Pkh8PdJ|Skr_ySE_!aICSLG?Sxlvf(S08n_{_S01kZX7B`?q=Q z)7}G3KCm1=(JWjc%;kP4FyVxdAPM;t9Af_1h&|D(<948uJ~;y>V&~9oy-b%tfvk}%XNv4kSOSl8(ts4 z$2Vz@p$rL11JRnFI=4tdv=8QZYcmA_beFxr@%Ahu5+kMM3N7U3?a}wFZr9R!W~4bF zy@YrV5d}DrY7dwYe++s6$3&C#`R;037?e$zd*rc|J+S;JOkEVBk^x8~_4jc}^`&D* z;S!z1&}*ik^^ru}Xa4Uh`tJoDt%wA*7dg46BI-H0On&{>duUXEG22d4aSq@MrDXVjGpxd+WiEz7RSMFJj0wgd8SRlKcN(6kJt=th@=Ds6@JXF4wnmGhwPQ}N=uap;xcz{?zvVIZ2rWBT-QZKHT z1UlRM4X0pJSX}a>pJsXZfXs7ws?S7P|iVMml5D^l=#<8{XcgPbvIYP=O zbm=7ni+xPd#w&zpmU*R8%3UF_a5-S~S6+JzbN%_RS7F-lm~yqXg5(qSgJ>a#a6=rP zY(RnE5p}q*{-*j*F2J^(Z-K(5?_Fc+DuX!O_8=M7lgail@B<%;5^1Z(;EDFox$$J) z@IWf`0LZ%r*BIG?wn5q@C|~9#Q~oT_{Pin|i&qh?W3JE^%C<;@`04igqz%AS^qh;b z)ShnFr;B$Xi(ocRUStN!$Q?3KVbb)qs~OPQ240AC_9fI2PM;`m9vETL$HQ4=(Z|iZ z?{r=42YmV*5t@ji3wn^sb#uIr#}t!#DMO-DXw&sWmC+d5lS;VW2x6uYfxq54vtPf% zO3AX$XN}jOE=P%7^Jd`l`Ge!wZ6m3PUBz+|;h0J+m_@rj6Pc$=$607}qoK(i{fBzf zlAT^X$22|{0|6YG(^jRefHxeRB-jT@Mmaf8?7n;IgDsMXCW)+;a1S|Q_m6BdA%qH) zAoIQ_7-TPnFk#aW-<|4PrzDn~c=jvF46*`p4#G}3izWZ7g@tyIiufD)l=P)Yd}5^~ zr(D`(%I8DZgH6Nvrz$sX>}%dSULGgV<_%CHDX}`5o;l$}UTp-GSzdA`FK?2EfnzSX z0-XVjludKVtHm_>TGZsUbcv4v{3EQOo*IYN&MHf!nBK3ZPvfM@(pTm?u(}6GolGn-xc8cnu1?w3>8tkvX)I(;PbU&` z4-mvA*mq4(Q8bm8H+r1&N4XB|x`UfrJ7)@2D@1UcYR?AI7`S}&lhspdDR|W@QQP-7 zVs8DRnc%@%Opg&@E8DD{#(MAGLs6Ex5PFi0k`IBt2zP)g)TQ$NK;Y(bqfF?3#VAji zC|=}7V^-PANlTfm%C$@xW#7*Y3`w(a!ZFl5dN1yMc;A`JgWZvB0I~F*Um)9qd;ig( z>e=B#0+%P6?(vY0{84sxkte_8;}0g0N4aHOUczRNKiae&+Ol`DXXqpnjL zJ$U@tOaA!rXpy(vtH)mgB9H%D;_^}Y`gk~^^|<)3$VYYm@z=Ps_J*(H}Rr`C(dEdeC!-Y5AFXL9^O)!0j{8?j}_3iWt`|m@MXU#Md zw@scZzhTanZ)q&vopN&I{XBWr*7K4hP|q{>vDEpS(JRXR)qnH5k>~H0xP$I|{cqv4 z^}O@2I4ExazaM|k&bxugU;E=RLV!pkY*men3Aj^|%#lFf>@Y}zirHM)e<>dpN`{D_(CK}I${EZ*@_ zxQpu|AJnU>?D|Cgo?Svlz4_X?67WOz{cg#rfiZz4{QUP1AkRhnhUzq%;2)!F7LfN3 zcPY~VdZYjH;XP(0NBM0XqjYAuuN69$ZLk2k#NY%r5(;XAPaHTWq>kT>Ww2;}zvjks z_xo41)yJ^(r5kj@4(7b{gi=lFTe!3bMk`RW(!YnS4=x*#N!w1BCN;b_Yi?x3gnjH0heP#mC_8xBFUGwcXhT${?~{*uM^ zeVA>kfo61(+VeVJv6g0Z1F8!JgdtGBLX5VqbB2sw3ty3jGQcv*skc^?IYI^eEVqbm zRMjY6{-zC~oa2)v?%5F-e<^*OmJu0Ip)je*a&EzN^AK**r-}(y4-IB{g9C9~7x-|v zIza$$l?u3;ni?AyUlg84rbEV`2y^g?Nmp!rtT34}hjc?$#zzbVw>k3c#L3h1FOm z9c@h$I;rp>O(-#nKIA|s)4J(9?+q&ZW6=UUuy;(35(hk4rXkVX>g8f8rNe2; z#pMckro@;61*Uzyg>hdt z>(CJ>X;E~(y~t(g)ylX)wTjM~a<2ywPf%dxL4M3h6KxsXeVc!x4BSA{Q6E>nn{yc- zD#Tzx9V|@+U!r5sRA|)}o>>M=Ed$#mF+5q+;SGXPSu$O86n!m5{Cz^646DoQ+_-YA z%s3$Qn183oeGZ`POsn}UP%P>AV$;XWx%}P52|wOSaS&~O+JoFN(n?{BSY;B})YCl$ zhQrA?m@KuxXEa#Kibt7Q26)Q9I>f)pBv3TLUF=Sa12G|ZwbYKZ3oQSz@UAY0o4y&t z?zRYI;Q?&lR{vOURW?g!2g%=ios7!YZ6@jZ_nLO~axpC0IrCByTeN?9i$+-U2pDMP zf0H&sIgX?4PSH;4r~H;SY!!Lv6B6@YDIM)M{^{3rP8zf(mWs~IB9|ndJruLwYxM1W z`|Lc?<~6z8WB$o9IA~Dmhum56rm3)8czG_REeQZ$gj}F-pYk7NF}cx{LjK?*%o#QH z!rYy!aHnpbj%!o``Rl%UKtr_DL>ZiS&}MbQj85L|>9{pS9^x{tp%Ce9Gs#a5jC2e= z6ZK;hkhN8a(-&I>YgZhD8}K)?Tfm#80u9Upfv5bWBkNNQ?eyGuu1Tj93maAj2~#9(6T^F=%pSUUs#!vAsjzIkx zKbA$nP$b4AKWsHz!D^DuY1zrS0d1}zg)37*lQ0`3p3tyBc3yJew{w&?a}b?oP>5Vi zq-+I8M48JZ|4HH*qD^2qPxoh(o?x2X8(R=14cl~S$;ex* zsC#a_vOuL97_Bru&tDj4~RfL^(hF#+GGtoSp`>kG!Lb*E;tairYa%XO(XTn^!laFjx)-L{xC+CE?4OoQnU$;Z{5=LN}xrkrX0lxZ&lJ*|Ld z>ccFxp;i@eVUI%le(##_!cn3>runN2!xW|zqvV{L0rwLm z-Zqrtn)Mt`&wW2#JO~?)Iqk7Gny~X<&Wd2naLv?fB$G64uu!h={6$lKQ7yh7nJs>8 zDrn)e0u&slmcYFb1V$ce{wSWK4bFmv+P{NN$)O4Z6?37#FW0csb=n)>>Yaf~&Y4@7-iQ2ED$!VNPDa~@3 zWmzFO)+#fJvAEHepfH6TAW(VZA%@4Mz!Xglsm&d?Mxv~}nW9*?QsJ__liVFUU`&(_ zUZL;t>gAm>X4GQ`AHDzl+{V$6w|Zi&`F240;^tFNR)5D6faa)1T(1|?69X~muY#Kr zg^WZC)-qIqJx>Yy)kjx&^L5q0A^UwMB%$#e!v;RG_yU#o`d+&W;*XL77(U+7EW>v({ zT4L(8H<$Nowk490RgH)MctZ%ju)@+dH|mVw>DppUofyFgdNQFbteEipFe54of~g>#@a*7tRfFZ;Z$FupRA%@`Ix zAE)+Lxd{L@x~_Th8?LuT&~*WQIRC|RZoB-8VQ~-9Ox3Vvb`xlZs1Dtst3O3#`2=X0 zW%&HM_;((&pygaNxzacpT)p5jG>@*CBarT z40Tc-@>_IvRCgCg{}OWB#+yxKf^dVHm6;4zIQe;bSwGww(S=NBT+t5i`TBl>Mxy5L zpE(jK?~&y2i+g$GYtZAKk#|8v=sDM``?hCDSJ512OGoO-%VEXE`-po^qQk_}q1)3X zFrGJd!1a&A>`)VB;6abdzt(bXJTYWtl@q_Ik6$&nTC<#FrGDs$mk${8&AAsilj`W3YT`Jcc% zTf6-E9`dE@{m-c5y=!hHn-y8ttBm^xfo2EMXUjVqr>`etBcgf!uG2}{vTfrxdU|Q2 zN@)waFP`6!Y$NH)AJO60E?(bUHa)s(i@xgUzAB2o?0s}S7>&Ok?Y^G4x&Hj<-)!{1 zuigKaZ~pZ@B633!zvv+{KmwXk)N9c<7u`4iZf<}ac|8~i38O4dtfViFl<7f)$rP=0 zB(Q zcqS9R{jR-X^K-do(cP>2ZTquz=I^4&iu_$ZRJniq@c!0K!Ch_x?;7fP-d|t* z{vl%>o%iJG@3nVriM=%%M6PDzeEyX?iSg=ec+G`4NzW#h@`+kW7}G!Qq$o14^Mz=* z+nZQW#I7MZI5MD|oG7r^1VnqZo3)X2%F>JGr_SZX0t25Zf|yS>X*O^)i@|H@A9C!` ztn~c09Ln;U3tXz=&AS{a0tA&xw4zo{pAZl}b=uUs8ZJ*@#?+_7_c_jC_nByk6++EKTuxNHBJn%ljJtV;B&TebDx7_h`p}qbMg6950Z@U8>R3&qkWBtnVxH^ zgnllzxk%i|!6s=`=jL-~DBmYZp>#^6T=d7j3K3W5ul#N4=I&l-6;PF39yR7#)g89! zY8_|w<|$ENwLa)&Y9}MROcSFU-Rq9N(DgP|o(}#O#jLidb^;|=3Mv6=6pDoR()1}Y z0Uw&MOuRHp0Z3@!ORPNIDX&}n2PuzkxomYmqN&pxaNt*_?m1HaUhabilECig->=<| ziLIk~rLP1dXk8;LKM-re0{?C&`=qMHqHb4^jV%&D6XrVYj-59aV_q6K885aMltSWc zZl@nbtEs=H`~-!H)lj^C93tEFrgL53%=z6S1D?D3J2OWgO#&A->EVxOC^Stxv)%xX zn-T*>CX}O4tp74?;z+!hdXLktCf}FJX~2>8UmTe@)QCu#KbBKO`50`|IMX58ZB!kA zX%Dx#j;kK-Wj6w-6C|4yU{kE0FW9xm#~ctw%-FX~s?sY;Fw^1`NY~5$^b7Z0W<3R3 zH2P4q$GCk$iSG!1Df8AsOxg3`F=c71kVeA>m9w*F?4x%+nX2yb_XHZnI?(>q zi6tk>Htztuu#~vv&4!zIY^-8x8P2zTkRIqBI{BKka5xVOmk({rpJ2)9f9hIOexR}6 z8L@naq$nwH-o-N|G*v~lEs%Q6tDGBOixLLNqWT^bC-8ju<_~$749_~vPW6( zZ^u^LXfjGa6I4`6SPi&P`_6o7&rzZrK|(xgVC|jvM3@TTI{fDgtebrFCd;4wTqMh2 z)L+$HzS=VzE8|SH?FIbrj9Tp4=JTsKU&0IBH(;Fa zcWYDy_%mfFd!hWLgJ!l`<;?3DLwL$wub++TZj??S%eG<5(bE?ftuQKL`27WXe~pif zTWVFI95UEx4VVxQilwF?o+C#LF12~*{z8SnNM<2J8xNQER3pFeN!fPKE72dJ2#ULY zK^R*jrhFq!fVw;Ier-i9a+W)6I-`;!J;S79r0984QquHehKZCRV;O#Q9Fg37Re~8><1BBY%Q+8KP2$uX0tTTE*+z_Z48xjD}LsDw>3xnZ2|!D>o|64I77@a zTd&%VKWpK~Wn2^G>yi5pI)e_q-UaO{LYf}4Pt@)y9xIQImzcds*mSYsBz|p7oo#_XZS$DxV zB`syMf(L(h*wDp~rt}!r6u))bIIN;t=Nof7wLmFUjLjBTa1=b^W)Plgc0?nfHe8_- z9+OY(nx3KAVDbc_>GH@AOBrI;_s3~9_Oe+FoaKD0%^!2GgKWe2%e6#fBhtqZ#sX;npX`XY1Q&eCY4zs zDpo)W$&)CxU(;UVLYKOqqft{El(A@~E`$zL;nqT=50h2xk&mO51|B8C`+y%k$OL3< zDO=T)NN#oM;Y%EFA{0b8o}83*spoet4nz|4G$WjuiT)>^c+orU>K&>OihuHbw9k_{kl32fpDL^%j5eLe zwG~CeKVpA}H<(S$vDXIS5ab!98neIy^A7?q(|QY|W2is-+6;jdjS;<-6g^^4ZWE~3 zF=n8O!Z00xS_?2$gDMPREf?b4hHtM$)3C$tj)30SAo9@ec$jnyw<=n27^I6t6$Qo8 ztwTUAi0+*95&FhpU9S1A+jK~M&%%W9O@5$md`p zZ87NG`)Jww(LZ^!Sj34mh#Y6uoLBy4>90ZFBE1q+h;+rExV1?Aj%@8U*e_>>Kj{!C z$`m~XQPctO&e92~)9wHulHW5!3mEUrxs*5(DprtdqlEp5jDmc1!xHmJ+kF4LRl09T zAHYDHP>`SH$`J9@sq{DML#Y*|fj0AZaU>W8;knas=bkL5AO)3pc1}U|Xkk)Q{%=*3 z2#r9Ix`}=B{R;4d(mOnw<>o$k#lk;6F!qhR$;X^Wvv(`0KpwM&<3x-N1>uR*w2%4= z?ot|(aDfs1V-QgrvL17*v%Q*0&Em6A)@=_~CT~7aHw8Z_|QLgjRmsA=Ee1U_U zl)=P|)pDXWp@7!YJ}!YAMVl|hxk^SRoF&v_FKG)MFoS|W_Ehy8goPaufJzE>g+i8I zwZ9jScxy@p#!A(OguJj)@{S`#F1S&c^ry@q_rPL>qkTn9oR_aCwO=wLO)mT;0{;QXZFDHp= z$~0;wOlzu=YAOqBYR77X`Dz?8$c6xj7LD3Ax7xQ!wH-CJ@5XB1@7Hz{*Yyh2^=s4( zy47{Nk$zpHOH?L%gM?cEUw;;O{YB&TtlR7Pq}N|-UVj^Vy&OgjvLz|5t_jN^E3_eX z`C7B55q)JtT3B2cUScp=Q~#?I+kuWhzN}#tC)(9$_!ky*WrLyZqjTJ8fQE-d1RKLK zjRfP3bZ;9&O7I30-x{f|+$i1Y5SmR4B<{54bo8}NY`4dJnzXDW&D`M*9Of@B77={k zTz-`?Ryj6*9BO8jZ=T$4#<1U#f34c7X~mdYm}Kfh#aqNHc|rayQ6;$^u24(Hycko3 zxQmv>EYhkWL@ppGOuUs@wIYB^35%#|luxGfskO_a7U5|YWiGQt7$G>nixb-r z7MdaQ8E9F9B!2Th;sV?9-BCztRSH3IdKhTpW8QAELx{uxtm%LTl6MV1fZ%k1f>>jG zI2{gOOEGQZVXy|#FhQuRLv1hWnS0+2|9MBB;k`+aN#8^fbDTuuOOXih(S=7cXTS`R z*?TH5std?OIKBB7DeD;GX)II#O*oQR&RYz4@k`Pqz2ql<(SgZ>supe@r3XI+Wkf*= z7nwrG-wdm%^jC<_J74SxmJin&28-)JY5&4d$X;<9duBwhf>EzcOHkROAX zVxT2AKp-57FKq^>F$0wbk4(4>{^@~?Gf?-*N_m= z;*d0(I5B3FL2k0`HH0;QM79SU>qGQB!H>?DNWTXx>I0}ygUu1(a5`Wq8{ZW=w4}#~ zFdUi%j~3B^T7=O1)k5R-cr-GFoDC6>&HUZ3YWoFcB)Qhc{ao?r;;2A{U#5eb>p)O3 z;`PDUYasw@@gV%i8+zc|u4B-6zLx?3JXB24YJ;W$`q{f6+Uv#_hQ>ccQ0M``87Nvz z`Z#bm{z}Z5HV-Cb<3Ix>GD;Y^v>_eibD*g1&vA70#}3?kWAed2)tjVb=@*QkeR z+Sn=7&S*3QXpi~k}fr1(?a5;Tl`qw2C)YcTpU*11 zn+*iM-7p^U(?a|*0c#O}nIaJ7o`}lj1nu2kQ6KPU{5YcWxz{~7nD!aqlM74&1-qG_ z=z<3*sKBb#7*sY*q%Dn+j&ec@<={XLAE-#$^Or=_D(6&&kH>_3eLx0XU!Qr-+G1u~ z>cZP15I*M6cSeYI;gR(AVg0pnx~3Hy=SBUs7K#0tf3IJEF+f zl%7Cmb|O=Qhv_ljs1c<4#~`tuK>gwr{GAD~p-wDWeN?LsR1|)@LV)^)@U1BmGqXy+ zaFr09vSwYc5&%?V!>nOE;>2_25%rRV(*v+C{caq2(s<_QS}QLj+e@@)eXh{oYAKd@ zbM>Y`->%k#QSJFK42}FApaAe71qLY|I%HX+W+z*gfnw1_wg1)#(;c;jzy#?TD+Ht% zF{mCImem95J=AfNn8k^#JXo1BU;0i1d>ao>W_b?C^`TJE0b7JDz41&MXZ<`;PZ66A zc#{evL>&THr)~41uHaD9-2ibL05xeBEjvsI@F99rsjr?TiJW%J@}Tv0M9i0D&MDl1 z6hejZ2o?%o@IqWYf<0LvHZn1o`tBZ-3JHZqa9uKHBl=vcZYb!wBHFnv#aM>5kWC ziiBK8zaFlfP40I5*tG?|rC9OL5+l;T#b*aipir<}ly}!X1nzcTYUs4+@2U8stvfrX z+G`-cYKjNZZHQ==0Q zuzC0i0%z{e@+z$EJp~2{2AP7#@?F1%c)LGJzt^+aZ2<+n3e!i&1W}w+;bDFUDGKnM zg>MsIz0S4%{$6akV+wy|(ZEau2Z*9C3K}l**#O)Wi=?k-LwmhCp293bDAJ0v^^mY` z8+UCVm$HT*>3C97Z2Aw*&0`ZqUgIf*wufF)bZv4?I z^PwnyhvMdJmGRX3&!2{yF3io}4>vay@Jk3em&w$cd@KZ3;a(;%>Id=MCi) z1}U%2h0otr)7h1ua+ywVs%P^XJ}u8jYz*ZJI!>0Ge%aP~c0cgv=GR{iACpC;Kxd{i zySnA-IUPBr|TZ^+lj2mqSpK_be9hkPd&el7An>#db_uZPT zFrWAOrjAE{5XeqC$rY}`Kq+`E7LIKP$UT=A7yfQM)aw4jU1{<4)bV416vfhC%`XnA zPerjUIpe=wXI>dLI4v)pxi2(1eyX(m_Q!LnBk*W@`P*Obwca=iUaMzsgngKmA3gaq ze&N6Sxk9_jYWXto;A@-r&dTyt@bUU!8n5-rb?EQC*#_rTt8j^_R8Fr->s5T@^##A^ z{OamWGyqI3R&zlhd5nTk861n@X##n&$itn6^KU%Yf zxsGQ1KauZk{?bOB{JNu~K+@)+qex{qGb&3L`1`XWQ(SHjh?m$*HfQ#U)awp*4BIVR6v_aSpGEqB*f)*S%S+fZOta!z z=9nCcV{=tO9hf+Er!b{-%~&-qg#3p7A9K-y_a%lHO7*qG0?HCQV%nN~4r1@#96C+k z(OKSn+UhA@1I3WgQev}nZaxP2N}qcOgHWPaVgb-Pl-&*aY6DFR?}%Fny_4I#g24-^ z-^ztNw$>AQE87R>1PD6Ii5X&j3X(>f-}i1Y#@ZYp%|fa-;^ig(eARe*WLglXs_^1& z`ew=#)0Yl4F6)WvE(H)IYtm_@Jo;d0e3Czdn z(83V3FM7@qv>=9ERsjdK&SIq`0v@>Q*xhS2C*QyhV)@KBhB)i3IcH+JH4(maa4fPd ziQWWo;4@X_FlTD!!Y})iDVJ95RKV>#yqFiB|8;ASjr?Cw3wO@QoG(RY#MunAbi*^| znHnHtI_oXB)lv~frhQD5u~{*Sa*FBL|M~pG;HM#P^N@SoJKVT7-i}QKUg@X03XHD! zgF~h~@@o{HtwfaXdJT$Ig3)`e$-_eS?4$n`nbM>yKZ0ziY5j%AR+9JifQcbkNQpAC zQY?;F#|}x;wMIpG(g}&5((0tLCAx{_qpD2Tga+<+3V%87zbwjB+-lCq$aucGvf9bMjtvS|EC zqK%T;-4t79$x7W+cL#f><#QG3A>F6`<(%#*8L3aJ6B#Q;2Sf1dtSAD#^cXG&cCt`4 zB_6$uey_aEPPqrW08kDl$08ZIkgTI z93j0LCPR9;E#;2Fo}ro++j@ELHXTJHFEnik^z-|i-nfp%ucy; zS|2M(6ozVfIO!LC+jP43{zA(qUjNzmE=LJU#6-el|J+*%Is4MZlaL|(7r)A#X(ola?7~#YsJk>m$WFkC<}+_rZ^dtF>Sf1 z%3bP)NEnoJR%|Ib5`B(UYkiJ%bk(%H)XN_-sJ!!XNdc(|8>L!2&mUqRRTK=2kb;i7=zq z%CncIjmj_?6u!?tb1hVZQ)hTksdJw5~ic9qoPTo|D5o=W9LI(pc% zTrDJnjG8B?4~(4e8)HA})g=xJI>=p_PR0Lup2h7cA?R-Uyz)+I;g*o8@|D@b(B0P+ z6`taPS30wm*}1PR>pUW_%-29|Z~Dn9ZHU6*{kgyE>&d+QpI=#|QW|%@k8rmzO#F(G zZfiN^8mQh-hw*>B#ctU!%MqPGkgdf~1sFuGYzixYGXC)E`C-6e^7w1BzX5TERYGU( zD|{n103ozb}dybA@R^MWL8PY=*?~Ei)2Z%hf1=z$_olxpHa#op6AhrC8O!+sKPFu?b zQ+KFhk0HE}p0RirdEnxYCkpL0fas{IJgQ@RMF|*dqoCwMXw!fDz@yuIyZ>xNXezg->KbNUX2sU?H}WL9?>q&* zdOl8uStc6bsct`V150aH~L~CI_h_o^}n={fxnGx ze1{}2FIk(0I7Pf)+Q|0(JKE8|{_d6axV`%d7XNtdk-|y$P)lNCe;QP>M^3(Hvp?~I zGleJsC4xbvRQKHUQ;@ZygnE0DcY9zn6o}tF{6P8Se28}82RxrVRcxk5b*}azuDhLx z&LW8^0^iGRO1gPFa-2>|%O%f}opmcuVjZ}ZkZ{UZmr0r_@I>^@qOb(?(Cgb$c6 zqK_K@1oXrRJx=vU0)^pmqC$%6sHbZCI6oJ_BP5rC4VQeFqGGecJ#_!B3y6ju09fdk z^&#hHhW#9ofIT2>wQ_%YjCiY} z4mH>L2&V`~0)sRFEQSWJfiZl91iRqEk>2w3!8mC`1Ue>!k2o9!0`*||;1B^FpwSE= zw+%qQnlw-h3lbZOZ6xGDgP-ydg4#hSX$UnE{a^tWB#jXYNr+h(f}*jC_}eC26SN** zV&E;d3_wl(b||92OcJR0&`>p?lM>D| z0Q{7mFl>e}TpANQ01M;;#$OL9p%XA-3Gnmb3>`ws;}N;_^eAd|Z2quGD~@w22CIWL zkObro$Y-L|`}l?uJVp~GNdwUsS#$#D$SBrCEu&FA6)>6{04ozBN|zj!S%;U(!V0q! z>%i*yTsZVhf?u^pMSE{GHL2@Ia4bxX2L=S2p!2C=&IT9|5)B=Ru}B#al8(Ez8|vkc zw_A)EMGW53Gr>B5MlPJM8m6ra6oAB(J;uGHR*Uf&#plgv1leF|!~mcWjBPf~Zb>y3 z_SnDxAegQhDUBV1XvC;##Hy(_dyHGmBvdF7_R69KeF!mtiM)uxIMT=Y)MJ>1agdMJ z$C-rTl*jYGRU|Ma4NAAC65}5RVrHme69?my)G)4mHEtw2p=%6dj`NHdZGnuo$YQ;& zVGK&RW76JfA?%j`O^nIJT!hvv7iQ>SXz?*He_(vcKy!r|w`wpb2!E1^R0B1F7Y0T- z+Chr&SjrG(%(1qhSgax+_7+}fVF7{|PEd-WyX!`zT|PwzD0B2+-5vu$=bCk-K#JS_ z4SJ;nwa2lj1VuiekaVn~4Kz|MfpQK1Q4tP-JC4PmHSt0?Zay?6i>Cifg0D0L5u&R+ zr53lViV%h|TB6+yR9rl?1${7lky92zdWd$cq8h|tLFLxrh#Anb<3dBFrW9jGsL<2C z5x~K&lDK1SfE0{eSQk$7nT>4PPj)yeWfUigCN=zW*JN@=6ZUg+a_QMf{S1x}ERC(k zrZLF#3Ip%vO#kM>2)x&WwIwK;fS}bw$~ZzXnlGAXBYU!6z{|rphc7%nU$RUH9X$pB zG_br_9n9JY|MSTfA$^n9!EVU}C<>Fjsb*6CsqP~dApB8iY9vW%4x@u5)YAPt@QF%V zBU~B_4H>a~{3T8Y1jR2HVjGpsX<+8h^rkIfjDbcm?Q`rEh6L4`=^u?+%g6O9jJ(b! z+_;Sq$7+mmD(1gO>iIJfm|0NzY?dS-(9kHAdVWi2{?D^%e>9NheDe0u;t`&SL(ME) zKZ%6Sr{u>%)BvipglbyolR8+b&AfkraR@gsG)^sSaExehKD^>nGz%_jHlZj7nS&xE zj5M`-_Vt!58_&Gx$c-y!UX-6r;Bo;#mQM3k zmFyPGYTC&Sd^c;_<@u?9>04LCi0AdUFvrDbTo(P$4GYlb`vJy-OG93e(YZn65vie) z39!En<{@q*S#qx6-(#oNNzLWOnB7J1YqRGxnB+inUaebo5;*So$)|`p$up}M6RiB^ zGPZGWC}Py(z`Sl|>;t!c#Cx@`5!OxytKdeEF3Ljv)H3WqgNEDs+0t-m*PL{H8;%fMrhjayle&+OjZH%W~G!8WFN;kg`fVsr5QVMucJDCw7r2 z&}1OY{G+|-i`D$PRh6NM-H0zNv$ImH_a5Wd?YkVYVrw{$nDLx(?h%lAm%1Om7Dg0h zV}5OqA~&5mgelMhZGtw9nAZ!0*WnMhBBa3i}Hq40=5jy6Aamv77Rpn`I#W{ouYbjxz{n_}sjlY(0S0 z$p~-P^L`dI^*Q`J#~+3<<)I`mamE(wnoGIFPP#M+t8k)C=<-3yE8DPb`(K71mCta~ zvo@zfxU`2b5!Us{s9lvxZGW{rLOa*IyNP=q7=Av80H12uz|N6@4uLSpLw3}$d^kxN zkS4q3;xuF_32^h65~K&l4>=}0)dKazs6YG6*oI|-etyKdNGIoj*MVswUk^1I%yWq( zXv;Z>%E8P@Rq3B&|0y}!#=G$aVs#s>mjZ^{gRty2gZ?2vUs*^j#Ff)m12pAU|7ZWJ zr#mLrNKVeeJYv5@3*8wdGxg8u-GOd;dt4E_^9U_)^dV&I&rs!4b@Ks`VhA?aW+(dh zfg8m0Gmj^|oM%?ZrR?e(EWl+#r zN$s7F-udzDha!NVPYeu<9^d@&0qiW7JXf=VI4{%g|9*%cDiulcQ#}4~>#+H0hoRR5 z`G7;vKQZ~owAIHXyqc3UK2YBycBP6w6JMX4iCtylaMH|IQG1-$Fd?@OwAoZxi*NjS zI01@8-UMGs+XRkktlL08eEC!q@!{FI-%Fcc4Ct8g(s*dMui) zQuXMH3H9$PKxaOnX!paB{v#vrK;!7MQ~U0Jcg`}D0?oS5_FDoi?w#qZ22wC1e8ei= z(f{d0f$bj!IcNttS_j<%O6?kwrvdENHx%UJ70&qlbf-^2o~uEU#VOA43RjABV)j&$ z^&tO8f4v$=B}s$bcuOqWgGl6qLq7$Lhs0ah{0%b3>G%B!J^Jg=of0`5EYHraofaJZ z=schy1xt61F~-H^!DAntkB5ZBH>44lguoI*qFW{)2Zo(QV!kgH_n?kjYw6#jlS{KHXr_f0sy=jPmxA~cjOH1ll;mN2wWHMsxL^#nX3 z#yY~^J7V|~>Bvs-=uXgB!}WN31nyJB#9Pvoo$G&U*X1@KLF8!x;NO&S$n-qvr(oFa zM9tzVQ1BKd%}X?699bZJe!Guv3=d5X`N#s>^&tcC8z+8_j^y$UNkRR4q!Wu>2kN~} zi?RmGO^vL*{F{u#vrKLKqwr4~6L`d;l1-wvMN<~6VKa2TNHzReez4q#vJo!f@D}=| z8p#nd*+dilG~_Y5vCJFUizOg(dQk1d-XBlSrjWwt%Q2WlD{A+#+Lv?qDeI#l+-I?M zB_5;42nXX$@~$)y@zO+oe;%!ZFnrx%0r->Q#0x3j<~!=-YA>)mSn5G~1Eg}M=u3rE zfk1)T8lwg~VR}C<<*eH!ciZU`>-&Ngg~v9X^@-^$M)-j*J8j4gmdKG8T=`xa-&hP( z5VB!;HeVaUznQ5se&+pN@F4W=AEKE}86Ft`g=~$eGKFr{d`EPd&h zx_ayWr^4ZPJ*&+b-o#4>BRi2H1i2N>W-J+Rlcw;jgt3zHVa;dL&3$I15-Io@O~QhWoPFy=B)ZwXM{)*eICS z4;7z`T`^JQ-m(f;+f!Bw`I)1{Nd^);rV z0u68ZU(U3d<)JGUxHSSj?;=vACfa!z@9x{DsXLtV8Cy-{;EXwxEMT-$kF|bpX2wvO zRhMYq4NWg5F8ED|E~YPM$BE5LFwf(8^Ge`Bpf9#Rio3ZjmnBZv+dSB zwROcRv6{v0LLYJid>(6)S;k0nlF)Q!WbW6Kjm{1g$%BSp)8-BDNulQHUGyui9^Ffp zp*ogj(p9ec8Gf(6qXx;#t-C2+F=oA$#QvzG!Oe_{^~DM0O}|uHVQL=XTrCn+u#|gd z+3i=@2KPnBR!eAbHCKH~6n-`T6Scn;m^MbOKrPNlHEePcq@;$pL0|z9$I> z2F3RN_ZNNZ_h<9=FW>+9!fB_eRC17!aQ;2Z`oqOe*~<@?KU!AttR-T6lwKeG1zT&n z-JV33q$_2}R@~hFWd$)Kfg~zb_O>H$C+6Z7?1+(PmB=crv*CzoSL0Q0MyADbF({4-YL@z?<}YyxN_|y_N9pNSGLP`_ z(~g?b3gmP~YzUa|jo<%}$q`KID4ZOmX+iFmHx^(k8ol>Xh~P_d6E&?!^2J+w4t@3U zrEOr*#Yb-ry$p+j3aMfHJ`bL(qJ8S(d%b&;q$>Ix`9&rC;|vAXpQ)a!oAExnnV$>> zWn)iLVB3Btq<)K8;vd3PM1FUaM=AWib3@9fJS?Vzvms}`@NiI|Srjx!_m?cDxIE&; zo9UvhezWI)Q5Es<)lm;Jka!msFU%+~9hsT^l1J{9jQ)Ol&Ml%zcmkrE>^4)zA@xeb zQb50Gf2K-8s!|RkU|8#BSUx9Nes9qA$!v%Ii>NPEWWar+aksg}fU`tx7=*^`+)(HP zJ4Hwcr^!11EgnXyfxyjIc{1(4i~^i89eBaEHw)j}lc0Aon;8q0Nhk^v4&^V24d zStNXZ5_GR!$9J7tC?i!}cAZF1t=@K4ePKH&tF7KrNM1+WoT$E+;%W`d`qKtaC~J~i znr{g+jdNf5^{_n75I69U`SaYfhrw+muCJM`%`JzY9Fte84KnQ$_nrupckQx>VF;)D zcpbo0N6=z;DIC{Lpg{b}RFLKcVBJIAm6!tmgDP_eOsE*rdm>jC;Lk_c@sJk#hXp3^ zJAFfZ$@cBP*ESAkjf8S0f5@eW>d#r*2}a{ZyY547HN+NcoFs4K(%K2x3C?59xymZ9 z+6Sl~Dw?QHVQD)S2!*+>3-}%@Fm^RUMO`qRysG!C?_5$YcFk_U{$$msbdNGV-)+E3N94mA=6|Caw2 z1do#$crVYvG%)h~#a~nN>g~IPKE&tb19D-cTakC8Jaje^HR#>U2^o zuA_<1Qg_KO)Ur{;$8%}Vin+Ju*8lH!x6Ie z?Wu=-XMX>OAR!OD8$+zoQY)iHY;tN35pD^fAxV695YS&TUygLb*FNG%3LPIy5 zKnzr3A%9?h;vFQr8SF#iBe{Heg^Z={Jo<;Tj@%$F5hZ^cmG1O6T{1lV-@|J(q34&5 zC3~M%wp}!_+V>U4x*jmg7A~ zaYJ;u#yKHuC^j-l+i3UA2SKdV(MKLAQDz?I@USrKvA6-b`+*QaDfVG ziB!TM!U_l};jnn*?j8e?T{=r6C^(XCu>uQLHh=RK$kz4ZIh0<1Ln;+F z2lY;_l4s=-m~xFigy!j*=Ei2jz^2FqmzKg8wQUET7t>EF^|UWHX__2B7JYgWj`|O_ z^c5TpG`0-%91YF34DB3^-0)jQevZarTgF&NlcX(^%nFk?J*K6OW;I)8&5q`sTjqU^ z7Gqlme)5)!Tb3J+R{L94r;gT_Th^d$s~|^EBdUR6+m^%0PGH+k!pZ)@w!MOrgT}Ul zo|B{5wxgYsliRkFpObT#lk*3ZOVYMWrju*owri=ATg|pxvy**TuX~@Q$!boOQ3xrKoG3GDbuIQu`?@mFvT(AWvka}G4y3AA$# zvf?G{K?R5H1Y?~;l6FEeokI(ELJN7xkUL(@&f%Rq;eAyBm)m!yoFf-^A~&3)_IILg z5nz`)(I6Kz@h%!q>4IV0#c;S_1$MC#E-@mza@fb`qibSVBW!fcmaW{3t<>~(J(^HqU%iT1PYdY~> zI;Cp{<6Z`bYo@?nro^jE6%5%7DqCYOThBGeY%j;oHP>w~*X|XWQt#76AU$p`Khw3K zaIc`$wXkNdu-Ub!@D&TSD@i+AYRdKb;@p7U7Gg`~p;yMy`6!>^^Di#47dg@=oshu``Z3xtlVikjb{@76P+SKqG&;yZ0?=f8a9jg+Cs8!;K5k~Oy|JGM1fEa_zl_)=PTb zLvh?g1_ROr*q$&Rop5-c3LKqEc>j8E^h?3}x5m+LJ?}HKqcc12KW;~V{Jj5$9sR|6 zpC^g_G3t3_gCa>e`kT2ycHDD>|4FvgLppMFJ?;H(@#x=%H-7&Jf9id6d31vZ`2a|c z0aQLfreh$d4@mGBbjJrQa|~AW0p=Y&(&+&xiGlkYuH23Z{Cx<+j|pRZV9Cd@EFYqx zW1=!2;@V^479Wy#$0Yqeq~ph=Uwp{EHIivJUQqUs{qmu>I;H^o!bwixRK5tN69lI( zWt9*4k48$F6DmbtYRwaBeP0^$6PmwbRQJSb{e9`ePv~NN>61_BWtwQc#Tm+c8Ea1% zTYQ<`i6e?m7`jiGzxc9zJ7M`QPCMMhyyMGub;1VrLy|NT9*N&tvDrEOI0R2QG=15N zL^&1xxHM0>^d(4�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≠W!8ZlL(m>A!zJ)0T;f~6g6eT)_#qj&JjI^f|Z>a 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 literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/optimistic-concurrency.png b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/optimistic-concurrency.png new file mode 100644 index 0000000000000000000000000000000000000000..85253594c846f221366a20897350a3d6305486b3 GIT binary patch literal 21478 zcmd?RbySq^_cjVhr$~25NOzY=ODQNIjex+1X6O`3H-tY8E8DisF`Mj0e@gSDC;U?VALlQ-Pqs&e-n6Uz5!uiJo3K( z!CZgG;*Wu07^J1D{L0_*U=1&i(dYK=c!tvtmht(;gAeqk_}!0-OIaV5JvP80SAF#= zrI0oAJ*T&!J@)VT)D!75=tSOrc>VfyPHb$frbdhZ@mo36eq;5VUf~Bw~N@j$+|clqa#b86$h0p&K(UoIk^@I&Qo@F z_B2_-_xB(BP-1)p2LAg5;}JP|>aUj=9KgeGr5Kv`BWqx$00WgJVX@wKWcvSP#|rjz zsxE4Bp3falb5*|A;+45FbANY(T_<*?nM}_ufBb)i~G*oShH4T zn9OW6TiNP!xG*DoZuOhj*lO)NE^*U%_=CvmxLC>9g;-tq;}>(I=S(5j=W zdlb`RJo_d7wX5Qf4!8O*K9E3$#_9aX-q=`)I(!=SCQ;wMdYr!hn?u%Q_wl!}@k#^Esq0dnOpD9Bj+x{ZUuFLF7yF$l zl9ta_+tHELBh#Ixt*$Y++N!F5crYHNc2Oq>%~AIrRs9Y@s?~8=R-h|QeskrTX1P2x zkZ^oZIf*MjWROJ?`;St-i^S4Ky(bFJ;#^Yp0dUoReuIxqNVdQafg}(}2l2Y} zeeb8h1{Uvk{Y%6g_A9gJ;(48&nnkpW{aOoTwu59z)TH5rpYEHY&hGQnX z(`>C}NCnuhR)uV?E<08l==vk)vah@4>~~hApRNy+>}24f*eWj`F@EN!nhw}p_4U$h zi}&gx(9gne{r5Gq2)jQwyVDm8O^$8ApZX2yeiRh z)Q_@t-$wW>rq0{8u0{H>r%~T`cw$_O@27pPaI&{yF(QUQ2fanO!Jl+nu&3o=v8H}{ zbMz~{#s7?=zjHf~*(>{e)foY_dwqKYGP+$<0Y2>@Q~DW*2zz>@rz$H8?0KHF%H4_? zPwp>&cOPH9Nk-l=(sh~XDJZkUiUC`2zTLff_4*AYU0-0Lv&%HT^T*CwXgpo73U!GL z(Bvo2Rd1}f_38l?&CMBVo$ecPXrCwOrc8wvrW*KBbEF(Yvn+B;Mrrjgv)YV)Rw6DQ z0{n4{o2f)o2&}6rD+tWb#7HKSptu_&qvUje{K(FvnJf&B_ohfq(#A~D#2cP5Q!PB2 zT(flge3XX`Q||bX>Q+`5>#YNrLiS1MqWJZSrTi{8Noz+dHtgB;ht$xr(pYc#`=>?M zYVoVJ9Wlorc9U*W2H&!VXjTY=Q_m<0FQfb9++0c4)z2xHO!hiDU{d$cahiH`I+|?R;p#0 znTfcCT3Htme6Xk4b!I@6Z&*YY;4w0Gr9D%fOZ5Kz!7(*S<$m6Vt0;#^W0DS1rt;m} zriU=~>nOE3W7Y92z zzH2Bs#ajjUi~c66KHMT`IZDNI9YbwJN-U53sdqOy4=co9&k+bfs+pyPSfSMBnCsrg zmOqB+1jcIy7-DdMG5MM0xByE{q*PbkN3GvbBXp3={D@+>?q`Y1(X6F%3Q=f-vdQg2 zV+1FO|34rzY_77$Fgj{ocXA#jz>ni=4faN2ZZ1dV%B=@}#FkXXYfVCt#=6bM4?po; z9WTG7C7wO=hUM$}k@HyHw_gPkxZ8;{BLBMf?OL=8T^C=?_jBAg6|aqn)+K(=E588s zlZ~uVg9@GoHiRUfajmJ91p{v50ck_Rgn*U8=T~rR<7!d9gH@=SAQQD#xBj&9WnTQ} zk8aLrL*M(bbXe4tU6sJ-?`IUcpV9mPPd75L#!NE5*1$#Ka&azj-|s~yj#mI{9 zOoi90z+!oDlq|(VN?}6m+xNSNt}-8d)`AdZASJbIPHqAEi(D!Hx97k?xA8jiyD|fI z?XrG-WRU?$=tEtI<8{0y@&zz``QLKg33P>^zk|_iYvJn)1WT8*)eta_46qJuS*h{z zUO6&$179GaefqWx)8$+L-aJogS z|28N?DtV^iDibjWe65OLQJs?sWL7Pc2SSd=Fegek?5YujQ0%V+r*Pn#-i*iFQ{AwB zo}N8rW#3i?jFa=-s_6;fLBknf_kw55A5!+j3sk*|{BPqJYiD5#VYNpjWK=D&J}LPW z$-*7Tct3>wze9}wn#ZlB_x}E!&@!W7nDuK;NY&o&&Zfx1Do0t3naJ2rctDtJ^QIG6 zV)ODw(0us@Adz<#9k_@;~fA80HuYaJ8E_KcathKtXWg1Tv`Rh48 zz1iSlKmOOgdmaWMA4!MAFY^k&nv-esQ_Xt2xtZvzK2Ha7f!A*dQ93^@nC`Hv=_V7l)xAj053EDyNc=CYn)no{#-F`|7I^vlF*y#L#;5$(pM2h z|8=bIhIg+47iCVFB72`(Iv#Ch7(S%b-Q5d#n0itKBq5#GHS1@_V_8#IyudI`;#bGx zocMA7b)x_Pjo4D+YyP$U(f8YCNuUASe{aBx_l|FUe0(GS&AWB;N;87f_iXUw?pKED%1WWC!2v%^$*}0}4*h+Q$-ch2)&BzpBvM-2khAv*ki1$Oa zU5jr0$ypru-$PH7jKt~>qA^PUYra?zXaOu?0w5+J%T`*|_5D@MebnXry&4$4oz-!v z>6=lnhs{yVf6p?P)va%AXkEsxE`coiy8S}dXtvS#$gRDFG_-3cqDas6tdX+J!TT!S znC&|W|d69q5a7;G}y1t4sE-86b3q~ zAd;4q}p5iqWMq&qogcE8`h~z@Z+?EGKn< zSq!epRaEdd4#rmGleofE!U0G3lfh_6flTK>&Z7^6o@}h!3aL-}r@`-qOiW#AnX%<8 zKz0Li;Qg5t?hOGI-aBk-cp2;)DC@1E(vcc!GkZq$KkW7ZrsypvrNNnihy8rB1g74R z*24}K`S;uhz^xKski*j%m(4kPLOyJmS_g1^zg8X3y+6LoCpHqR;d-6e2zvg&lX}U! z#JZ#iZ}#p1O?~idRaw&eBlZO%lGKL`kJ#*L0X^yjuIBZ5(=UpxJ2)Ep@T z9RC0w^aCHjr)vO?_&dVf!0Dbyv`(N&2IfrgetfH1W@`Xgq5quD(DOsE zR@nm>xq4u#8vt?cQOpJ}9%<7$L`KoSb+v27z5esZi7+|-MCnj4TihA@nrhh=Fi0BK zTFdfsAd|1%k>Cq6XOMfhOtXSAqtuAL?1xmnvMitozLxM$rQE~}n{`+%`WI$O)nuPi zFkL+RUl94DrUrl$Iqa$B&&vduZ&iUUT@b_gPT_J{&VRwvv(?ypK?7IJG>z<&UA#uj5e zt)IN+OSb+|(-iQlRy`-8$Cl`j**@p3ZfjQp-fYe#$;fau6QcN9Eo z1wziZH!KV-Vn`bcP{gg{m=A#JrPA%%yE4?bNq|X8(gaMYJacc5k&22fF zjo}B-Xy9$wq-*+tu zon<#Wx+<;r(+>E*ue4Uz=21l|=aq--U`?P(`|%wKwKbEz=Bdp6gxVDait3^N6nd4u z-OdS}9hp6sH3A{K0+oegawZ)m<0N=ywVNojtbPVOpz5RtteDzGOKo;D&{*G^5<^b> z+O^@E&loP#>qyDEarA9uZ-0eYun7CJIZkO-VE7^XitvrROPrwpK16? zEcJW8vraGYqh6mKIJ|bQcFkWfnFDY`htD*wYJSjVy`DnQXCL^x{O{iz_+Dq*#}@^L zCOeNksszxnJ<-legG*oI|5hTiC@3oUu1maDg0ry;{9lW92GmW_#qeox2QkyTwU`5I z3tZQS{8Z#)`hZcICL8QquJT)5VJO6#1H7#j30n5OZ_B~4K5K8a;XUV)@ABpF!T@SU z9cWC6L&jW{BR%_1g-%PyjG{zkB@x;HJ0ruWeVw(^H0%MqVOHH9X{}DqBLF0*GToyO zuw~d>mD`R^W#MVFK(5?^C=pHD%DyY?(S$G}=1)b*0B<(gujbrN-R=@&clc^;q0ism z@2_imI$o2|e&v>o*PI0c^`13?QQlbHlSvZ5dH(-vGD!pTg_vkg!Y$nDuAy;8aYga& z=G5BBv+HPp=%O1DGP52CueR2L>j0rVt#E1Hxs@d6veaPTZ;)z-J}takMD7;4pYBW% zWj3+&q$A$3n7*|?49YWDDV#6j4>%d)ws>=%j|d)F54l|15SlWpvktfL8sogEP`Vw< z6twu8*?eKXd)nH2TRk<`EpXXO*<_z@{LeT$2K%7GQQw1$QkL6Mi}#P!6YA#lXobf4yz8f~3i3GnwD1S{dGCKcQpk z2iNdgzl<9asa0#GJLJqkQ6#C?-Co2^*d5|-Dbvi&Now7{wEOmArN6?oyu5ta=O9z% z!%Wn3jIZm=I}ci%&0ApQ zxgEHE8pDgaqT)DcFRFT zyrb(@xkF#}x?Z2b1ix3nPjVqQ?`-3v-3;eR9v@x*t_|JpK$Wa5srDILg)}=;g}}`q z4ZU}_2tm=q+0vMNj{$-fz-NmIbYk>b#zsaRHQ>j|@(o&iabq)K$O$X@UOYqE$@XiE|aj^ z^R-}X@WGtEQZwXcM@sO;g-V&_>WdFn!+D}DV~ltm-ugOv$9V8rDmaf;}9=yfS5B3M`OxEME1pl-QgmJbe zL)D^_a#okSgD!_{@3w`)oNPyud`89`q}5yW`K0A1b!Lxua^08L{2;D|mu^a@$EftOo8vU70Eg~nu+sqJ^YM(}IovHf&=tTlQ5^5i_vVY);n0w~GOPxVyeCn_Q9$FS_mBxpxj z!HRqD?W$*t=k0p%=~PYdyUvj7GXk`Mtn8hY(NRa4@MTPxPT=7}tyP^kGmQwAy^TaxS5(PoXD-_B%C3lOmFL{eECg`6aUy*FNdnAbjwGc;Dgvjrg+Z~P|9 zL`-5rpe4`BZIvB$>=p#A9$$gXCT*eq z_>@TR;hkzu!J;KzW1_`&Uu#GDN8E1FKqnsV+21jO-#!QaBd;()g&c##Fo z$rF|$?oO39v`!x-?GhL(}zJn0y!eaW?l2)5Op0IRoabG-g4G z&ywPs-aZpWsXbJ-EWat;FKgfwimAQKEYf-WqL?{0Gdc8btHzyv%N)Y!T)Znub21KW zb?4fi>+cg9I+&aO?UK^1*q1Is=0fD3M6EtHy>YH?UX|!;FG=92D@*#bYJm5$+{0}Q zLX4B6!l$@u5APgDM!JV9*sz!|-&b1^`Y z3C$#t7v0SRC7}{V;4YMTW9l_IE?h*J??jhaInqglMVGJy#6oYbtev>hr^Itkr{!wL zB;_-YrRMw7IJHHWi1WwZeV+V4K(Q)nClv` zER`Y6R+GPjRKTqy%rvh_e87<{Do9LPqX`TfDv81|HLx8{@a#5k!ifJk&rzK(?HN{z zqg$C$Km~zhmUg zPlo;vFD~fL#=+O`G&#+TI_x)Ob=j?uDnxnn;)G*nT61gh+7yAFPT*8TWkpVGsSQ}Ai|bBRUPNi0 zyb<&u{I*Bitzo16b3`Ocq>EN?uMbIBJ8>s-NBMo$$1I-k$pT||TQ5>xT}p1PcQZ^0 zIi|lF>R{&8zf2MrkkCW41UcC2>_jr+gemURKyu-XQA12}$j`xgFPH@vdD?OYDfEb< z|IpTKxl^`86{tk((%}~878ZR=IW6#p^gBlzXUq8m*}QYB4Zweqy^_|nF*baeg`jB} zx3<*alvm)Bij=Ml@ihhdSF`X1sisA0djoAwt--Q1W}1MHfoy_G$30(2hBB=cUwN}g z*KWc)Ik(km2Y)b%soab(f^^bn#42LsRb`l{tFtyv&70UviOoUSj@W_we6-Y$`?wc( z>G@xCGGM&?n!cHS2EOts5s26c)GNU><<|b>$DTjDY zdL3$&o~~4cJN8#4)Y8n`I|(Tvj>4U!R3plj3aO~Br&0ZSXPBLw$wjvGa^GMz6f4PcVtHW~IOpI=Xml?{J#&#t0XCko2~DpS1O`LyQh9=fI$E*pU1*wq437wbWY#hH_2qy`^_ zGOL0)^g-Y^Wg({SXYGMY+G;0ai_?;e)(@nXF6u{^LFuDjY!UC$7}q|kLTxCEh~?Bo z5}x8bvgmzvb-1krlsXrYEH`~VWMVmOoKM7Khqu7RGFpn-h-CNfA-3339QuVvZltiM z$|I`N90P+YMZ5e~@b3>pt*$g|ST2PEV~ieYB?E?7LlfJ3>gfC`$9Pxb2$D`dd*9SD zB9`C^e(+RVUQhrZN>D(g5aSIutZ%55->pnx&f*xQID1leC(b`DhmiNn;z8+zGpTLr z*(UVGj2B?tCdnN-x@_*IH{I}X0D11R<&`5n*GtFH&+-9YM`PQ2RQ3#C%9^)v7Zk#! zo%D(*FOdfLqWG5IBEMCRp4RrF1GiqK8yGcUKIG2tr2cB+-T^CLjQC(LkDZF~u@kq1 zMzNpVqG^+jL-5hNLlA?gZPrWIS+#6R)EGK|vgeftHreb}#oLXm&x6^r3QnswLxZX&^~Y#Z zXn0{F5znI6$uGi>eWvw6puoOh46N6O^iI0^Z)sJ$Ui~@KjH<2u`YdUt^jKwvNSUI$ zcxc%{7&?f2{De#??mhgYEkR{vrL&hyaI_5bzJ6NBb5k^BT5DQ)kQpxrN&53ZbExgk zz>hCf3raAH=cZb8F!Q5FLWM!f$;P0WTl-M+4}WxgA#~eQL>QT#KEa`GI?+^sB!0=;`uNdHl!!T6 zzw)~KavhYDWFt}H%Wl#uz(paN^qh^lyLs+$si?^BT6jIl#USK_RP<5KkWlH+)d~bX zj}v028EED2Mu?h1UymmheLy%UV5x~RRlg$K-#hq1NxMG+)a|=T$qD0V5t~FLwYhnF zw0c@_=2>ytR&brZOT0LDVnCo&p#vKGRIJZa?Q-_9LYqZ;01a`J$FxcEv&7Sx_KG7; z7Wtc_!NWzQTTkRblo3z&$TPUqY zz9Af*dbYW^$aTt;P1EPcrO@N}IdvX8cwcN#z}#ULSI-0-vMWuHAd~!w=~c^Q5^xWf_N!Yhga7!`pCv7C#{4E=lM&gFbe>*rWB!KD zFN8xuuqXH9+SxV8Oxj-DNk=6<%q8YzmPHJrCPbCYTol38%c(4*XPKy7_^bx;Y}%D^ zzQV;JOd2=r_QiB+%`YKFv0D(Sm`kMG+41ok5jr|UOjE>2QB!9u){7X#_P|C&agm+O$mr0{ zOWLF4rVWiGf;HZy%-pyi%lSn%je{~!j5gbB@elp!D?pN_r8n2o-Oe9)8 zK1YG!{jtiJ+g;<7QIQaV+JK699WbJd@HTt0x5jV3nF|$IA}h? zY;5B-8Jt8di1TDO-{&io=Vwl?>Sip*2u;?zeX#|W^kkkR0$ML7cQ%w>4`=OBNZEtk z4|3Cs$wv~;?fcGkdbp=}^hp)YUPxg!w|hH;5%Pqk?NmPlcc+Mt4Hag2V0wNZ6Jeb3S0gV1uqw?4vS)aFKKI$D+U1zSP(iVy~I1PEeXxhp>Ou zA)CXzcpZ-u)eU4d-tx$f3k?}XZu=IIn*mKp-)=Ag`qNaW9>|Y|B@IUFFea=uh zdT@US7ZIT3?K#J!C)FIQ`OSJS-bQx3!V6HHl>HDH2|o@h&=~BZ41FvJ$-^X1y?9!h z(D@;!Yg$D(fDsGyY$6Ka!v7n|9ds!9A_Nfx0V!o?ktunN1y&VG-W;y}FK$qi7Dh3p(tbjuv^Pp-ej*hr zlFwq9C+Ye*Kj^UCcZA8Wt(RsFg1%@~-A(FkWFBE3o50~=4*hWM*Ne)ZXf$9Xd{6jv zQv;Xd@pHrH6g;XmHv>XWkpIwpOG^%g2cfqG6;?EIN8~&>ieCZ!p=x><_Km#Fo9%yA zfJ+y(dPpd0sk(LjAAlBgtyAS_ZM%79bGPhV+s+cGu=#<)1t_)~lp}GMfO66Ko(8)w zuIJl9yVkBw&dtruhXlQTYd*$xs>|cJ3@+9*<{sg<`wmKtTggi6*XMADyQ>kUeSqbu zABv~JbJnT{SmxBUr%@9#p;ax*|I9Z#FIa!8;y*t>zW}(bWq_=UY0&0<1HT& zf|V=nSz-Y&WHl3cHT}Yblez9aOS(T$_k<3>WQdT)5Q8q){8oS>&b&1cU?11=A|5A6 z4|HE#F{WMsG~6Inv|Bdf^p~OjQf=5RoU4$)_AT^(l9Ll(z2BTfX7mC)n)!kP>I5K! zIznA(S$Go0vdYeey!sVVbd(g_!Q@ z+(}n#_H0&zrTLp-MTh;(b0H;@k-*JjY*V^>j?MfMzF2R&R!>GJ`om`|^r#>2&>fw9 zbiQD<0u+f(5)u*@TP$~r02S0d?D}EhbV9Hl`Y2b#Hu}B*mJGS}URajd$+mSV47qSR z84N(L{!3(ELc$;dD^3;ptBR+#Mf-EGio(OpUBl6O)Ts`7bCJb=12e1O0WR^sq%z5f z_~lk8vc(gu#ocaX;m>e$(2vK`lw}z>wq4Au5V#1CT6-rBZM$0lrPUAyu-<}9Gy^(`O`_N6FatrNBEYSpistC zTj=Kvc_EX!zFSjo^Yx>N?8Py~m}-E+6YL$da=3ZaGlG@}*v3OpFbix@HgDIFEKUCu zU{R*Oa0X;jU+~p-{W&r1firG8hb-3FNCKeL&s7Z28ws@30gTc#E*bNx3D-S`>vkLd z01wy9abrSkdQht8IMEsw7i`+lYc9t)Q`33)cRcARl=^d6dVyh!b^!Iz{sI0ar_4UDUhMH%0#OCRvX@=Mx5s%P$$6FOgD5vdre$BqDagnD{fM1 zb2sXa{`@xIJq)$N_o@C%)#;r*PObK%bXIQtf_*`H_CJCa9oS(`Us61TgD?*9&g!c*`g)}!*3ai=r| z^wriO`(uH?i+xyTy5c?_WJ*nEQ>(8}ZF-ky(Io6*f648Qk5BVTmR>%+ECx?oc93%T zQ(3RpiF;DFXW=eUXUa1bmXj>vJkRgf1<)9w>8@Aj0~1%10L!;4NJ{A06Lb2*;Tu$* za1;WhU%?cGi$&Wt#k!fxRZ#L&p%R3OH?KFCP{9|R!-_baQSyT``YzfWuKqmN|J-oM zTUqsIeu@(!nf*%}^N`5+WYTBBV)uj^rLNYG3^jIuSjB zB-sl`M}uUYu3~wQvZQWAdG#)$LLmQ*5_^c78y)A-PTbXDf+(@qe!Fx3i^qay?5P zD8iFI3tJ~oY5X-BamodI`XISW14AEq3?!>|QP9rmPe+4MU8cmcV3ALslx zj<2Tf{%&adG0TyG(cF^_Q^%T36T;`A_z76SGYXg9+`NGkoHU9!d^nua{n)BE97>){ zG^9~D)x_(ddT`0cvnO1z8Q9(bpyl%cp5V~^Rh<@eWjI^JcJ)pHiv&x7kmQ6LrDmh5tX_o2OGUV7 zs3$XY(5p|xg~#2G_6S{+gedbRXYx{!MlD?S-i5U4)=;&K$!yb~5_V^5`eE@+3&86H zM@BlPa8ioiei_(WHnB~VSlt~XGAHu9QZ%gqR#s2+-lQ<@98c*g+!;wh`~LYBu!+1- z+CA*Fb{6QcSv8uW3tp(o(+L>@mdDlJ^zX2PpoYBZx>9SuULS1+Pqc^Z=KBFW+@Wji zpd=bN#3c`fM$|o2tX0T7O~Ch?>I*-cFq`oCZe-ZzxB{eESM4Ai= zzhzpgLr|y`h`l+%hNUu29A*xs!g>}F<@kou7~P7yQZd=K8O>n+Sj4KdHszMH?N0|; ztwup{zgE#+t^En{Zcb4aXejVZZ?-PHxBP1mOok-O_LCU)A$H+*5&sT`E5P?2mXy3b z<^DJxp04h^s8M6*rYDLM(nOR*6ql~GIU4mshjM*(o$(?nK6gMcnB4G%r@ZPkqlzG9 z5v3p{b5WG?EB%S6__sG#$8It!)-sqB1*r)zh+VAVD$nTO<|4nd6W` z#Jr%I3n1li4Y(rDg^anhhiB@$eLflrO)^4X)2>aQB^JTHV3lY~?c{ur2H8{T8DTqh z&ZnE19M(xI!vMFtHBE)uez_@nMqcBOB(65@iGPk?Mvlo{U4L}BONd{x$igceridgx z!T%aO;IwacPHgWVWv&f13`G0^uaVVKrYp@b79zsW9E(r#d+Jqx_Jt z#y->(@jj1Hy6MkX3CuWg?F2m6OQ91rmm#mN&lFB+NZ%K*sQ`nXk`^9!8{Q<|aa)lM{o$RUQD{@<5?)D2QZfc- zO#^hGNKHeTQP8_>bo9z|&+|{Fy{S(V|KQg6)W;P;)Q}e;TQ8Y+fFW!IM|Km7w=k1g zF6yoL%+)~J**T7iA~D?uKK>LT0{(#!0?RqMK4ClsT4*Y87p8FK{9u|}p^%?@icZ$% zitk&S?TLzfdvxFcP7r`#Mg~Q8o?mk8);vVZiv{aug5Jz4v%bUm9)FXnRv`BqWz*Ho?jND7O|G{a6h zLP1bG0$WK^AD%W)@QhnNt9&u`rv2%yYkki``J$!8=VD_ zbfTPHa&?<256mcWWg#jyD$S-kUd|{|?q=#WwC4i#U9ev_O@Z7ZJ#tzEvN`wO(kZZl zZoDX>aj_yCKah%I&=pKR zbj6J7{Ig9g8lO+ea6l;iZxXkX9J4+!kz zhFIvnR02`{))y*M%_udTDLeDSvdw3Nt)Jt<`(iTRv^g)A;%E!K0xkbtjE@p89nxMe z`l$fiz^sZXjgrkiqoRDj&lg1<^{^ie0JHjmhni+jpr-5?+}4kkhH*wV$G_0tT-LLg zKc01t59_h{5x^zPrmtFGyP4_wh|y0R(a03ts!0?m)Tb!AuZ}V3kj8 zKQ(8?#%L;e0x2)N>y zUi{#Jnw}t2*Ljp2rb-7A^}JjKdXk49$wMzCjAMG>Ej{PeRp z*;eP^h%To-MjunS;*+uj`&emH(v0tAsEIntySscV+I2_vCUKW-FMVH zF5C;tDPzvm+U)GB@KP3jrpPTvYro+YYU4*~(bnmzmlix-N26c8Z(xy!#uY>n^sy-i zt{Oh{kaF$%?32f)L5k-HE~+n|-8(Xn@`}o6yq1k3ocSa0|HsNDC+pfZ2RCrlg7o$RoCV#l z;2+&Cj{=e`9b5{Z<;ee#=nKZK!K<+W=L&|>3HPdItZ3QyiPx+wd- zXfT>^tT!q%`O}+KCk^W#p7kvI51fofn=LfoWV?5IE*eiOz=nFjVxxW@y2ss{!6PzP zfM5wuZHQkO&j#juCs6|qklLgdfQOKQWU`c?PjGY*9( zcqT%S`cH8UgzraJU$HhFwhR1Hav0cBeZdA|16>k#Qv&WiN-#FSh$14;6HXPNBIizg z{{C5_h?A&+dH=kCJ83~lQ9Kal=qIFyy!mQyQUT4y@5dCPGKpF_ zXOkbq7*Kl7>G8>1e>#`&2%j=vQFRk>S`|~=GK{D#Jjo!*AX7v`D2?TOhJMMBOELDROjfK z@+1Tn#YS6_TgWDSLMd%jBNP1%UwxDeYQ{{dsYtpzXnvzu$4o-b3p!C+u@ih05HC-? z&EQJ>(t||G@30S@Rscmh6a)<8jEQ@-iSY&k&JKzyFr4S^1s5GHJZ>$gp~s*CPV5yo z!Traup%yKnX@Zewp#<*nTWn!o%wuBMd;AWx2|k;1v0fR0(IK2d>C@OJdCm}(%-Wk> zX?#X$#ohzys83>{YaSS%yu-%)ezD|fC*^mkt=plC5tt_seKIlBbc;!{Y^rD+eB8NEZ>DIK1F5?Peodzy`d#c@&nE8`};XmIhh>5yszdTa)K?1_0&MH+b9X00}k(=EL^ zG_>|lQ;}Mk_opdFR$=oYY0=d05rt<(kBWC|DG#qGc(Avrx>?V#V>O+4DluXO6+600 z(+j_BmB?ilek_X59l?tIM6_ciY?tbN(iq!Ro5q4w`p||kZR~^2-?t6)y(mM{t@t#? zEtpP^?Vl&01lss_T?L+wfnnKMLwQ)K1|#N_SbjUD!pN+cU-z#mDcF-^h(znzkBS*y z%_?wVXpanFD@8D&MW91LTqqI5$X#7|ge4E2j`{Aw0bRp3rq3#=5c`*kDlX;wm!m0F z-b`Tv+EsEMT!0z;fABi=qs?}%-NLY*sa&a)gzV6n;Kdr(rhF7 z;FEifRj#$cE0t_48LIt;yjL=Gj5BMo5Pim-<*pV7yyMfP`9H;$s;bL+78dz@Ak{c6 z;B$QaEyd#>6bAsC(gbi2QYO6Yt_OgMwDF$RuwOb|Hn;`e(giBf)zF(Qmd?V7|193# z4&YEEZ3eI}K_cv6FF@RT|6cc*nKk%Fo(yRJo_@RMyr=<|Ep+s_6LMSAeKO8>0q6%i zS;`MqT5HX+2y$sJd-ayz?v*BY+#ang0n0wP+Ddl65j;Zn-fRn9G#1`Y4kt0e zFPuhG*nInOXxe734vrpIGOhsZmK$)Fosjz~;O_Qvr8e}Ok3rn=MO||_mtLMDFmcX7 zDE?D?20T$igF>?XL zn7+$S6-xl|Oy}~==1L&?_bY z?YDYerIE6cCBkzZ&EQsd&qBSXq-+D~+a9x+ftj$RxIa?8$V9WSAF<>$9%T>nWkBVX z{ycqdod=RZ08eOcKNb4o$)g{^_qsM~J0_h%#Wlbf61lQI-(4H0BoFl@2$j%!M=Bnw zoGpkRlqCB5%^;bQ3!?k7fC%HOFzOt>+d}ob)6d;_(J=O2PBi~TJ8MJeomI$r249nm zZ%b49ASuMxO9A4b942w~nzdG~v>)iO@%ysa9{owi2a$;ToO^ z*wJN5;Uu6VQt1s08timS=x$r^z%lpKNP8DRUHkriZQO3V#YpY}SWxbeejB7HEpSGg zzVodOUh*@Tt0BTAnrh6BD0Nbxbv13QrABmVK*D61)oj-8Uv(L9GmtfAl-Uo~;WA?r ze={5iD6s$8N!4KXL@2c63*@cAUEsf6;p2R@lXhl@Zg28je*T1ZUIn*AOyqfu^W?bL zF!N8@-AmfWjNEbnp{rzQ%m~`vtSiUGS=B9}rj+cSB90zJotbFGcv zxaSl`t;gMq#-TA!$&ql*G{f!56(@1eJ^xq!Cn@ZS=nq_aFYHf~?7ew&5|)hU2DI%) zi_8!$bbP@j0R@+xo+1)DneVqw$3K>@u~-2})(2f<4kTjaS+e|2x6{jz(pkxh*I%_P zpGqE0*hSWHEd`iz->PjyCAj!4oV_N9I5zr6Jcf>(a^L7iI$<8vdFh^j*wD_`Z z9q!EH=I_2&*3frN2sz2x0wD^5?WQL6aMzTVbD1oskU56L%;hve1)l~g4ZtIO1_M5N zZw8qpi(|w3>(tD9wz}O9f`Z9*GYTR+OzZUT1-2`a-SkDfQRj5Hr@Kk#!3Z0{GwIa3 z0TqjVIi&mMKvazbTY{xx;ERFXe9I=_ilyWH)(>RyW1IZK3Ak(XTj7ar3r-Vf*&V1) z@3CQIahepa)X>*o6*>7V9>;839KfrW7R>bscqLPs@-O8)rT69lewRKtQKvZQYBQ#j zE!+h@pBjmE;^Zf)LC+0J+MT>kp9boC~g5s2f6Cy- zcT-*}mXpe{&zA-CY;>e#GiqwDXrpcSBH5^{Mh#7NWd*^>gsC$cd^68pgh%mh2d9;b z{b|wu{4!M}@6oU)uo2P^kMUO1f~RG6+nPSAa8gfc6O%YR&rc$4{1e#H zk9rGlpxkaNp@nqocB2U3{xH(Qe>2K0TgWMDG;s3&=;lnrq3ZiME=%^MvWC>e5Sg*G z+*6h?nnjjW)P$RCp%KPXW~^nGu{4&M!O)0XN>Z3;3Q=k_sO&As4B5Al{W-es=X%~e zZ}01RuIJ@>anAKW=lp;F?fdGkaz1}tPP4S82jWJMm9b{uvRN3l_U zuk+bJzfySQ#&5;3bjD9T3k6~qeZO@`&Ou-fYA~NaPgP$zqYltpd_YE~G&@=Ir_@7l zb8%*VSuof^L|X8UJBZPAD4*LVKS>HFkSqOoTe@IK01C3x#kQ$czU(thV+Se<#kHeStKXWKrNn^my5QuAB z%|FhGW)XAWGJ#A(-A&^k2#(xn^S4XHCD;rL<_^-wWnpy2VLo^27W&8p*0c9V&ye*{ z1+K{xl+#j$M09v6Hop{31_Dzm{6gAAZCRSaR@wLX4%2n=Q1=%FJMBF(wX@WeID8f! zPmLJozzWYteXs^G%f%^>CqQnaU-CewbAhZbCO)!^)zp~t#)Cyyw5P2VxOx-tBywi})KA&xfeaYcJiY$b!UH%wEi5z?IU zP}Bfsdp;Yrkk2k%Kd6_qhLFCEXtDJ~yS`R;F=0EqG3E`q$)Zo`YGJCKAI)66>H|p; z2YSI-ypedbyfPO@M}-DIWz>A2%H9LpVF*fayMQ8NA?1M8UU26S{DXIw`?Uu~8kqq0 zB(Uri!#zcQpRt}>aF(G;2X%FI6-<0kYKf>lxg%pHnd7g=;o8l%2!UyQQ=cC=X1T_M zFvQglF|+ECV`#2TmL9*H|3}+*YQh#lg5I)&DhNf~9mSvD{qK$i?z(-pPp`7|TeemB zIg||jwmv~oHPkmrecVZeM~Y&}iAv`LXv*WRVUp`}6q}IbnTv%d>xR3D#Z8h2qwjZt z$5J=jM^v6T&li|Fx{hI4x%!Ru*={akVc)A%`E`jAMVj<<8g(N{++ZG+NgSCqCa7^u z2CHA^`$sZKZ&Yufh*b~g?;`D=OS-6Ff>RWP9-45j+7;Q&RZnl*sKVp4?jF)pf{b+gVajBwlfnz4z0la(QNYsJ z|D+()XymnR|6*+;;<|S!?fw%F%AodpJTIvmx_}Vjjrp{NDH9ZZ7J&Q;+uB2;cL+D+ zAF0i%8v#vio1Tv=#AO@4H^V&E<=vrW+|&hx=Tu6mc?xxrwX2v}~06p=`uLvg`@B`9~gqS z#dlXdU$h|zdweh7uCfli`E_}2&PIuWXHz^PGmK+C56ia}~~x)l>$__S!4qX_6`&0G=8y_@&b`4Xchk8g3E($lD0x1>(I z9X;2jf#QQRIcjUIrY^Y6UM^=Ig#ETJB?kY|z@_C|D=?IEu&i0%3Xa_!f5tT%!uSQ7^W zhL7FMAX($0;k#X3M0Eee(907Cge^deV*0O(WDF~kC~c)MKNCaR=q7#id4IqJ?2X?&}7@>FA;5=DLzX zh6D?mG3>S}Y+*2{fv6P3h2>VZH0SZ-G!V@l^cv9@4ODnlzi^mUz2<2<3 zR$54z6LcE%Y=h&$K8ACfKqw7M{ROcX`#U9iRqFqrF7`J;&BhX}b3+$&h&Og?VXFPO zeBWeWNMmN2C+UJV5cI?M79}i;W+x)a+j&~RPIBqkT$V;-eH!*&43oVbt3 z8THYz6_nMiKpM$iJ|h@F31kLI;7hFc5--8Y+iCb9Rls^{;$!5s%Lff4g8xZ$TSjI; zr-r~JS-Gdm-R7dkHf(E~*@C2u^;A}?M$MOp_K^gpeopiRHcD=7wUh{4`?e7-?3a{S z0oc#r^s!@VU0*)Hq9h00N~gQ)ZM|zNynI@ir}g5wz;O%! zQP_2;Jf!ErlMneilMlv2j;;PB)YvsD68|;AyXv!-fI3GMTXVDLJJecI(azI!qlN50 z-BFSw8Qkm(0<{3>CU|nW?YDTCsiD`Wqr7!^#LCTwx-NIycA~vrgdeX^YaOH=JiS;Q zAGr$x^34NxKGBNen z8?Mf;T^Yr|ZwFzEaRpr^=i(SAn}#bGUL}%W9#K9+-}k0K&kwwZLL@dpAp30y6}?Oz z>Z{1Z_)V2lYZ*8lLao1?!{wZ+N^f29>|+=4`GEVSJmCEsCQ}PIZL)XzeGAySqRR8V zK}~BkdLV-BviI(C*&qJh(dzsrYA$;ZT<+WNbvEP$ z9wKAmB5}uh?a7B}rK3Hk?@(1MRA-p=++NK++0TW+(@byMfskdngpY7Iru;V=Fhlml z)+996alA=D-ctR=CxL&KkZA7@3<|d#$1_@i8ov*e6n!vsU|Gba1o59TPuTbM&9S|M zx;J{}0xMLi6X}=#`}h*)1`UstT~8GG_lPTU=6@IK7>ua{m^1c31L-5%p2QHcfhT&_ h;rF$&p;zig)Vq;WP^jviY=F(lhqAPRKQecX{TFV`%TWLT literal 0 HcmV?d00001 From daa15f93eb7e129df4d311da5a9e930cae8863ec Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Wed, 6 Apr 2022 11:48:50 +0300 Subject: [PATCH 132/242] Update POST.md --- .../POST.md | 57 +++++++++---------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md index 4a594669ec..396da20f86 100644 --- a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md +++ b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md @@ -6,7 +6,7 @@ In this article, we'll create a basic application to demonstrate how "Concurrenc For this article, we can create a simple BookStore application and perform CRUD operations. -> To keep the article simple and shor, we'll only add **Book** entity and ignore the **Author** part. +> To keep the article simple and short, we'll only add the **Book** entity and ignore the **Author** part. We can create a new startup template with EF Core as a database provider and MVC for the UI Framework. @@ -24,7 +24,7 @@ After running the above command, our project boilerplate will be downloaded. The Let's start with defining our entities. -### Creating Entitites +### Creating Entities Create a `Book.cs` (/Books/Book.cs) class in the `.Domain` layer: @@ -45,9 +45,9 @@ public class Book : AuditedAggregateRoot * [Aggregate Root](https://docs.abp.io/en/abp/5.2/Entities#aggregateroot-class) entity classes already implement the `IHasConcurrencyStamp` interface, so if we inherit our entities from one of these entity classes we don't need to manually implement the `IHasConcurrencyStamp` interface. -* And we've derieved the `Book` entity from `AuditedAggregateRoot` here, so we don't need to implement `IHasConcurrencyStamp` interface because `AuditedAggregateRoot` class is already implement the `IHasConcurrencyStamp` interface. +* And we've derived the `Book` entity from `AuditedAggregateRoot` here, so we don't need to implement the `IHasConcurrencyStamp` interface because `AuditedAggregateRoot` class is already implemented the `IHasConcurrencyStamp` interface. -> You can read more details from the [Concurreny Check](https://docs.abp.io/en/abp/5.2/Concurrency-Check) documentation. +> You can read more details from the [Concurrency Check](https://docs.abp.io/en/abp/5.2/Concurrency-Check) documentation. Then, create a `BookType` (/Books/BookType.cs) enum in the `.Domain.Shared` layer: @@ -119,15 +119,15 @@ To do this, open your command line terminal in the directory of the `EntityFrame dotnet ef migrations add Added_Books ``` -After this command a new migration will be generated and then we can run the `*.DbMigrator` project to apply the last changes to the database such as creating a new table named `Books` according to the lastly created migration. +After this command, a new migration will be generated and then we can run the `*.DbMigrator` project to apply the last changes to the database such as creating a new table named `Books` according to the lastly created migration. ### Defining DTOs and Application Service Interfaces We can start to define the use cases of the application. -Create the DTO classes (under **Books** folder) in the `Application.Contracts` project: +Create the DTO classes (under the **Books** folder) in the `Application.Contracts` project: -* **BookDto.cs** +**BookDto.cs** ```csharp public class BookDto : AuditedEntityDto, IHasConcurrencyStamp @@ -144,11 +144,11 @@ public class BookDto : AuditedEntityDto, IHasConcurrencyStamp } ``` -* `AuditedEntityDto` class is not implemented from the `IHasConcurrencyStamp` interface, so for **BookDto** class we need to implement the `IHasConcurrencyStamp`. +* `AuditedEntityDto` class is not implemented from the `IHasConcurrencyStamp` interface, so for the **BookDto** class we need to implement the `IHasConcurrencyStamp`. * This is important, because we need to return books with their **ConcurrencyStamp** value. -* **CreateBookDto.cs** +**CreateBookDto.cs** ```csharp public class CreateBookDto @@ -169,7 +169,7 @@ public class CreateBookDto } ``` -* **UpdateBookDto.cs** +**UpdateBookDto.cs** ```csharp public class UpdateBookDto : IHasConcurrencyStamp @@ -192,13 +192,13 @@ public class UpdateBookDto : IHasConcurrencyStamp } ``` -* Here, we've also implemented the `IHasConcurrencyStamp` interface for the **UpdateBookDto** class. +* Here, we've implemented the `IHasConcurrencyStamp` interface for the **UpdateBookDto** class. * We will use this value while updating an existing book. ABP Framework will compare the current book's **ConcurrencyStamp** value with the provided one, if values are matched, this means everything is as it is supposed to be and will update the record. -* If values are mismatched, then it means record that we're trying to update is already updated by an other user and we need to get the latest changes to be able to make changes on it. +* If values are mismatched, then it means the record that we're trying to update is already updated by another user and we need to get the latest changes to be able to make changes on it. -* Also, in that case, `AbpDbConcurrencyException` will be thrown by the ABP Framework and we can either handle this exception manually or let the ABP Framework handle it behalf of use and shows a user-friendly error message as in the image below. +* Also, in that case, `AbpDbConcurrencyException` will be thrown by the ABP Framework and we can either handle this exception manually or let the ABP Framework handle it on behalf of use and shows a user-friendly error message as in the image below. ![](./optimistic-concurrency.png) @@ -243,13 +243,13 @@ public class BookAppService : } ``` -* He've used the `CrudAppService` base class. This class implements the all common CRUD operations and if we want to change a method, we can simply override the method and change it by our needs. +* We've used the `CrudAppService` base class. This class implements all common CRUD operations and if we want to change a method, we can simply override the method and change it to our needs. > Normally, you don't need to override the `UpdateAsync` method to do **Concurrency Check**. I wanted to override this method to show what we need to do for **Concurrency Check**. * We can look closer to the `UpdateAsync` method here, because as we've mentioned earlier we need to pass the provided **ConcurrencyStamp** value to be able to do **Concurrency Check/Control** to our entity while updating. We've used the `SetConcurrencyStampIfNotNull` extension method to set the **ConcurrencyStamp** value to our entity and update the record. -* In that point, if the given record already updated by any other user, **ConcurrencyStamp** mismatch will occur and `AbpDbConcurrencyException` will be thrown and thanks to **Concurrency Check** system of ABP, data-consistency will be provided and the current record won't be overrided. +* At that point, if the given record is already updated by any other user, a **ConcurrencyStamp** mismatch will occur and `AbpDbConcurrencyException` will be thrown thanks to **Concurrency Check** system of ABP, data-consistency will be provided and the current record won't be overridden. * And if the values are matched, the record will be updated successfully. @@ -268,7 +268,7 @@ public class BookStoreApplicationAutoMapperProfile : Profile ### User Interface -So far, we've applied the all neccessary steps for the **Concurrency Check** system, let's see it in the action. +So far, we've applied the all necessary steps for the **Concurrency Check** system, let's see it in the action. Create a razor page in the `.Web` layer named `Index` (**/Pages/Books/Index.cshtml**), open this file and replace the content with the following code block: @@ -305,7 +305,7 @@ Create a razor page in the `.Web` layer named `Index` (**/Pages/Books/Index.csht * We've defined a table and "New Book" button inside a card element here, we'll fill the table with our book records in the next step by using the **Datatables** library. -Create a `Index.js` (**/Pages/Books/Index.js**) file and add the following code block: +Create an `Index.js` (**/Pages/Books/Index.js**) file and add the following code block: ```js $(function () { @@ -398,7 +398,7 @@ $(function () { First, create **CreateModal** razor page and update the **CreateModal.cshtml** and **CreateModal.cshtml.cs** files as below: -* **CreateModal.cshtml** +**CreateModal.cshtml** ```html @page @@ -455,11 +455,11 @@ public class CreateModalModel : BookStorePageModel } ``` -* In this file, we simply define **CreateBookDto** as bind property and we'll use this classes' properties in the form. Thanks to the `abp-dynamic-form` tag-helper we don't need to define all of this form elements one by one, it will generate behalf of us. +* In this file, we simply define **CreateBookDto** as a bind property and we'll use this classes' properties in the form. Thanks to the `abp-dynamic-form` tag-helper we don't need to define all of these form elements one by one, it will generate behalf of us. We can create **EditModal** razor page and update the **EditModal.cshtml** and **EditModal.cshtml.cs** files as below: -* **EditModal.cshtml** +**EditModal.cshtml** ```html @page @@ -485,13 +485,13 @@ We can create **EditModal** razor page and update the **EditModal.cshtml** and * ``` -* Here, we didn't use the `abp-dynamic-form` tag-helper and add all neccessary form elements to our form one by one. +* Here, we didn't use the `abp-dynamic-form` tag-helper and added all necessary form elements to our form one by one. -* As you may notice, we've set input type as **hidden** for the **ConcurrencyStamp** input, because end-user should not see this value. +* As you may notice, we've set the input type as **hidden** for the **ConcurrencyStamp** input, because the end-user should not see this value. -> Instead of doing it like that, we could create a view model class and use the `[HiddenInput]` data attribute for the **ConcurrencyStamp** property and use the `abp-dynamic-form` tag-helper. But to simplify the article I didn't want to do that, if you want you can create a view model and define the neccessary data attributes for properties. +> Instead of doing it like that, we could create a view model class and use the `[HiddenInput]` data attribute for the **ConcurrencyStamp** property and use the `abp-dynamic-form` tag-helper. But to simplify the article I didn't want to do that, if you want you can create a view model and define the necessary data attributes for properties. -* **EditModal.cshtml.cs** +**EditModal.cshtml.cs** ```csharp public class EditModalModel : BookStorePageModel @@ -524,7 +524,7 @@ public class EditModalModel : BookStorePageModel } ``` -Lastly, we can define the neccessary mapping configurations and run the application to see results. +Lastly, we can define the necessary mapping configurations and run the application to see the result. Open the `BookStoreWebAutoMapperProfile.cs` and update the content as below: @@ -538,7 +538,7 @@ public class BookStoreWebAutoMapperProfile : Profile } ``` -Then we can run the application, navigates to **/Books** endpoint and see the result. +Then we can run the application, navigates to the **/Books** endpoint and see the result. ![](concurrency-mismatch.gif) @@ -546,7 +546,4 @@ Then we can run the application, navigates to **/Books** endpoint and see the re * After the first user updated the record, the second user tries to update the same record without getting the last state of the record. And therefore `AbpDbConcurrencyException` is thrown because **ConcurrencyStamp** values are different from each other. -* The second user should close and re-open the model to get the last state of the record and then he/she can make changes to the current record. - - -Thanks for reading the article. \ No newline at end of file +* The second user should close and re-open the model to get the last state of the record and then he/she can make changes to the current record. \ No newline at end of file From 6f3ea6dd19a495b86520b74bdb6383032a91a998 Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:46:26 +0300 Subject: [PATCH 133/242] Quick Grammar Fixes --- .../POST.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md index 396da20f86..0cd9687374 100644 --- a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md +++ b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md @@ -18,7 +18,7 @@ We can create a new startup template by using the [ABP CLI](https://docs.abp.io/ abp new Acme.BookStore -t app -csf ``` -After running the above command, our project boilerplate will be downloaded. Then we can open the solution and start to the development. +After running the above command, our project boilerplate will be downloaded. Then we can open the solution and start the development. ## Starting the Development @@ -43,9 +43,9 @@ public class Book : AuditedAggregateRoot * To enable **Concurrency Check** for our entities, our entities should implement the `IHasConcurrencyStamp` interface, directly or indirectly. -* [Aggregate Root](https://docs.abp.io/en/abp/5.2/Entities#aggregateroot-class) entity classes already implement the `IHasConcurrencyStamp` interface, so if we inherit our entities from one of these entity classes we don't need to manually implement the `IHasConcurrencyStamp` interface. +* [Aggregate Root](https://docs.abp.io/en/abp/5.2/Entities#aggregateroot-class) entity classes already implement the `IHasConcurrencyStamp` interface, so if we inherit our entities from one of these entity classes then we won't need to manually implement the `IHasConcurrencyStamp` interface. -* And we've derived the `Book` entity from `AuditedAggregateRoot` here, so we don't need to implement the `IHasConcurrencyStamp` interface because `AuditedAggregateRoot` class is already implemented the `IHasConcurrencyStamp` interface. +* And we've derived the `Book` entity from `AuditedAggregateRoot` here, so we don't need to implement the `IHasConcurrencyStamp` interface because `AuditedAggregateRoot` class already implemented the `IHasConcurrencyStamp` interface. > You can read more details from the [Concurrency Check](https://docs.abp.io/en/abp/5.2/Concurrency-Check) documentation. @@ -119,7 +119,7 @@ To do this, open your command line terminal in the directory of the `EntityFrame dotnet ef migrations add Added_Books ``` -After this command, a new migration will be generated and then we can run the `*.DbMigrator` project to apply the last changes to the database such as creating a new table named `Books` according to the lastly created migration. +After this command, a new migration will be generated and then we can run the `*.DbMigrator` project to apply the last changes to the database such as creating a new table named `Books` according to the last created migration. ### Defining DTOs and Application Service Interfaces @@ -144,7 +144,7 @@ public class BookDto : AuditedEntityDto, IHasConcurrencyStamp } ``` -* `AuditedEntityDto` class is not implemented from the `IHasConcurrencyStamp` interface, so for the **BookDto** class we need to implement the `IHasConcurrencyStamp`. +* The `AuditedEntityDto` class is not implemented from the `IHasConcurrencyStamp` interface, so for the **BookDto** class we need to implement the `IHasConcurrencyStamp`. * This is important, because we need to return books with their **ConcurrencyStamp** value. @@ -198,7 +198,7 @@ public class UpdateBookDto : IHasConcurrencyStamp * If values are mismatched, then it means the record that we're trying to update is already updated by another user and we need to get the latest changes to be able to make changes on it. -* Also, in that case, `AbpDbConcurrencyException` will be thrown by the ABP Framework and we can either handle this exception manually or let the ABP Framework handle it on behalf of use and shows a user-friendly error message as in the image below. +* Also, in that case, `AbpDbConcurrencyException` will be thrown by the ABP Framework and we can either handle this exception manually or let the ABP Framework handle it on behalf of us and show a user-friendly error message as in the image below. ![](./optimistic-concurrency.png) @@ -210,7 +210,7 @@ public interface IBookAppService : { } ``` -* We've implemented the `ICrudAppService` here, because we just need to perform CRUD operations and this interface help us to define common CRUD operation methods. +* We've implemented the `ICrudAppService` here, because we just need to perform CRUD operations and this interface helps us define common CRUD operation methods. ### Application Service Implementations @@ -249,7 +249,7 @@ public class BookAppService : * We can look closer to the `UpdateAsync` method here, because as we've mentioned earlier we need to pass the provided **ConcurrencyStamp** value to be able to do **Concurrency Check/Control** to our entity while updating. We've used the `SetConcurrencyStampIfNotNull` extension method to set the **ConcurrencyStamp** value to our entity and update the record. -* At that point, if the given record is already updated by any other user, a **ConcurrencyStamp** mismatch will occur and `AbpDbConcurrencyException` will be thrown thanks to **Concurrency Check** system of ABP, data-consistency will be provided and the current record won't be overridden. +* At that point, if the given record is already updated by any other user, a **ConcurrencyStamp** mismatch will occur and `AbpDbConcurrencyException` will be thrown thanks to the **Concurrency Check** system of ABP, data-consistency will be provided and the current record won't be overridden. * And if the values are matched, the record will be updated successfully. @@ -268,7 +268,7 @@ public class BookStoreApplicationAutoMapperProfile : Profile ### User Interface -So far, we've applied the all necessary steps for the **Concurrency Check** system, let's see it in the action. +So far, we've applied the all necessary steps for the **Concurrency Check** system, let's see it in action. Create a razor page in the `.Web` layer named `Index` (**/Pages/Books/Index.cshtml**), open this file and replace the content with the following code block: @@ -396,7 +396,7 @@ $(function () { * Also defined **create** and **update** modals by using [ABP Modal Manager](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Modals#modalmanager-reference), but we didn't create them yet, so let's create the modals. -First, create **CreateModal** razor page and update the **CreateModal.cshtml** and **CreateModal.cshtml.cs** files as below: +First, create a **CreateModal** razor page and update the **CreateModal.cshtml** and **CreateModal.cshtml.cs** files as below: **CreateModal.cshtml** @@ -419,7 +419,7 @@ First, create **CreateModal** razor page and update the **CreateModal.cshtml** a ``` -* We've used `abp-dynamic-form` tag-helper and pass it a `Book` model, this tag helper will simply create form contents (inputs, select boxes etc.) behalf of us. +* We've used `abp-dynamic-form` tag-helper and passed it a `Book` model, this tag helper will simply create form contents (inputs, select boxes etc.) on behalf of us. * **CreateModal.cshtml.cs** @@ -455,9 +455,9 @@ public class CreateModalModel : BookStorePageModel } ``` -* In this file, we simply define **CreateBookDto** as a bind property and we'll use this classes' properties in the form. Thanks to the `abp-dynamic-form` tag-helper we don't need to define all of these form elements one by one, it will generate behalf of us. +* In this file, we simply define **CreateBookDto** as a bind property and we'll use this class's properties in the form. Thanks to the `abp-dynamic-form` tag-helper we don't need to define all of these form elements one by one, it will generate on behalf of us. -We can create **EditModal** razor page and update the **EditModal.cshtml** and **EditModal.cshtml.cs** files as below: +We can create an **EditModal** razor page and update the **EditModal.cshtml** and **EditModal.cshtml.cs** files as below: **EditModal.cshtml** @@ -485,9 +485,9 @@ We can create **EditModal** razor page and update the **EditModal.cshtml** and * ``` -* Here, we didn't use the `abp-dynamic-form` tag-helper and added all necessary form elements to our form one by one. +* Here, we didn't use the `abp-dynamic-form` tag-helper and added all the necessary form elements to our form one by one. -* As you may notice, we've set the input type as **hidden** for the **ConcurrencyStamp** input, because the end-user should not see this value. +* As you may have noticed, we've set the input type as **hidden** for the **ConcurrencyStamp** input, because the end-user should not see this value. > Instead of doing it like that, we could create a view model class and use the `[HiddenInput]` data attribute for the **ConcurrencyStamp** property and use the `abp-dynamic-form` tag-helper. But to simplify the article I didn't want to do that, if you want you can create a view model and define the necessary data attributes for properties. @@ -526,7 +526,7 @@ public class EditModalModel : BookStorePageModel Lastly, we can define the necessary mapping configurations and run the application to see the result. -Open the `BookStoreWebAutoMapperProfile.cs` and update the content as below: +Open the `BookStoreWebAutoMapperProfile.cs` class and update the content as below: ```csharp public class BookStoreWebAutoMapperProfile : Profile @@ -538,7 +538,7 @@ public class BookStoreWebAutoMapperProfile : Profile } ``` -Then we can run the application, navigates to the **/Books** endpoint and see the result. +Then we can run the application, navigate to the **/Books** endpoint and see the result. ![](concurrency-mismatch.gif) @@ -546,4 +546,4 @@ Then we can run the application, navigates to the **/Books** endpoint and see th * After the first user updated the record, the second user tries to update the same record without getting the last state of the record. And therefore `AbpDbConcurrencyException` is thrown because **ConcurrencyStamp** values are different from each other. -* The second user should close and re-open the model to get the last state of the record and then he/she can make changes to the current record. \ No newline at end of file +* The second user should close and re-open the model to get the last state of the record and then they can make changes to the current record. From 1b87d7e7e210f70b00f01c5f5b14457f8a519503 Mon Sep 17 00:00:00 2001 From: Eric Johnson Date: Wed, 6 Apr 2022 15:05:36 -0500 Subject: [PATCH 134/242] Fixed project file encoding to retain existing encoding. --- .../SolutionFileModifier.cs | 29 +++++-- .../VoloNugetPackagesVersionUpdater.cs | 83 +++++++++++++------ 2 files changed, 80 insertions(+), 32 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs index 08d8fa182d..b78ec017c2 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs @@ -12,11 +12,24 @@ public class SolutionFileModifier : ITransientDependency { public async Task RemoveProjectFromSolutionFileAsync(string solutionFile, string projectName) { - var solutionFileContent = File.ReadAllText(solutionFile); - solutionFileContent.NormalizeLineEndings(); - var lines = solutionFileContent.Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.None); - File.WriteAllText(solutionFile, - RemoveProject(lines.ToList(), projectName).JoinAsString(Environment.NewLine)); + using (var fs = File.Open(solutionFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) + using (var sr = new StreamReader(fs, Encoding.Default, true)) + { + var solutionFileContent = await sr.ReadToEndAsync(); + solutionFileContent.NormalizeLineEndings(); + + var lines = solutionFileContent.Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.None); + var updatedContent = RemoveProject(lines.ToList(), projectName).JoinAsString(Environment.NewLine); + + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); + + using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) + { + sw.Write(updatedContent); + sw.Flush(); + } + } } public async Task AddModuleToSolutionFileAsync(ModuleWithMastersInfo module, string solutionFile) @@ -64,7 +77,7 @@ public class SolutionFileModifier : ITransientDependency lines.InsertAfter(l => l.Contains("GlobalSection") && l.Contains("NestedProjects"), newPreSolutionLine); - File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines)); + File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines), Encoding.UTF8); } private List RemoveProject(List solutionFileLines, string projectName) @@ -174,7 +187,7 @@ public class SolutionFileModifier : ITransientDependency lines.InsertAfter(l => l.Contains("GlobalSection") && l.Contains("NestedProjects"), newPreSolutionLine); } - File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines)); + File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines), Encoding.UTF8); if (module.MasterModuleInfos != null) { @@ -219,7 +232,7 @@ public class SolutionFileModifier : ITransientDependency .Split(" ").Last(); } - File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines)); + File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines), Encoding.UTF8); return folderId; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs index 900930d472..4e94c983a9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs @@ -9,6 +9,7 @@ using Volo.Abp.Cli.NuGet; using Volo.Abp.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using System.Text; namespace Volo.Abp.Cli.ProjectModification; @@ -41,17 +42,28 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency async Task UpdateAsync(string filePath) { - var fileContent = File.ReadAllText(filePath); - var updatedContent = await UpdateVoloPackagesAsync(fileContent, - includePreviews, - includeReleaseCandidates, - switchToStable, - latestVersionFromNuget, - latestReleaseCandidateVersionFromNuget, - latestVersionFromMyGet, - version); - - File.WriteAllText(filePath, updatedContent); + using (var fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) + using (var sr = new StreamReader(fs, Encoding.Default, true)) + { + var fileContent = await sr.ReadToEndAsync(); + + var updatedContent = await UpdateVoloPackagesAsync(fileContent, + includePreviews, + includeReleaseCandidates, + switchToStable, + latestVersionFromNuget, + latestReleaseCandidateVersionFromNuget, + latestVersionFromMyGet, + version); + + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); + using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) + { + sw.Write(updatedContent); + sw.Flush(); + } + } } Task.WaitAll(projectPaths.Select(UpdateAsync).ToArray()); @@ -70,27 +82,50 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency var latestReleaseCandidateVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates: true); var latestVersionFromMyGet = await GetLatestVersionFromMyGet("Volo.Abp.Core"); - var fileContent = File.ReadAllText(projectPath); + using (var fs = File.Open(projectPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) + using (var sr = new StreamReader(fs, Encoding.Default, true)) + { + var fileContent = await sr.ReadToEndAsync(); + + var updatedContent = await UpdateVoloPackagesAsync(fileContent, + includeNightlyPreviews, + includeReleaseCandidates, + switchToStable, + latestVersionFromNuget, + latestReleaseCandidateVersionFromNuget, + latestVersionFromMyGet, + version); - var updatedContent = await UpdateVoloPackagesAsync(fileContent, - includeNightlyPreviews, - includeReleaseCandidates, - switchToStable, - latestVersionFromNuget, - latestReleaseCandidateVersionFromNuget, - latestVersionFromMyGet, - version); + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); - File.WriteAllText(projectPath, updatedContent); + using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) + { + sw.Write(updatedContent); + sw.Flush(); + } + } } } protected virtual async Task UpdateInternalAsync(string projectPath, bool includeNightlyPreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false) { - var fileContent = File.ReadAllText(projectPath); - var updatedContent = await UpdateVoloPackagesAsync(fileContent, includeNightlyPreviews, includeReleaseCandidates, switchToStable); + using (var fs = File.Open(projectPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) + using (var sr = new StreamReader(fs, Encoding.Default, true)) + { + var fileContent = await sr.ReadToEndAsync(); + + var updatedContent = await UpdateVoloPackagesAsync(fileContent, includeNightlyPreviews, includeReleaseCandidates, switchToStable); + + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); - File.WriteAllText(projectPath, updatedContent); + using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) + { + sw.Write(updatedContent); + sw.Flush(); + } + } } protected virtual async Task SpecifiedVersionExists(string version, string packageId) From 05ffa67d047197b6799c3dfe98022ae891da379b Mon Sep 17 00:00:00 2001 From: rqx110 Date: Thu, 7 Apr 2022 08:41:28 +0800 Subject: [PATCH 135/242] move RightAligned parameter to BarDropdown --- .../Themes/Basic/LanguageSwitch.razor | 4 ++-- .../Themes/Basic/LanguageSwitch.razor | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LanguageSwitch.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LanguageSwitch.razor index 75b64e05b7..afa3521d01 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LanguageSwitch.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LanguageSwitch.razor @@ -7,11 +7,11 @@ @inject IAbpRequestLocalizationOptionsProvider RequestLocalizationOptionsProvider @if (_otherLanguages != null && _otherLanguages.Any()) { - + @_currentLanguage.DisplayName - + @foreach (var language in _otherLanguages) { @language.DisplayName diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor index 6f89696075..4b41add531 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LanguageSwitch.razor @@ -5,11 +5,11 @@ @inject IJSRuntime JsRuntime @if (_otherLanguages != null && _otherLanguages.Any()) { - + @_currentLanguage.DisplayName - + @foreach (var language in _otherLanguages) { @language.DisplayName From 3610732a919f07778d6b0e65d810c1ff6c46db38 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 7 Apr 2022 21:00:47 +0800 Subject: [PATCH 136/242] Enhance ABP CLI --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 14 ++++++-------- .../Cli/Commands/ProjectCreationCommandBase.cs | 15 ++++++++++++--- .../Cli/ProjectModification/NpmPackagesUpdater.cs | 13 ++++++------- .../ProjectModification/ProjectNpmPackageAdder.cs | 12 ++++++------ 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index c244abd719..420e64eb18 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -10,6 +10,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands.Services; +using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.ProjectModification; using Volo.Abp.Cli.Utils; @@ -21,22 +22,19 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien { public const string Name = "new"; - public ILogger Logger { get; set; } - protected TemplateProjectBuilder TemplateProjectBuilder { get; } public ITemplateInfoProvider TemplateInfoProvider { get; } - + public NewCommand(TemplateProjectBuilder templateProjectBuilder , ITemplateInfoProvider templateInfoProvider, ConnectionStringProvider connectionStringProvider, SolutionPackageVersionFinder solutionPackageVersionFinder, - ICmdHelper cmdHelper) - : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper) + ICmdHelper cmdHelper, + IInstallLibsService installLibsService) + : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper, installLibsService) { TemplateProjectBuilder = templateProjectBuilder; TemplateInfoProvider = templateInfoProvider; - - Logger = NullLogger.Instance; } public async Task ExecuteAsync(CommandLineArgs commandLineArgs) @@ -79,7 +77,7 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien Logger.LogInformation($"'{projectName}' has been successfully created to '{projectArgs.OutputFolder}'"); RunGraphBuildForMicroserviceServiceTemplate(projectArgs); - RunInstallLibsForWebTemplate(projectArgs); + await RunInstallLibsForWebTemplateAsync(projectArgs); OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 860147c584..368f022bda 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using System.Threading.Tasks; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; using Microsoft.Extensions.Logging; @@ -8,6 +9,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.ProjectModification; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands.Services; +using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Templates.App; @@ -22,13 +24,19 @@ public abstract class ProjectCreationCommandBase public ConnectionStringProvider ConnectionStringProvider { get; } public SolutionPackageVersionFinder SolutionPackageVersionFinder { get; } public ICmdHelper CmdHelper { get; } + public IInstallLibsService InstallLibsService { get; } public ILogger Logger { get; set; } - public ProjectCreationCommandBase(ConnectionStringProvider connectionStringProvider, SolutionPackageVersionFinder solutionPackageVersionFinder, ICmdHelper cmdHelper) + public ProjectCreationCommandBase( + ConnectionStringProvider connectionStringProvider, + SolutionPackageVersionFinder solutionPackageVersionFinder, + ICmdHelper cmdHelper, + IInstallLibsService installLibsService) { ConnectionStringProvider = connectionStringProvider; SolutionPackageVersionFinder = solutionPackageVersionFinder; CmdHelper = cmdHelper; + InstallLibsService = installLibsService; Logger = NullLogger.Instance; } @@ -313,14 +321,15 @@ public abstract class ProjectCreationCommandBase } } - protected virtual void RunInstallLibsForWebTemplate(ProjectBuildArgs projectArgs) + protected async Task RunInstallLibsForWebTemplateAsync(ProjectBuildArgs projectArgs) { if (AppTemplateBase.IsAppTemplate(projectArgs.TemplateName) || ModuleTemplateBase.IsModuleTemplate(projectArgs.TemplateName) || AppNoLayersTemplateBase.IsAppNoLayersTemplate(projectArgs.TemplateName) || MicroserviceServiceTemplateBase.IsMicroserviceTemplate(projectArgs.TemplateName)) { - CmdHelper.RunCmd("abp install-libs", projectArgs.OutputFolder); + Logger.LogInformation("Installing client-side packages..."); + await InstallLibsService.InstallLibsAsync(projectArgs.OutputFolder); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs index 2ade6dbd77..64517b1900 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs @@ -14,6 +14,7 @@ using NuGet.Versioning; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Http; +using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; using Volo.Abp.IO; @@ -25,7 +26,7 @@ public class NpmPackagesUpdater : ITransientDependency { public ILogger Logger { get; set; } protected ICancellationTokenProvider CancellationTokenProvider { get; } - public InstallLibsCommand InstallLibsCommand { get; } + public IInstallLibsService InstallLibsService { get; } public ICmdHelper CmdHelper { get; } private readonly PackageJsonFileFinder _packageJsonFileFinder; @@ -38,13 +39,13 @@ public class NpmPackagesUpdater : ITransientDependency NpmGlobalPackagesChecker npmGlobalPackagesChecker, ICancellationTokenProvider cancellationTokenProvider, CliHttpClientFactory cliHttpClientFactory, - InstallLibsCommand ınstallLibsCommand, + IInstallLibsService installLibsService, ICmdHelper cmdHelper) { _packageJsonFileFinder = packageJsonFileFinder; _npmGlobalPackagesChecker = npmGlobalPackagesChecker; CancellationTokenProvider = cancellationTokenProvider; - InstallLibsCommand = ınstallLibsCommand; + InstallLibsService = installLibsService; CmdHelper = cmdHelper; _cliHttpClientFactory = cliHttpClientFactory; Logger = NullLogger.Instance; @@ -306,10 +307,8 @@ public class NpmPackagesUpdater : ITransientDependency protected virtual async Task RunInstallLibsAsync(string fileDirectory) { - var args = new CommandLineArgs("install-libs"); - args.Options.Add(InstallLibsCommand.Options.WorkingDirectory.Short, fileDirectory); - - await InstallLibsCommand.ExecuteAsync(args); + Logger.LogInformation("Installing client-side packages..."); + await InstallLibsService.InstallLibsAsync(fileDirectory); } protected virtual void RunYarn(string fileDirectory) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs index 828b143192..36f33e1f6e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs @@ -12,6 +12,7 @@ using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Http; +using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -26,7 +27,7 @@ public class ProjectNpmPackageAdder : ITransientDependency public SourceCodeDownloadService SourceCodeDownloadService { get; } public AngularSourceCodeAdder AngularSourceCodeAdder { get; } public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } - public InstallLibsCommand InstallLibsCommand { get; } + public IInstallLibsService InstallLibsService { get; } public ICmdHelper CmdHelper { get; } private readonly CliHttpClientFactory _cliHttpClientFactory; public ILogger Logger { get; set; } @@ -36,14 +37,14 @@ public class ProjectNpmPackageAdder : ITransientDependency SourceCodeDownloadService sourceCodeDownloadService, AngularSourceCodeAdder angularSourceCodeAdder, IRemoteServiceExceptionHandler remoteServiceExceptionHandler, - InstallLibsCommand ınstallLibsCommand, + IInstallLibsService installLibsService, ICmdHelper cmdHelper) { JsonSerializer = jsonSerializer; SourceCodeDownloadService = sourceCodeDownloadService; AngularSourceCodeAdder = angularSourceCodeAdder; RemoteServiceExceptionHandler = remoteServiceExceptionHandler; - InstallLibsCommand = ınstallLibsCommand; + InstallLibsService = installLibsService; CmdHelper = cmdHelper; _cliHttpClientFactory = cliHttpClientFactory; Logger = NullLogger.Instance; @@ -142,9 +143,8 @@ public class ProjectNpmPackageAdder : ITransientDependency return; } - await InstallLibsCommand.ExecuteAsync( - new CommandLineArgs("install-libs") - ); + Logger.LogInformation("Installing client-side packages..."); + await InstallLibsService.InstallLibsAsync(directory); } } From 0bde8008d989857205c477f56fd679e897923289 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Fri, 8 Apr 2022 10:20:21 +0300 Subject: [PATCH 137/242] Add new localizations to base resource --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index f772006632..53d37df13d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -119,6 +119,8 @@ "Events": "Events", "Volo.AbpIo.Domain:080000": "There is already a purchase item named \"{Name}\"", "MasteringAbpFrameworkBook": "Book: Mastering ABP Framework", - "ABPIO-CommonPreferenceDefinition": "Get latest news about ABP Platform like new posts, events and more." + "ABPIO-CommonPreferenceDefinition": "Get latest news about ABP Platform like new posts, events and more.", + "BuiltOn": "Built-on", + "AbpFramework": "ABP Framework" } } From 4a1d542988452089c59b84192fc327435a7c5880 Mon Sep 17 00:00:00 2001 From: braim23 <94292623+braim23@users.noreply.github.com> Date: Fri, 8 Apr 2022 10:44:16 +0300 Subject: [PATCH 138/242] Added a small "the" before "latest news" --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 53d37df13d..5d6e081085 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -119,7 +119,7 @@ "Events": "Events", "Volo.AbpIo.Domain:080000": "There is already a purchase item named \"{Name}\"", "MasteringAbpFrameworkBook": "Book: Mastering ABP Framework", - "ABPIO-CommonPreferenceDefinition": "Get latest news about ABP Platform like new posts, events and more.", + "ABPIO-CommonPreferenceDefinition": "Get the latest news about ABP Platform like new posts, events and more.", "BuiltOn": "Built-on", "AbpFramework": "ABP Framework" } From c77ff1d0bfb2d6ebad00d496be1f504401ae1ce0 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 8 Apr 2022 17:07:49 +0800 Subject: [PATCH 139/242] Update generate-proxy UsageInfo --- .../Volo/Abp/Cli/Commands/ProxyCommandBase.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs index 2ce5ba8209..22311bb986 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs @@ -83,15 +83,18 @@ public abstract class ProxyCommandBase : IConsoleCommand, ITransientDependenc sb.AppendLine("Options:"); sb.AppendLine(""); sb.AppendLine("-m|--module (default: 'app') The name of the backend module you wish to generate proxies for."); - sb.AppendLine("-t|--type The name of generate type (csharp, js, ng)."); sb.AppendLine("-wd|--working-directory Execution directory."); sb.AppendLine("-u|--url API definition URL from."); - sb.AppendLine("-a|--api-name (default: 'default') The name of the API endpoint defined in the /src/environments/environment.ts."); - sb.AppendLine("-s|--source (default: 'defaultProject') Angular project name to resolve the root namespace & API definition URL from."); - sb.AppendLine("-o|--output JavaScript file path or folder to place generated code in."); - sb.AppendLine("-p|--prompt Asks the options from the command line prompt (for the missing options)"); - sb.AppendLine("--target (default: 'defaultProject') Angular project name to place generated code in."); - sb.AppendLine("--folder (default: 'ClientProxies') Folder name to place generated CSharp code in."); + sb.AppendLine("-t|--type The name of generate type (csharp, js, ng)."); + sb.AppendLine(" csharp"); + sb.AppendLine(" --folder (default: 'ClientProxies') Folder name to place generated CSharp code in."); + sb.AppendLine(" js"); + sb.AppendLine(" -o|--output JavaScript file path or folder to place generated code in."); + sb.AppendLine(" ng"); + sb.AppendLine(" -a|--api-name (default: 'default') The name of the API endpoint defined in the /src/environments/environment.ts."); + sb.AppendLine(" -s|--source (default: 'defaultProject') Angular project name to resolve the root namespace & API definition URL from."); + sb.AppendLine(" -p|--prompt Asks the options from the command line prompt (for the missing options)"); + sb.AppendLine(" --target (default: 'defaultProject') Angular project name to place generated code in."); sb.AppendLine(""); sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI"); From c4d5d5305706c6c2534cc671f35835d172b4ac5e Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 8 Apr 2022 22:51:41 +0800 Subject: [PATCH 140/242] Set `ContentLength` of `HttpContext.Response` --- .../ContentFormatters/RemoteStreamContentOutputFormatter.cs | 3 ++- .../RemoteStreamContentTestController_Tests.cs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs index f62b16b19b..5c5e7ed6c0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs @@ -18,13 +18,14 @@ public class RemoteStreamContentOutputFormatter : OutputFormatter return typeof(IRemoteStreamContent).IsAssignableFrom(type); } - public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context) + public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context) { var remoteStream = (IRemoteStreamContent)context.Object; if (remoteStream != null) { context.HttpContext.Response.ContentType = remoteStream.ContentType; + context.HttpContext.Response.ContentLength = remoteStream.ContentLength; if (!remoteStream.FileName.IsNullOrWhiteSpace()) { diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs index a56c8ef8ad..1a60ab9d6b 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs @@ -16,6 +16,7 @@ public class RemoteStreamContentTestController_Tests : AspNetCoreMvcTestBase var result = await GetResponseAsync("/api/remote-stream-content-test/download"); result.Content.Headers.ContentType?.ToString().ShouldBe("application/rtf"); result.Content.Headers.ContentDisposition?.FileName.ShouldBe("download.rtf"); + result.Content.Headers.ContentLength.ShouldBe("DownloadAsync".Length); (await result.Content.ReadAsStringAsync()).ShouldBe("DownloadAsync"); } From b3bd998465f3c591364397cf45c0309962ac3562 Mon Sep 17 00:00:00 2001 From: albert <9526587+ebicoglu@users.noreply.github.com> Date: Fri, 8 Apr 2022 18:17:41 +0300 Subject: [PATCH 141/242] Update POST.md --- .../POST.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md index 0cd9687374..103329d1f3 100644 --- a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md +++ b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md @@ -1,10 +1,10 @@ -# Concurrency Check in ABP Based Applications +# Concurrency Check in ABP Projects -In this article, we'll create a basic application to demonstrate how "Concurrency Check/Control" can be done in an ABP based application. +In this article, we'll create a basic application to demonstrate how "Concurrency Check/Control" can be implemented in an ABP project. ## Creating the Solution -For this article, we can create a simple BookStore application and perform CRUD operations. +For this article, we will create a simple BookStore application and add CRUD functionality to the pages. Hence we deal with the concurrency situation. > To keep the article simple and short, we'll only add the **Book** entity and ignore the **Author** part. @@ -41,7 +41,7 @@ public class Book : AuditedAggregateRoot } ``` -* To enable **Concurrency Check** for our entities, our entities should implement the `IHasConcurrencyStamp` interface, directly or indirectly. +* To enable **Concurrency Check** for our entities, our entities should be implemented the `IHasConcurrencyStamp` interface, directly or indirectly. * [Aggregate Root](https://docs.abp.io/en/abp/5.2/Entities#aggregateroot-class) entity classes already implement the `IHasConcurrencyStamp` interface, so if we inherit our entities from one of these entity classes then we won't need to manually implement the `IHasConcurrencyStamp` interface. From 6bb69d99fb12510f96715f78649da102e322c041 Mon Sep 17 00:00:00 2001 From: albert <9526587+ebicoglu@users.noreply.github.com> Date: Fri, 8 Apr 2022 18:23:00 +0300 Subject: [PATCH 142/242] Update POST.md --- .../POST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md index 103329d1f3..cabe9cf872 100644 --- a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md +++ b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md @@ -1,4 +1,4 @@ -# Concurrency Check in ABP Projects +# Handle Concurrency with EF Core in an ABP Framework Project with ASP.NET Core MVC In this article, we'll create a basic application to demonstrate how "Concurrency Check/Control" can be implemented in an ABP project. From ef5906397c39c4384bddf0f40bc5992ba238ed6f Mon Sep 17 00:00:00 2001 From: Roc Date: Mon, 11 Apr 2022 12:11:14 +0800 Subject: [PATCH 143/242] Update CommandLineArgumentParser.cs --- .../Volo/Abp/Cli/Args/CommandLineArgumentParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs index ea8541cbb9..1b060a8dbc 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Args/CommandLineArgumentParser.cs @@ -98,7 +98,7 @@ public class CommandLineArgumentParser : ICommandLineArgumentParser, ITransientD { if (argument.Length <= 1) { - throw new ArgumentException("Should specify an option name after '--' prefix!"); + throw new ArgumentException("Should specify an option name after '-' prefix!"); } return argument.RemovePreFix("-"); From 02404b1ece873d3ccdd4375c13b18363b99907de Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 11 Apr 2022 13:38:57 +0300 Subject: [PATCH 144/242] Update POST.md --- .../POST.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md index cabe9cf872..b16d6bd9f1 100644 --- a/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md +++ b/docs/en/Community-Articles/2022-04-06-Concurrency-Check-in-ABP-Based-Applications/POST.md @@ -6,8 +6,6 @@ In this article, we'll create a basic application to demonstrate how "Concurrenc For this article, we will create a simple BookStore application and add CRUD functionality to the pages. Hence we deal with the concurrency situation. -> To keep the article simple and short, we'll only add the **Book** entity and ignore the **Author** part. - We can create a new startup template with EF Core as a database provider and MVC for the UI Framework. > If you already have a project, you don't need to create a new startup template, you can directly implement the following steps to your project. So you can skip this section. @@ -15,7 +13,7 @@ We can create a new startup template with EF Core as a database provider and MVC We can create a new startup template by using the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI). ```bash -abp new Acme.BookStore -t app -csf +abp new Acme.BookStore ``` After running the above command, our project boilerplate will be downloaded. Then we can open the solution and start the development. @@ -235,7 +233,8 @@ public class BookAppService : book.Type = input.Type; book.PublishDate = input.PublishDate; - book.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); + //set Concurrency Stamp value to the entity + book.ConcurrencyStamp = input.ConcurrencyStamp; var updatedBook = await Repository.UpdateAsync(book); return ObjectMapper.Map(updatedBook); @@ -245,9 +244,9 @@ public class BookAppService : * We've used the `CrudAppService` base class. This class implements all common CRUD operations and if we want to change a method, we can simply override the method and change it to our needs. -> Normally, you don't need to override the `UpdateAsync` method to do **Concurrency Check**. I wanted to override this method to show what we need to do for **Concurrency Check**. +> Normally, you don't need to override the `UpdateAsync` method to do **Concurrency Check**. Because the `UpdateAsync` method of the `CrudAppService` class by default map input values to the entity. But I wanted to override this method to show what we need to do for **Concurrency Check**. -* We can look closer to the `UpdateAsync` method here, because as we've mentioned earlier we need to pass the provided **ConcurrencyStamp** value to be able to do **Concurrency Check/Control** to our entity while updating. We've used the `SetConcurrencyStampIfNotNull` extension method to set the **ConcurrencyStamp** value to our entity and update the record. +* We can look closer to the `UpdateAsync` method here, because as we've mentioned earlier we need to pass the provided **ConcurrencyStamp** value to be able to do **Concurrency Check/Control** to our entity while updating. * At that point, if the given record is already updated by any other user, a **ConcurrencyStamp** mismatch will occur and `AbpDbConcurrencyException` will be thrown thanks to the **Concurrency Check** system of ABP, data-consistency will be provided and the current record won't be overridden. From 6d3b06ba27ccf0197cc2c04944df15f19ab81ab4 Mon Sep 17 00:00:00 2001 From: braim23 <94292623+braim23@users.noreply.github.com> Date: Mon, 11 Apr 2022 15:29:15 +0300 Subject: [PATCH 145/242] related with the "Fix test result" issue --- .../src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml index 66d2bf89c9..8329c993cd 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml @@ -79,7 +79,7 @@ @L["WiewsWithCount", @Model.Post.ReadCount] | - @L["CommentWithCount", @Model.CommentCount] + @L["CommentWithCount", @Model.CommentCount] @if (await Authorization.IsGrantedAsync(BloggingPermissions.Posts.Update)) @@ -162,7 +162,7 @@ -

    +
    @foreach (var commentWithRepliesDto in Model.CommentsWithReplies) {
    From c38ce7ed62aca66e5a8041d1631b8d8c69bfb160 Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Mon, 11 Apr 2022 15:31:32 +0300 Subject: [PATCH 146/242] Enhancements --- .../SolutionFileModifier.cs | 36 +++---- .../VoloNugetPackagesVersionUpdater.cs | 93 ++++++++++--------- 2 files changed, 70 insertions(+), 59 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs index b78ec017c2..45e0684b4a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs @@ -10,24 +10,28 @@ namespace Volo.Abp.Cli.ProjectModification; public class SolutionFileModifier : ITransientDependency { + public static Encoding DefaultEncoding = Encoding.UTF8; + public async Task RemoveProjectFromSolutionFileAsync(string solutionFile, string projectName) { - using (var fs = File.Open(solutionFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) - using (var sr = new StreamReader(fs, Encoding.Default, true)) + using (var fileStream = File.Open(solutionFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { - var solutionFileContent = await sr.ReadToEndAsync(); - solutionFileContent.NormalizeLineEndings(); + using (var sr = new StreamReader(fileStream, Encoding.Default, true)) + { + var solutionFileContent = await sr.ReadToEndAsync(); + solutionFileContent.NormalizeLineEndings(); - var lines = solutionFileContent.Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.None); - var updatedContent = RemoveProject(lines.ToList(), projectName).JoinAsString(Environment.NewLine); + var lines = solutionFileContent.Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.None); + var updatedContent = RemoveProject(lines.ToList(), projectName).JoinAsString(Environment.NewLine); - fs.Seek(0, SeekOrigin.Begin); - fs.SetLength(0); + fileStream.Seek(0, SeekOrigin.Begin); + fileStream.SetLength(0); - using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) - { - sw.Write(updatedContent); - sw.Flush(); + using (var sw = new StreamWriter(fileStream, DefaultEncoding)) + { + await sw.WriteAsync(updatedContent); + await sw.FlushAsync(); + } } } } @@ -46,8 +50,8 @@ public class SolutionFileModifier : ITransientDependency { var srcFolderId = await AddNewFolderAndGetIdOrGetExistingIdAsync(solutionFile, "src"); - var file = File.ReadAllText(solutionFile); - var lines = file.Split(Environment.NewLine).ToList(); + var solutionFileContent = File.ReadAllText(solutionFile); + var lines = solutionFileContent.Split(Environment.NewLine).ToList(); if (lines.Any(l => l.Contains($"\"{package.Name}\""))) { @@ -77,7 +81,7 @@ public class SolutionFileModifier : ITransientDependency lines.InsertAfter(l => l.Contains("GlobalSection") && l.Contains("NestedProjects"), newPreSolutionLine); - File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines), Encoding.UTF8); + File.WriteAllText(solutionFile, string.Join(Environment.NewLine, lines), DefaultEncoding); } private List RemoveProject(List solutionFileLines, string projectName) @@ -150,7 +154,7 @@ public class SolutionFileModifier : ITransientDependency Path.Combine(Path.GetDirectoryName(solutionFile), "modules", module.Name, "test"), "*.csproj", SearchOption.AllDirectories).ToList(); - } + } foreach (var projectPath in projectsUnderModule) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs index 4e94c983a9..98ad57f4b4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs @@ -18,6 +18,7 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency private readonly NuGetService _nuGetService; private readonly MyGetPackageListFinder _myGetPackageListFinder; public ILogger Logger { get; set; } + public static Encoding DefaultEncoding = Encoding.UTF8; public VoloNugetPackagesVersionUpdater(NuGetService nuGetService, MyGetPackageListFinder myGetPackageListFinder) { @@ -43,25 +44,27 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency async Task UpdateAsync(string filePath) { using (var fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) - using (var sr = new StreamReader(fs, Encoding.Default, true)) { - var fileContent = await sr.ReadToEndAsync(); - - var updatedContent = await UpdateVoloPackagesAsync(fileContent, - includePreviews, - includeReleaseCandidates, - switchToStable, - latestVersionFromNuget, - latestReleaseCandidateVersionFromNuget, - latestVersionFromMyGet, - version); - - fs.Seek(0, SeekOrigin.Begin); - fs.SetLength(0); - using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) + using (var sr = new StreamReader(fs, Encoding.Default, true)) { - sw.Write(updatedContent); - sw.Flush(); + var fileContent = await sr.ReadToEndAsync(); + + var updatedContent = await UpdateVoloPackagesAsync(fileContent, + includePreviews, + includeReleaseCandidates, + switchToStable, + latestVersionFromNuget, + latestReleaseCandidateVersionFromNuget, + latestVersionFromMyGet, + version); + + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); + using (var sw = new StreamWriter(fs, DefaultEncoding)) + { + await sw.WriteAsync(updatedContent); + await sw.FlushAsync(); + } } } } @@ -83,26 +86,28 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency var latestVersionFromMyGet = await GetLatestVersionFromMyGet("Volo.Abp.Core"); using (var fs = File.Open(projectPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) - using (var sr = new StreamReader(fs, Encoding.Default, true)) { - var fileContent = await sr.ReadToEndAsync(); + using (var sr = new StreamReader(fs, Encoding.Default, true)) + { + var fileContent = await sr.ReadToEndAsync(); - var updatedContent = await UpdateVoloPackagesAsync(fileContent, - includeNightlyPreviews, - includeReleaseCandidates, - switchToStable, - latestVersionFromNuget, - latestReleaseCandidateVersionFromNuget, - latestVersionFromMyGet, - version); + var updatedContent = await UpdateVoloPackagesAsync(fileContent, + includeNightlyPreviews, + includeReleaseCandidates, + switchToStable, + latestVersionFromNuget, + latestReleaseCandidateVersionFromNuget, + latestVersionFromMyGet, + version); - fs.Seek(0, SeekOrigin.Begin); - fs.SetLength(0); + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); - using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) - { - sw.Write(updatedContent); - sw.Flush(); + using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) + { + await sw.WriteAsync(updatedContent); + await sw.FlushAsync(); + } } } } @@ -111,19 +116,21 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency protected virtual async Task UpdateInternalAsync(string projectPath, bool includeNightlyPreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false) { using (var fs = File.Open(projectPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) - using (var sr = new StreamReader(fs, Encoding.Default, true)) { - var fileContent = await sr.ReadToEndAsync(); + using (var sr = new StreamReader(fs, Encoding.Default, true)) + { + var fileContent = await sr.ReadToEndAsync(); - var updatedContent = await UpdateVoloPackagesAsync(fileContent, includeNightlyPreviews, includeReleaseCandidates, switchToStable); + var updatedContent = await UpdateVoloPackagesAsync(fileContent, includeNightlyPreviews, includeReleaseCandidates, switchToStable); - fs.Seek(0, SeekOrigin.Begin); - fs.SetLength(0); + fs.Seek(0, SeekOrigin.Begin); + fs.SetLength(0); - using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) - { - sw.Write(updatedContent); - sw.Flush(); + using (var sw = new StreamWriter(fs, sr.CurrentEncoding)) + { + await sw.WriteAsync(updatedContent); + await sw.FlushAsync(); + } } } } @@ -245,7 +252,7 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency } catch (Exception ex) { - Logger.LogError("Cannot update Volo.* packages! An error occured while updating the package \"{0}\". Error: {1}", packageId, ex.Message); + Logger.LogError("Cannot update Volo.* packages! An error occurred while updating the package \"{0}\". Error: {1}", packageId, ex.Message); Logger.LogException(ex); } From 8eaaf6b0455504ff5daef4ca6b671a425e898780 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 12 Apr 2022 10:57:57 +0300 Subject: [PATCH 147/242] Cli: Allow to generate code with Suite resolves https://github.com/volosoft/volo/issues/9596 --- .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 198 +++++++++++++++++- .../Volo/Abp/Cli/Utils/CmdHelper.cs | 16 ++ .../Volo/Abp/Cli/Utils/ICmdHelper.cs | 6 +- 3 files changed, 212 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index 0e797e682f..ad791d05b9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -1,33 +1,51 @@ using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.NetworkInformation; using System.Text; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Newtonsoft.Json.Linq; using NuGet.Versioning; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands.Services; +using Volo.Abp.Cli.Http; using Volo.Abp.Cli.NuGet; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; +using Volo.Abp.Http; +using Volo.Abp.Json; +using Volo.Abp.Threading; namespace Volo.Abp.Cli.Commands; public class SuiteCommand : IConsoleCommand, ITransientDependency { public const string Name = "suite"; - + public ICmdHelper CmdHelper { get; } private readonly AbpNuGetIndexUrlService _nuGetIndexUrlService; private readonly NuGetService _nuGetService; + private readonly CliHttpClientFactory _cliHttpClientFactory; private const string SuitePackageName = "Volo.Abp.Suite"; public ILogger Logger { get; set; } - public SuiteCommand(AbpNuGetIndexUrlService nuGetIndexUrlService, NuGetService nuGetService, ICmdHelper cmdHelper) + public SuiteCommand( + AbpNuGetIndexUrlService nuGetIndexUrlService, + NuGetService nuGetService, + ICmdHelper cmdHelper, + CliHttpClientFactory cliHttpClientFactory) { CmdHelper = cmdHelper; _nuGetIndexUrlService = nuGetIndexUrlService; _nuGetService = nuGetService; + _cliHttpClientFactory = cliHttpClientFactory; Logger = NullLogger.Instance; } @@ -48,6 +66,13 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency RunSuite(); break; + case "generate": + await InstallSuiteIfNotInstalledAsync(); + var suiteProcess = RunSuiteTemporary(); + await GenerateCrudOnSuiteAsync(commandLineArgs); + suiteProcess?.Kill(); + break; + case "install": await InstallSuiteAsync(version, preview); break; @@ -63,6 +88,115 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency } } + private async Task GenerateCrudOnSuiteAsync(CommandLineArgs args) + { + var entityFile = args.Options.GetOrNull(Options.Crud.Entity.Short, Options.Crud.Entity.Long); + var solutionFile = args.Options.GetOrNull(Options.Crud.Solution.Short, Options.Crud.Solution.Long); + + if (entityFile.IsNullOrEmpty() || !entityFile.EndsWith(".json") || !File.Exists(entityFile) || + solutionFile.IsNullOrEmpty() || !solutionFile.EndsWith(".sln")) + { + throw new UserFriendlyException("Invalid Arguments!"); + } + + Logger.LogInformation("Generating CRUD Page..."); + + var client = _cliHttpClientFactory.CreateClient(false); + var solutionId = await GetSolutionIdAsync(client, solutionFile); + + if (!solutionId.HasValue) + { + return; + } + + var entityContent = new StringContent( + File.ReadAllText(entityFile), + Encoding.UTF8, + MimeTypes.Application.Json + ); + + var responseMessage = await client.PostAsync( + $"http://localhost:3000/api/abpSuite/crudPageGenerator/{solutionId.ToString()}/save-and-generate-entity", + entityContent + ); + + var response = await responseMessage.Content.ReadAsStringAsync(); + + if (!response.IsNullOrWhiteSpace()) + { + Logger.LogError(response); + } + else + { + Logger.LogInformation("CRUD page generated."); + } + } + + private async Task GetSolutionIdAsync(HttpClient client, string solutionPath) + { + var timeIntervals = new List(); + for (var i = 0; i < 10; i++) + { + timeIntervals.Add(TimeSpan.FromSeconds(5)); + } + + var responseMessage = await client.GetHttpResponseMessageWithRetryAsync( + "http://localhost:3000/api/abpSuite/solutions", + _cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10)), + Logger, + timeIntervals.ToArray()); + + var response = await responseMessage.Content.ReadAsStringAsync(); + JArray solutions; + + try + { + solutions = (JArray)(JObject.Parse(response)["solutions"]); + } + catch (Exception) + { + Logger.LogError(response); + return await AddSolutionToSuiteAsync(client, solutionPath); + } + + foreach (JObject solution in solutions) + { + if (solution["path"].ToString() == solutionPath) + { + return Guid.Parse(solution["id"].ToString()); + } + } + + return await AddSolutionToSuiteAsync(client, solutionPath); + } + + private async Task AddSolutionToSuiteAsync(HttpClient client, string solutionPath) + { + var entityContent = new StringContent( + "{\"Path\": \"" + solutionPath.Replace("\\", "\\\\") + "\"}", + Encoding.UTF8, + MimeTypes.Application.Json + ); + + var responseMessage = await client.PostAsync( + "http://localhost:3000/api/abpSuite/addSolution", + entityContent, + _cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10)) + ); + + var response = await responseMessage.Content.ReadAsStringAsync(); + + try + { + return Guid.Parse(JObject.Parse(response)["id"].ToString()); + } + catch (Exception) + { + Logger.LogError(response); + return null; + } + } + private async Task InstallSuiteIfNotInstalledAsync() { var currentSuiteVersionAsString = GetCurrentSuiteVersion(); @@ -132,7 +266,8 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency } CmdHelper.RunCmd( - $"dotnet tool install {SuitePackageName}{versionOption} --add-source {nugetIndexUrl} -g", out int exitCode + $"dotnet tool install {SuitePackageName}{versionOption} --add-source {nugetIndexUrl} -g", + out int exitCode ); if (exitCode == 0) @@ -155,7 +290,8 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency private void ShowSuiteManualInstallCommand() { Logger.LogInformation("You can also run the following command to install ABP Suite."); - Logger.LogInformation("dotnet tool install -g Volo.Abp.Suite --add-source https://nuget.abp.io//v3/index.json"); + Logger.LogInformation( + "dotnet tool install -g Volo.Abp.Suite --add-source https://nuget.abp.io//v3/index.json"); } private async Task UpdateSuiteAsync(string version = null, bool preview = false) @@ -202,7 +338,8 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency } CmdHelper.RunCmd( - $"dotnet tool update {SuitePackageName}{versionOption} --add-source {nugetIndexUrl} -g", out int exitCode + $"dotnet tool update {SuitePackageName}{versionOption} --add-source {nugetIndexUrl} -g", + out int exitCode ); if (exitCode != 0) @@ -231,7 +368,8 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency private void ShowSuiteManualUpdateCommand() { Logger.LogError("You can also run the following command to update ABP Suite."); - Logger.LogError("dotnet tool update -g Volo.Abp.Suite --add-source https://nuget.abp.io//v3/index.json"); + Logger.LogError( + "dotnet tool update -g Volo.Abp.Suite --add-source https://nuget.abp.io//v3/index.json"); } private void RemoveSuite() @@ -258,6 +396,37 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency CmdHelper.RunCmd("abp-suite"); } + private Process RunSuiteTemporary() + { + try + { + if (!GlobalToolHelper.IsGlobalToolInstalled("abp-suite")) + { + Logger.LogWarning( + "ABP Suite is not installed! To install it you can run the command: \"abp suite install\""); + return null; + } + } + catch (Exception ex) + { + Logger.LogWarning("Couldn't check ABP Suite installed status: " + ex.Message); + } + + if (IsSuiteAlreadyRunning()) + { + return null; + } + + return CmdHelper.RunCmdAndGetProcess("abp-suite --no-browser"); + } + + bool IsSuiteAlreadyRunning() + { + var ipGP = IPGlobalProperties.GetIPGlobalProperties(); + var endpoints = ipGP.GetActiveTcpListeners(); + return endpoints.Any(e => e.Port == 3000); + } + public string GetUsageInfo() { var sb = new StringBuilder(); @@ -306,5 +475,20 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency public const string Long = "version"; public const string Short = "v"; } + + public static class Crud + { + public static class Solution + { + public const string Long = "solution"; + public const string Short = "s"; + } + + public static class Entity + { + public const string Long = "entity"; + public const string Short = "e"; + } + } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs index 483d047e86..741390dc73 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs @@ -58,6 +58,22 @@ public class CmdHelper : ICmdHelper, ITransientDependency } } + public Process RunCmdAndGetProcess(string command, string workingDirectory = null) + { + var procStartInfo = new ProcessStartInfo( + GetFileName(), + GetArguments(command) + ); + + if (!string.IsNullOrEmpty(workingDirectory)) + { + procStartInfo.WorkingDirectory = workingDirectory; + procStartInfo.CreateNoWindow = false; + } + + return Process.Start(procStartInfo); + } + public string RunCmdAndGetOutput(string command, string workingDirectory = null) { return RunCmdAndGetOutput(command, out int _, workingDirectory); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs index 984b705d33..648215d24f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.Utils; +using System.Diagnostics; + +namespace Volo.Abp.Cli.Utils; public interface ICmdHelper { @@ -12,6 +14,8 @@ public interface ICmdHelper void RunCmd(string command, string workingDirectory = null); + Process RunCmdAndGetProcess(string command, string workingDirectory = null); + void RunCmd(string command, out int exitCode, string workingDirectory = null); string RunCmdAndGetOutput(string command, string workingDirectory = null); From 4135675eaa351b0a675a72b9db69df1f28940cc6 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 12 Apr 2022 10:59:44 +0300 Subject: [PATCH 148/242] Update SuiteCommand.cs --- .../src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index ad791d05b9..b8aa608361 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -420,7 +420,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency return CmdHelper.RunCmdAndGetProcess("abp-suite --no-browser"); } - bool IsSuiteAlreadyRunning() + private bool IsSuiteAlreadyRunning() { var ipGP = IPGlobalProperties.GetIPGlobalProperties(); var endpoints = ipGP.GetActiveTcpListeners(); From 46d5f9ebd815e0f1ab5d8365d168398f2553db94 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 12 Apr 2022 16:35:12 +0300 Subject: [PATCH 149/242] blogging: Revert 6d3b06ba27 --- .../src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml index 8329c993cd..66d2bf89c9 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml @@ -79,7 +79,7 @@ @L["WiewsWithCount", @Model.Post.ReadCount] | - @L["CommentWithCount", @Model.CommentCount] + @L["CommentWithCount", @Model.CommentCount] @if (await Authorization.IsGrantedAsync(BloggingPermissions.Posts.Update)) @@ -162,7 +162,7 @@ -
    +
    @foreach (var commentWithRepliesDto in Model.CommentsWithReplies) {
    From e66e5a824702779521ff4ebb97825a23cc48476a Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Tue, 12 Apr 2022 18:08:45 +0300 Subject: [PATCH 150/242] Update Page-Toolbar-Extensions.md --- docs/en/UI/Angular/Page-Toolbar-Extensions.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/en/UI/Angular/Page-Toolbar-Extensions.md b/docs/en/UI/Angular/Page-Toolbar-Extensions.md index 7e63950224..1edc9594fb 100644 --- a/docs/en/UI/Angular/Page-Toolbar-Extensions.md +++ b/docs/en/UI/Angular/Page-Toolbar-Extensions.md @@ -21,9 +21,9 @@ The following code prepares a constant named `identityToolbarActionContributors` import { eIdentityComponents, - IdentityToolbarActionContributors, - IdentityUserDto, + IdentityToolbarActionContributors } from '@abp/ng.identity'; +import { IdentityUserDto } from '@abp/ng.identity/proxy'; import { ToolbarAction, ToolbarActionList } from '@abp/ng.theme.shared/extensions'; const logUserNames = new ToolbarAction({ @@ -93,7 +93,7 @@ We need to have a component before we can pass it to the toolbar action contribu ```js // src/app/click-me-button.component.ts -import { IdentityUserDto } from '@abp/ng.identity'; +import { IdentityUserDto } from '@abp/ng.identity/proxy'; import { ActionData, EXTENSIONS_ACTION_DATA } from '@abp/ng.theme.shared/extensions'; import { Component, Inject } from '@angular/core'; @@ -127,9 +127,9 @@ The following code prepares a constant named `identityToolbarActionContributors` import { eIdentityComponents, - IdentityToolbarActionContributors, - IdentityUserDto, + IdentityToolbarActionContributors } from '@abp/ng.identity'; +import { IdentityUserDto } from '@abp/ng.identity/proxy'; import { ToolbarActionList, ToolbarComponent } from '@abp/ng.theme.shared/extensions'; import { ClickMeButtonComponent } from './click-me-button.component'; @@ -362,7 +362,7 @@ export function reorderUserContributors( ) { // drop "New User" button const newUserActionNode = actionList.dropByValue( - 'AbpIdentity::NewUser', + 'AbpIdentity::NewUser', (action, text) => action['text'] === text, ); From e3c4c5ebe2cd87cbca5c8f6b7d2eef3d8ad9a5b9 Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Wed, 13 Apr 2022 02:24:59 +0300 Subject: [PATCH 151/242] Close Suite after code generation #12231 --- .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 52 ++++++++++++++----- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index b8aa608361..aabd5c6dfd 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -36,6 +36,8 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency private const string SuitePackageName = "Volo.Abp.Suite"; public ILogger Logger { get; set; } + private const string AbpSuiteHost = "http://localhost:3000"; + public SuiteCommand( AbpNuGetIndexUrlService nuGetIndexUrlService, NuGetService nuGetService, @@ -68,9 +70,14 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency case "generate": await InstallSuiteIfNotInstalledAsync(); - var suiteProcess = RunSuiteTemporary(); - await GenerateCrudOnSuiteAsync(commandLineArgs); - suiteProcess?.Kill(); + var suiteProcess = StartSuite(); + System.Threading.Thread.Sleep(500); //wait for initialization of the app + await GenerateCrudPageAsync(commandLineArgs); + if (suiteProcess != null) + { + KillSuite(); + } + break; case "install": @@ -88,7 +95,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency } } - private async Task GenerateCrudOnSuiteAsync(CommandLineArgs args) + private async Task GenerateCrudPageAsync(CommandLineArgs args) { var entityFile = args.Options.GetOrNull(Options.Crud.Entity.Short, Options.Crud.Entity.Long); var solutionFile = args.Options.GetOrNull(Options.Crud.Solution.Short, Options.Crud.Solution.Long); @@ -98,7 +105,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency { throw new UserFriendlyException("Invalid Arguments!"); } - + Logger.LogInformation("Generating CRUD Page..."); var client = _cliHttpClientFactory.CreateClient(false); @@ -108,7 +115,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency { return; } - + var entityContent = new StringContent( File.ReadAllText(entityFile), Encoding.UTF8, @@ -116,7 +123,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency ); var responseMessage = await client.PostAsync( - $"http://localhost:3000/api/abpSuite/crudPageGenerator/{solutionId.ToString()}/save-and-generate-entity", + $"{AbpSuiteHost}/api/abpSuite/crudPageGenerator/{solutionId.ToString()}/save-and-generate-entity", entityContent ); @@ -128,7 +135,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency } else { - Logger.LogInformation("CRUD page generated."); + Logger.LogInformation("CRUD page generation successfully completed."); } } @@ -148,7 +155,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency var response = await responseMessage.Content.ReadAsStringAsync(); JArray solutions; - + try { solutions = (JArray)(JObject.Parse(response)["solutions"]); @@ -185,7 +192,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency ); var response = await responseMessage.Content.ReadAsStringAsync(); - + try { return Guid.Parse(JObject.Parse(response)["id"].ToString()); @@ -396,14 +403,13 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency CmdHelper.RunCmd("abp-suite"); } - private Process RunSuiteTemporary() + private Process StartSuite() { try { if (!GlobalToolHelper.IsGlobalToolInstalled("abp-suite")) { - Logger.LogWarning( - "ABP Suite is not installed! To install it you can run the command: \"abp suite install\""); + Logger.LogWarning("ABP Suite is not installed! To install it you can run the command: \"abp suite install\""); return null; } } @@ -427,6 +433,26 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency return endpoints.Any(e => e.Port == 3000); } + private void KillSuite() + { + try + { + var suiteProcesses = (from p in Process.GetProcesses() + where p.ProcessName.ToLower().Contains("abp-suite") + select p); + + foreach (var suiteProcess in suiteProcesses) + { + suiteProcess.Kill(); + Logger.LogInformation("Suite closed."); + } + } + catch (Exception ex) + { + Logger.LogInformation("Cannot close Suite." + ex.Message); + } + } + public string GetUsageInfo() { var sb = new StringBuilder(); From 67247e05e0e83f81b5bc2c2b49a6ead6523ad460 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 13 Apr 2022 09:25:27 +0800 Subject: [PATCH 152/242] Make methods of AuditPropertySetter virtual --- .../Volo/Abp/Auditing/AuditPropertySetter.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs index 91b5019199..d85bad82eb 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs @@ -21,25 +21,25 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency Clock = clock; } - public void SetCreationProperties(object targetObject) + public virtual void SetCreationProperties(object targetObject) { SetCreationTime(targetObject); SetCreatorId(targetObject); } - public void SetModificationProperties(object targetObject) + public virtual void SetModificationProperties(object targetObject) { SetLastModificationTime(targetObject); SetLastModifierId(targetObject); } - public void SetDeletionProperties(object targetObject) + public virtual void SetDeletionProperties(object targetObject) { SetDeletionTime(targetObject); SetDeleterId(targetObject); } - private void SetCreationTime(object targetObject) + protected virtual void SetCreationTime(object targetObject) { if (!(targetObject is IHasCreationTime objectWithCreationTime)) { @@ -52,7 +52,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency } } - private void SetCreatorId(object targetObject) + protected virtual void SetCreatorId(object targetObject) { if (!CurrentUser.Id.HasValue) { @@ -95,7 +95,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency } } - private void SetLastModificationTime(object targetObject) + protected virtual void SetLastModificationTime(object targetObject) { if (targetObject is IHasModificationTime objectWithModificationTime) { @@ -103,7 +103,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency } } - private void SetLastModifierId(object targetObject) + protected virtual void SetLastModifierId(object targetObject) { if (!(targetObject is IModificationAuditedObject modificationAuditedObject)) { @@ -137,7 +137,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency modificationAuditedObject.LastModifierId = CurrentUser.Id; } - private void SetDeletionTime(object targetObject) + protected virtual void SetDeletionTime(object targetObject) { if (targetObject is IHasDeletionTime objectWithDeletionTime) { @@ -148,7 +148,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency } } - private void SetDeleterId(object targetObject) + protected virtual void SetDeleterId(object targetObject) { if (!(targetObject is IDeletionAuditedObject deletionAuditedObject)) { From 187732612a61687ae32f8a16063c240d47243936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 14 Apr 2022 11:36:04 +0300 Subject: [PATCH 153/242] Update POST.md --- .../2022-04-14-Dependency-Injection/POST.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/Community-Articles/2022-04-14-Dependency-Injection/POST.md b/docs/en/Community-Articles/2022-04-14-Dependency-Injection/POST.md index edd74c1591..092fb72dbc 100644 --- a/docs/en/Community-Articles/2022-04-14-Dependency-Injection/POST.md +++ b/docs/en/Community-Articles/2022-04-14-Dependency-Injection/POST.md @@ -18,15 +18,15 @@ public class ElasticsearchExternalLogger : IExternalLogger { public async Task LogAsync(string logText) { - //TODO... + // TODO... } } public class AzureExternalLogger : IExternalLogger { - public Task LogAsync(string logText) + public async Task LogAsync(string logText) { - throw new System.NotImplementedException(); + // TODO... } } ```` From ea7478e82572f0ab2bcaedda40da1fcd2349c2a0 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 14 Apr 2022 16:22:03 +0300 Subject: [PATCH 154/242] Move Blazor PWA implementation logic to ConfigureWithBlazorUi method --- .../Templates/App/AppTemplateBase.cs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index e232629e5a..3dd6ece476 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -209,15 +209,6 @@ public abstract class AppTemplateBase : TemplateInfo { RemoveCmsKitDependenciesFromPackageJsonFiles(steps); } - - if (context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.ProgressiveWebApp.Short)) - { - context.Symbols.Add("PWA"); - } - else - { - RemovePwaFiles(steps); - } } protected static void RemoveCmsKitDependenciesFromPackageJsonFiles(List steps) @@ -247,15 +238,6 @@ public abstract class AppTemplateBase : TemplateInfo } } - protected static void RemovePwaFiles(List steps) - { - steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.js")); - steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.published.js")); - steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/manifest.json")); - steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-192.png")); - steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-512.png")); - } - protected bool IsCmsKitSupportedForTargetVersion(ProjectBuildContext context) { if (string.IsNullOrWhiteSpace(context.BuildArgs.Version)) @@ -307,6 +289,19 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host")); steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305")); } + + if (context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.ProgressiveWebApp.Short)) + { + context.Symbols.Add("PWA"); + } + else + { + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.js")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/service-worker.published.js")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/manifest.json")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-192.png")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/icon-512.png")); + } } protected void ConfigureWithBlazorServerUi(ProjectBuildContext context, List steps) @@ -383,6 +378,11 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host")); steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305")); } + + if (context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.ProgressiveWebApp.Short)) + { + context.Symbols.Add("PWA"); + } } protected void RemoveUnnecessaryPorts(ProjectBuildContext context, List steps) From f56d83ef39d270b3882d91d01a0553f244c346aa Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 14 Apr 2022 16:22:19 +0300 Subject: [PATCH 155/242] Add Angualr pwa support to CLI --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 16 +++++++- .../AngularPwaSupportAdder.cs | 40 +++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 420e64eb18..4cb0ef4635 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -12,6 +12,7 @@ using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ProjectBuilding; +using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectModification; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -24,17 +25,20 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien protected TemplateProjectBuilder TemplateProjectBuilder { get; } public ITemplateInfoProvider TemplateInfoProvider { get; } - + protected AngularPwaSupportAdder AngularPwaSupportAdder { get; } + public NewCommand(TemplateProjectBuilder templateProjectBuilder , ITemplateInfoProvider templateInfoProvider, ConnectionStringProvider connectionStringProvider, SolutionPackageVersionFinder solutionPackageVersionFinder, ICmdHelper cmdHelper, - IInstallLibsService installLibsService) + IInstallLibsService installLibsService, + AngularPwaSupportAdder angularPwaSupportAdder) : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper, installLibsService) { TemplateProjectBuilder = templateProjectBuilder; TemplateInfoProvider = templateInfoProvider; + AngularPwaSupportAdder = angularPwaSupportAdder; } public async Task ExecuteAsync(CommandLineArgs commandLineArgs) @@ -79,6 +83,14 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien RunGraphBuildForMicroserviceServiceTemplate(projectArgs); await RunInstallLibsForWebTemplateAsync(projectArgs); OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); + + var pwa = commandLineArgs.Options.ContainsKey(Options.ProgressiveWebApp.Short); + var angular = projectArgs.UiFramework == UiFramework.Angular; + if (angular && pwa) + { + Logger.LogInformation("Adding PWA Support to Angular app."); + AngularPwaSupportAdder.AddPwaSupport(projectArgs.OutputFolder); + } } public string GetUsageInfo() diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs new file mode 100644 index 0000000000..4781252705 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs @@ -0,0 +1,40 @@ +using System; +using System.IO; +using System.Linq; +using Volo.Abp.Cli.Utils; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.ProjectModification; + +public class AngularPwaSupportAdder : ITransientDependency +{ + protected ICmdHelper CmdHelper { get; } + protected PackageJsonFileFinder PackageJsonFileFinder { get; } + + public AngularPwaSupportAdder( + ICmdHelper cmdHelper, + PackageJsonFileFinder packageJsonFileFinder) + { + CmdHelper = cmdHelper; + PackageJsonFileFinder = packageJsonFileFinder; + } + + public virtual void AddPwaSupport(string rootDirectory) + { + var fileList = PackageJsonFileFinder.Find(rootDirectory).Where(x => x.Contains("angular")).ToList(); + + if (!fileList.Any()) + { + return; + } + + fileList.ForEach(AddPwaSupportToProject); + } + + protected virtual void AddPwaSupportToProject(string filePath) + { + var directory = Path.GetDirectoryName(filePath).EnsureEndsWith(Path.DirectorySeparatorChar); + + CmdHelper.RunCmd($"cd {directory} && ng add @angular/pwa --skip-confirmation"); + } +} From 65203e7c9beb80c3b4bd9f7556fbb1517b79de13 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 14 Apr 2022 16:35:09 +0300 Subject: [PATCH 156/242] Move Angular PWA logic to ProjectCreationCommandBase --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 14 +++---------- .../Commands/ProjectCreationCommandBase.cs | 20 +++++++++++++++++-- .../Cli/ProjectBuilding/ProjectBuildArgs.cs | 6 +++++- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 4cb0ef4635..526ae77363 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -25,7 +25,6 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien protected TemplateProjectBuilder TemplateProjectBuilder { get; } public ITemplateInfoProvider TemplateInfoProvider { get; } - protected AngularPwaSupportAdder AngularPwaSupportAdder { get; } public NewCommand(TemplateProjectBuilder templateProjectBuilder , ITemplateInfoProvider templateInfoProvider, @@ -34,11 +33,10 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien ICmdHelper cmdHelper, IInstallLibsService installLibsService, AngularPwaSupportAdder angularPwaSupportAdder) - : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper, installLibsService) + : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper, installLibsService, angularPwaSupportAdder) { TemplateProjectBuilder = templateProjectBuilder; TemplateInfoProvider = templateInfoProvider; - AngularPwaSupportAdder = angularPwaSupportAdder; } public async Task ExecuteAsync(CommandLineArgs commandLineArgs) @@ -82,15 +80,9 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien RunGraphBuildForMicroserviceServiceTemplate(projectArgs); await RunInstallLibsForWebTemplateAsync(projectArgs); - OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); + ConfigurePwaSupportForAngular(projectArgs); - var pwa = commandLineArgs.Options.ContainsKey(Options.ProgressiveWebApp.Short); - var angular = projectArgs.UiFramework == UiFramework.Angular; - if (angular && pwa) - { - Logger.LogInformation("Adding PWA Support to Angular app."); - AngularPwaSupportAdder.AddPwaSupport(projectArgs.OutputFolder); - } + OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); } public string GetUsageInfo() diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 368f022bda..6e280d7dc3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -25,18 +25,21 @@ public abstract class ProjectCreationCommandBase public SolutionPackageVersionFinder SolutionPackageVersionFinder { get; } public ICmdHelper CmdHelper { get; } public IInstallLibsService InstallLibsService { get; } + public AngularPwaSupportAdder AngularPwaSupportAdder { get; } public ILogger Logger { get; set; } public ProjectCreationCommandBase( ConnectionStringProvider connectionStringProvider, SolutionPackageVersionFinder solutionPackageVersionFinder, ICmdHelper cmdHelper, - IInstallLibsService installLibsService) + IInstallLibsService installLibsService, + AngularPwaSupportAdder angularPwaSupportAdder) { ConnectionStringProvider = connectionStringProvider; SolutionPackageVersionFinder = solutionPackageVersionFinder; CmdHelper = cmdHelper; InstallLibsService = installLibsService; + AngularPwaSupportAdder = angularPwaSupportAdder; Logger = NullLogger.Instance; } @@ -176,7 +179,8 @@ public abstract class ProjectCreationCommandBase gitHubVoloLocalRepositoryPath, templateSource, commandLineArgs.Options, - connectionString + connectionString, + pwa ); } @@ -333,6 +337,18 @@ public abstract class ProjectCreationCommandBase } } + protected void ConfigurePwaSupportForAngular(ProjectBuildArgs projectArgs) + { + var isAngular = projectArgs.UiFramework == UiFramework.Angular; + var isPwa = projectArgs.Pwa; + + if (isAngular && isPwa) + { + Logger.LogInformation("Adding PWA Support to Angular app."); + AngularPwaSupportAdder.AddPwaSupport(projectArgs.OutputFolder); + } + } + protected virtual DatabaseManagementSystem GetDatabaseManagementSystem(CommandLineArgs commandLineArgs) { var optionValue = commandLineArgs.Options.GetOrNull(Options.DatabaseManagementSystem.Short, Options.DatabaseManagementSystem.Long); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs index 6d9b754cba..3c057454f6 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs @@ -40,6 +40,8 @@ public class ProjectBuildArgs [NotNull] public string OutputFolder { get; set; } + public bool Pwa { get; set; } + [NotNull] public Dictionary ExtraProperties { get; set; } @@ -57,7 +59,8 @@ public class ProjectBuildArgs [CanBeNull] string voloGitHubLocalRepositoryPath = null, [CanBeNull] string templateSource = null, Dictionary extraProperties = null, - [CanBeNull] string connectionString = null) + [CanBeNull] string connectionString = null, + bool pwa = false) { SolutionName = Check.NotNull(solutionName, nameof(solutionName)); TemplateName = templateName; @@ -73,5 +76,6 @@ public class ProjectBuildArgs TemplateSource = templateSource; ExtraProperties = extraProperties ?? new Dictionary(); ConnectionString = connectionString; + Pwa = pwa; } } From 47e1284aeb516a96d9e83e14f8d771b75b67f276 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 18 Apr 2022 09:33:27 +0800 Subject: [PATCH 157/242] No layers template missing console logs for non development environments --- .../Program.cs | 5 +---- .../MyCompanyName.MyProjectName.Blazor.Server/Program.cs | 5 +---- .../MyCompanyName.MyProjectName.Host.Mongo/Program.cs | 5 +---- .../aspnet-core/MyCompanyName.MyProjectName.Host/Program.cs | 5 +---- .../MyCompanyName.MyProjectName.Mvc.Mongo/Program.cs | 5 +---- .../aspnet-core/MyCompanyName.MyProjectName.Mvc/Program.cs | 5 +---- 6 files changed, 6 insertions(+), 24 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Program.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Program.cs index 051587bb5c..07e558fb39 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Program.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Program.cs @@ -18,12 +18,9 @@ public class Program .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() -#if DEBUG .WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.Console()); -#else - .WriteTo.Async(c => c.File("Logs/logs.txt")); -#endif + if (IsMigrateDatabase(args)) { loggerConfiguration.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Program.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Program.cs index 0226e0a554..4553f8cfd1 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Program.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Program.cs @@ -24,12 +24,9 @@ public class Program .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() -#if DEBUG .WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.Console()); -#else - .WriteTo.Async(c => c.File("Logs/logs.txt")); -#endif + if (IsMigrateDatabase(args)) { loggerConfiguration.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Program.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Program.cs index a9366b95fe..6eb33e471a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Program.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Program.cs @@ -17,12 +17,9 @@ public class Program .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() -#if DEBUG .WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.Console()); -#else - .WriteTo.Async(c => c.File("Logs/logs.txt")); -#endif + if (IsMigrateDatabase(args)) { loggerConfiguration.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Program.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Program.cs index c4c428b90d..199b799da8 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Program.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Program.cs @@ -23,12 +23,9 @@ public class Program .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() -#if DEBUG .WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.Console()); -#else - .WriteTo.Async(c => c.File("Logs/logs.txt")); -#endif + if (IsMigrateDatabase(args)) { loggerConfiguration.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Program.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Program.cs index e3b1aeed74..9d076b5f23 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Program.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Program.cs @@ -18,12 +18,9 @@ public class Program .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() -#if DEBUG .WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.Console()); -#else - .WriteTo.Async(c => c.File("Logs/logs.txt")); -#endif + if (IsMigrateDatabase(args)) { loggerConfiguration.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Program.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Program.cs index 358f8dda73..57e81aa17c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Program.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Program.cs @@ -24,12 +24,9 @@ public class Program .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() -#if DEBUG .WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.Console()); -#else - .WriteTo.Async(c => c.File("Logs/logs.txt")); -#endif + if (IsMigrateDatabase(args)) { loggerConfiguration.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning); From 00e18120b0566c741011b7e572d62b866c508102 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 18 Apr 2022 11:19:32 +0800 Subject: [PATCH 158/242] Add IsEnabledAsync to IExternalLoginProvider --- .../Volo/Abp/Identity/ExternalLoginProviderBase.cs | 2 ++ .../Volo/Abp/Identity/IExternalLoginProvider.cs | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs index d129ba917e..cfefad2a95 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs @@ -32,6 +32,8 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider } public abstract Task TryAuthenticateAsync(string userName, string plainPassword); + + public abstract Task IsEnabledAsync(); public virtual async Task CreateUserAsync(string userName, string providerName) { diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs index 56d6c643fb..52d3895d13 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs @@ -28,4 +28,10 @@ public interface IExternalLoginProvider /// The name of this provider /// The user that can be updated Task UpdateUserAsync(IdentityUser user, string providerName); + + /// + /// Return a value indicating whether this source is enabled. + /// + /// + Task IsEnabledAsync(); } From a16c1e3de5713f1cf9cc729c1d9e18bfe01a6bed Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 18 Apr 2022 12:06:07 +0800 Subject: [PATCH 159/242] Update FakeExternalLoginProvider --- .../Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs index 6583156c82..fbfc0e2ef6 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs @@ -35,6 +35,11 @@ public class FakeExternalLoginProvider : ExternalLoginProviderBase, ITransientDe ); } + public override Task IsEnabledAsync() + { + return Task.FromResult(true); + } + protected override Task GetUserInfoAsync(string userName) { if (userName != "ext_user") From 0891d82d48a57df22e5b70ad2d54236815c76cba Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 18 Apr 2022 14:47:05 +0800 Subject: [PATCH 160/242] Add `AbpDesignTimeDbContextBase`. --- .../Design/AbpDesignTimeDbContextBase.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs new file mode 100644 index 0000000000..c8fce37399 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; +using Volo.Abp.Threading; + +namespace Volo.Abp.EntityFrameworkCore.Design; + +public abstract class AbpDesignTimeDbContextBase : IDesignTimeDbContextFactory + where TModule : AbpModule + where TContext : DbContext +{ + public virtual TContext CreateDbContext(string[] args) + { + return AsyncHelper.RunSync(() => CreateDbContextAsync(args)); + } + + protected virtual async Task CreateDbContextAsync(string[] args) + { + var application = await AbpApplicationFactory.CreateAsync(); + application.Services.ReplaceConfiguration(BuildConfiguration()); + await application.InitializeAsync(); + return application.ServiceProvider.GetRequiredService(); + } + + protected abstract IConfigurationRoot BuildConfiguration(); +} From e0bf7d8f16f7bcd4176b144d09409019104b78ee Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 18 Apr 2022 17:01:28 +0800 Subject: [PATCH 161/242] Update AbpDesignTimeDbContextBase.cs --- .../Design/AbpDesignTimeDbContextBase.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs index c8fce37399..c3746f620d 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Design/AbpDesignTimeDbContextBase.cs @@ -19,11 +19,21 @@ public abstract class AbpDesignTimeDbContextBase : IDesignTim protected virtual async Task CreateDbContextAsync(string[] args) { - var application = await AbpApplicationFactory.CreateAsync(); - application.Services.ReplaceConfiguration(BuildConfiguration()); + var application = await AbpApplicationFactory.CreateAsync(options => + { + options.Services.ReplaceConfiguration(BuildConfiguration()); + ConfigureServices(options.Services); + }); + await application.InitializeAsync(); + return application.ServiceProvider.GetRequiredService(); } + protected virtual void ConfigureServices(IServiceCollection services) + { + + } + protected abstract IConfigurationRoot BuildConfiguration(); } From 4f21f6dc3ed5d2f6cb181ac9f87e799cb451c460 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 18 Apr 2022 18:31:26 +0300 Subject: [PATCH 162/242] CmsKit - Prevent data seeding if global feature disabled --- .../Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs index b212e5e21a..e99ab47964 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; +using Volo.Abp.GlobalFeatures; namespace Volo.CmsKit.Blogs; @@ -19,6 +20,11 @@ public class BlogFeatureDataSeedContributor : IDataSeedContributor, ITransientDe public async Task SeedAsync(DataSeedContext context) { + if (!GlobalFeatureManager.Instance.IsEnabled()) + { + return; + } + var blogs = await _blogRepository.GetListAsync(); foreach (var blog in blogs) From f1566fa44a932788a63431930e5aed69580ca2d5 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 18 Apr 2022 18:32:29 +0300 Subject: [PATCH 163/242] Add missing BlogFeature property to ICmsKitDbContext --- .../Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs index a405612f39..fca31f2d73 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs @@ -26,6 +26,7 @@ public interface ICmsKitDbContext : IEfCoreDbContext DbSet Pages { get; } DbSet Blogs { get; } DbSet BlogPosts { get; } + DbSet BlogFeatures { get; } DbSet MediaDescriptors { get; } DbSet MenuItems { get; } DbSet GlobalResources { get; } From a3413dbb445ad5f74bbd912aefb284f4cb64cc88 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 19 Apr 2022 09:54:11 +0800 Subject: [PATCH 164/242] Disable the abp module for dynamic JavaScript client proxies Resolve #12297 --- framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs index 76724ce0a5..bc5641a651 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs @@ -17,5 +17,10 @@ public class AbpHttpModule : AbpModule { options.Generators[JQueryProxyScriptGenerator.Name] = typeof(JQueryProxyScriptGenerator); }); + + Configure(options => + { + options.DisableModule("abp"); + }); } } From 65e26c0f0e7225ed5462ea437d190692a0b4a9c2 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 19 Apr 2022 10:03:21 +0800 Subject: [PATCH 165/242] Move to `AbpAspNetCoreMvcModule` --- .../Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 6 ++++++ framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index c205e15321..22b919c91c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -36,6 +36,7 @@ using Volo.Abp.Http; using Volo.Abp.DynamicProxy; using Volo.Abp.GlobalFeatures; using Volo.Abp.Http.Modeling; +using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Json; using Volo.Abp.Localization; using Volo.Abp.Modularity; @@ -185,6 +186,11 @@ public class AbpAspNetCoreMvcModule : AbpModule endpointContext.Endpoints.MapRazorPages(); }); }); + + Configure(options => + { + options.DisableModule("abp"); + }); } public override void PostConfigureServices(ServiceConfigurationContext context) diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs index bc5641a651..76724ce0a5 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpModule.cs @@ -17,10 +17,5 @@ public class AbpHttpModule : AbpModule { options.Generators[JQueryProxyScriptGenerator.Name] = typeof(JQueryProxyScriptGenerator); }); - - Configure(options => - { - options.DisableModule("abp"); - }); } } From 52cc582b8dad078b3b74d4e2c849ab8b218a99d3 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 19 Apr 2022 10:24:15 +0800 Subject: [PATCH 166/242] Update package.json --- npm/packs/cms-kit.admin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index 3877658bd3..17d676756d 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -8,7 +8,7 @@ "@abp/jstree": "~5.2.1", "@abp/slugify": "~5.2.1", "@abp/tui-editor": "~5.2.1", - "@abp/uppy": "~5.2.1" + "@abp/uppy": "~5.2.1", "@abp/codemirror": "~5.2.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" From fd46f43417488556509f5286da138f5cb0c8a6fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 02:38:55 +0000 Subject: [PATCH 167/242] Bump prismjs from 1.19.0 to 1.28.0 in /modules/docs/app/VoloDocs.Web Bumps [prismjs](https://github.com/PrismJS/prism) from 1.19.0 to 1.28.0. - [Release notes](https://github.com/PrismJS/prism/releases) - [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md) - [Commits](https://github.com/PrismJS/prism/compare/v1.19.0...v1.28.0) --- updated-dependencies: - dependency-name: prismjs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../docs/app/VoloDocs.Web/package-lock.json | 1433 +++++++---------- modules/docs/app/VoloDocs.Web/yarn.lock | 6 +- 2 files changed, 557 insertions(+), 882 deletions(-) diff --git a/modules/docs/app/VoloDocs.Web/package-lock.json b/modules/docs/app/VoloDocs.Web/package-lock.json index e764349469..9ae1d55d3d 100644 --- a/modules/docs/app/VoloDocs.Web/package-lock.json +++ b/modules/docs/app/VoloDocs.Web/package-lock.json @@ -5,251 +5,269 @@ "requires": true, "dependencies": { "@abp/anchor-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/anchor-js/-/anchor-js-1.1.1.tgz", - "integrity": "sha512-hHyYYJ09hhT5xeQJUsBN43yT+y49FKcigq4Wrx8448TrW7r2NJD5i3Xy3BGEstNSlfcQPTsmciQnbkcU2rX1HQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/anchor-js/-/anchor-js-5.2.1.tgz", + "integrity": "sha512-61+rrfSQyZacqUJ5qQxkoWYffWcd7AArkj8DmEHmFY4e28hH3P9eXMcuGBoJ85pXleAPEmVYswc/xZiTMNHkvg==", "requires": { - "@abp/core": "^1.1.1", - "anchor-js": "^4.2.2" + "@abp/core": "~5.2.1", + "anchor-js": "^4.3.1" } }, "@abp/aspnetcore.mvc.ui": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-1.1.1.tgz", - "integrity": "sha512-wZbptVCSxZzEjkJx+/sWrH9Pikp9nOy7V8Htz+L+S7/qAzfXu5PRVV8ahddfAcDHRk30buRhdbJlCVdt6hkZ6g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz", + "integrity": "sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg==", "requires": { "ansi-colors": "^4.1.1", "extend-object": "^1.0.0", + "glob": "^7.1.6", "gulp": "^4.0.2", "merge-stream": "^2.0.0", - "path": "^0.12.7", - "rimraf": "^3.0.0" + "micromatch": "^4.0.2" } }, "@abp/aspnetcore.mvc.ui.theme.basic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-1.1.1.tgz", - "integrity": "sha512-ooXtCM3TWN69RU7xs6avnzOQBXzsiHY5BEIogzSBialZC4uG5H56qrIr4MbsFNae+PQM23Mw2tnJ/Z7dutURCQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz", + "integrity": "sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA==", "requires": { - "@abp/aspnetcore.mvc.ui.theme.shared": "^1.1.1" + "@abp/aspnetcore.mvc.ui.theme.shared": "~5.2.1" } }, "@abp/aspnetcore.mvc.ui.theme.shared": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-1.1.1.tgz", - "integrity": "sha512-LilSyefzT1+rcTU7vbWxcO8TwBgGZIx6QbMUrDicSTH6LLJ9S5+yNaGNJbbZKDG6qx0BEoC1u8dE8KCUshwxoQ==", - "requires": { - "@abp/aspnetcore.mvc.ui": "^1.1.1", - "@abp/bootstrap": "^1.1.1", - "@abp/bootstrap-datepicker": "^1.1.1", - "@abp/datatables.net-bs4": "^1.1.1", - "@abp/font-awesome": "^1.1.1", - "@abp/jquery-form": "^1.1.1", - "@abp/jquery-validation-unobtrusive": "^1.1.1", - "@abp/lodash": "^1.1.1", - "@abp/luxon": "^1.1.1", - "@abp/malihu-custom-scrollbar-plugin": "^1.1.1", - "@abp/select2": "^1.1.1", - "@abp/sweetalert": "^1.1.1", - "@abp/timeago": "^1.1.1", - "@abp/toastr": "^1.1.1" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz", + "integrity": "sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ==", + "requires": { + "@abp/aspnetcore.mvc.ui": "~5.2.1", + "@abp/bootstrap": "~5.2.1", + "@abp/bootstrap-datepicker": "~5.2.1", + "@abp/datatables.net-bs5": "~5.2.1", + "@abp/font-awesome": "~5.2.1", + "@abp/jquery-form": "~5.2.1", + "@abp/jquery-validation-unobtrusive": "~5.2.1", + "@abp/lodash": "~5.2.1", + "@abp/luxon": "~5.2.1", + "@abp/malihu-custom-scrollbar-plugin": "~5.2.1", + "@abp/select2": "~5.2.1", + "@abp/sweetalert2": "~5.2.1", + "@abp/timeago": "~5.2.1", + "@abp/toastr": "~5.2.1" } }, "@abp/bootstrap": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-1.1.1.tgz", - "integrity": "sha512-OIaGJaizhI8UNfy4bnw2xT2Z0QG7BJJrjxOPGepfd4jn/AUi/vFdOpJFWvu2P9PwSzRmn/LuSlr2WONDOdPVWQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-5.2.1.tgz", + "integrity": "sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A==", "requires": { - "@abp/core": "^1.1.1", - "bootstrap": "^4.3.1" + "@abp/core": "~5.2.1", + "bootstrap": "^5.1.3" } }, "@abp/bootstrap-datepicker": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-1.1.1.tgz", - "integrity": "sha512-RIQLSrKBu/cTAU2lFenSAoKcMp7wgF4e3nP4/iOu5ZtCgti5vUjMEcqEvBxtlwKTHMXsTG4GtNKqjTwjXMjONQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz", + "integrity": "sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww==", "requires": { "bootstrap-datepicker": "^1.9.0" } }, "@abp/clipboard": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/clipboard/-/clipboard-1.1.1.tgz", - "integrity": "sha512-O6b7VCAh2mxjkPhgUZYQBhXf0u+dWRECBOYN4KxYiKfk+2xL8X+34Ls7hVLbyuD+4xCcNirMZIG5CnS8auHC/A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/clipboard/-/clipboard-5.2.1.tgz", + "integrity": "sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A==", "requires": { - "@abp/core": "^1.1.1", - "clipboard": "^2.0.4" + "@abp/core": "~5.2.1", + "clipboard": "^2.0.8" } }, "@abp/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/core/-/core-1.1.1.tgz", - "integrity": "sha512-OvUG7xRvk8nSqwC1s45YPnTuhC2OWe1AVa1nnC6FVHMH/g1Je7UJwnbu47K7uNS+lDRJUIktNbufYKiwutEjRg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/core/-/core-5.2.1.tgz", + "integrity": "sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ==", + "requires": { + "@abp/utils": "~5.2.1" + } }, "@abp/datatables.net": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-1.1.1.tgz", - "integrity": "sha512-y76IDBlgc0n1YgQqJ+9cfzXpLwr2arhdIfSmqX+qRXz6GfVNY7e3JijkFSgDKUzKGYo1HZMzgJmDmeNIRwMZsQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-5.2.1.tgz", + "integrity": "sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w==", "requires": { - "@abp/core": "^1.1.1", - "datatables.net": "^1.10.20" + "@abp/jquery": "~5.2.1", + "datatables.net": "^1.11.4" } }, - "@abp/datatables.net-bs4": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/datatables.net-bs4/-/datatables.net-bs4-1.1.1.tgz", - "integrity": "sha512-t40xQIGBMLPZiSbcZHW3AwE8uk+xcl7OitBT1jym0XPKVtgJsHez3ynDE5v/PjHe+ColCG8lTRjRnNoXo5dzDw==", + "@abp/datatables.net-bs5": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz", + "integrity": "sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA==", "requires": { - "@abp/datatables.net": "^1.1.1", - "datatables.net-bs4": "^1.10.20" + "@abp/datatables.net": "~5.2.1", + "datatables.net-bs5": "^1.11.4" } }, "@abp/docs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/docs/-/docs-1.1.1.tgz", - "integrity": "sha512-z2Dk7EOhBdFo6BYbgccD91PIg37L2ehkgRT4RWf61dRyjPAQgPwwwyVSqApFmKveWPCzreHoTPKbnrU7EzAssw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/docs/-/docs-5.2.1.tgz", + "integrity": "sha512-WZCCY73vyIpRu7hypPiP9CRr4Bvzkv3up0WeGQ4rK9LiZWNSxG9PXv4lYeD4cuHg0zgxH9d/6toYToaIJNqDCQ==", "requires": { - "@abp/anchor-js": "^1.1.1", - "@abp/clipboard": "^1.1.1", - "@abp/malihu-custom-scrollbar-plugin": "^1.1.1", - "@abp/popper.js": "^1.1.1", - "@abp/prismjs": "^1.1.1" + "@abp/anchor-js": "~5.2.1", + "@abp/clipboard": "~5.2.1", + "@abp/malihu-custom-scrollbar-plugin": "~5.2.1", + "@abp/popper.js": "~5.2.1", + "@abp/prismjs": "~5.2.1" } }, "@abp/font-awesome": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-1.1.1.tgz", - "integrity": "sha512-6RHbixi7IVWAb3JCHrUmEYD3HmAH4R75Nuo54LvFzATrh4G6gdBONIeDuTo79OTxe4Zhp+WLxeA49Y21kt77mg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-5.2.1.tgz", + "integrity": "sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ==", "requires": { - "@abp/core": "^1.1.1", - "@fortawesome/fontawesome-free": "^5.11.2" + "@abp/core": "~5.2.1", + "@fortawesome/fontawesome-free": "^5.15.4" } }, "@abp/jquery": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/jquery/-/jquery-1.1.1.tgz", - "integrity": "sha512-kj4BTtXF0VbCzCqRXnRVEbGndR3F8NlbBhVQN6BQktOuZta3fvx7f2+pSok8vQv0ddmqUFY7FTT2Ei3l4363LQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/jquery/-/jquery-5.2.1.tgz", + "integrity": "sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg==", "requires": { - "@abp/core": "^1.1.1", - "jquery": "^3.4.1" + "@abp/core": "~5.2.1", + "jquery": "~3.6.0" } }, "@abp/jquery-form": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/jquery-form/-/jquery-form-1.1.1.tgz", - "integrity": "sha512-AIIdN36f8xwr4LgiNnBHohJ5tlxh/r+DuDtXcScpZN6GWBE+XgUotN0pZIIva82IxCyUNdDudzgluX9IjI+00w==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/jquery-form/-/jquery-form-5.2.1.tgz", + "integrity": "sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ==", "requires": { - "@abp/jquery": "^1.1.1", - "jquery-form": "^4.2.2" + "@abp/jquery": "~5.2.1", + "jquery-form": "^4.3.0" } }, "@abp/jquery-validation": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-1.1.1.tgz", - "integrity": "sha512-YvAjIW8epp+ddu01BTUkZWPfEADAvNPJeUrrZ6OpcPWM15Tf+ddr4ATgJ1LCg0Bh5F09iQC855osow3lt8sc7g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz", + "integrity": "sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw==", "requires": { - "@abp/jquery": "^1.1.1", - "jquery-validation": "^1.19.1" + "@abp/jquery": "~5.2.1", + "jquery-validation": "^1.19.3" } }, "@abp/jquery-validation-unobtrusive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-1.1.1.tgz", - "integrity": "sha512-q1b0KG8l3DXUiW8JXdq9l1jR/CwgzrZdxwdKGLB2J/oxHlywQIb7yrjR6WGCshjPpcx2SkOL0j/ZXMIMh533hQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz", + "integrity": "sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg==", "requires": { - "@abp/jquery-validation": "^1.1.1", - "jquery-validation-unobtrusive": "^3.2.11" + "@abp/jquery-validation": "~5.2.1", + "jquery-validation-unobtrusive": "^3.2.12" } }, "@abp/lodash": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/lodash/-/lodash-1.1.1.tgz", - "integrity": "sha512-nH7bRS28Tf4hEXcpKHd1IM+MzYTqX8t3htGmsLX4UESQd52eODYOIldtX6gm3OW1O6ECwW6si/o0M2pTEpQqvg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/lodash/-/lodash-5.2.1.tgz", + "integrity": "sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA==", "requires": { - "@abp/core": "^1.1.1", - "lodash": "^4.17.15" + "@abp/core": "~5.2.1", + "lodash": "^4.17.21" } }, "@abp/luxon": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/luxon/-/luxon-1.1.1.tgz", - "integrity": "sha512-WNu8JRSb5FDXfcDwjMYyeYeUN48uuDc/I2cdo3xd1rcY+lbmbzxoG9IYOlE8cRHdgX3z82qsZXFs2lcAy0Le2g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/luxon/-/luxon-5.2.1.tgz", + "integrity": "sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A==", "requires": { - "luxon": "^1.21.3" + "@abp/core": "~5.2.1", + "luxon": "^2.3.0" } }, "@abp/malihu-custom-scrollbar-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-1.1.1.tgz", - "integrity": "sha512-n4b4QK/L1Czdx0oOpUR/bWjK9VENexfUSV/aMjwzHhDmEFABAmEfhIpudCYDwewGswrd7C9agmBvakv2rwPQeA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz", + "integrity": "sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ==", "requires": { - "@abp/core": "^1.1.1", + "@abp/core": "~5.2.1", "malihu-custom-scrollbar-plugin": "^3.1.5" } }, "@abp/popper.js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/popper.js/-/popper.js-1.1.1.tgz", - "integrity": "sha512-heR73cqmMsVPNgsPxBYbkvc842R3hEEuDAj4oaXZwVTeWXayU6TdDcGdIrfwMZwW2eWivYNnO0bMOVmuhZKTTQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/popper.js/-/popper.js-5.2.1.tgz", + "integrity": "sha512-poQhd5EYjU2/udJWlDEd5mIPWmw6AzNOzAd5V4OUHMai+BHeuhIXQ6mopvxf9lpzytGoFe2ZIiQ547Wfq4Fl/Q==", "requires": { - "@abp/core": "^1.1.1", - "popper.js": "^1.16.0" + "@abp/core": "~5.2.1", + "@popperjs/core": "^2.11.2" } }, "@abp/prismjs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/prismjs/-/prismjs-1.1.1.tgz", - "integrity": "sha512-kZh2imqVTMDWmE2v+S4wMsigu/hSyVaz3VvZzGctFNctzC17LeD6z6ymfrtQ5BPJbCxGSpHwOt4/Y8bycPTEuQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/prismjs/-/prismjs-5.2.1.tgz", + "integrity": "sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ==", "requires": { - "@abp/core": "^1.1.1", - "prismjs": "^1.17.1" + "@abp/clipboard": "~5.2.1", + "@abp/core": "~5.2.1", + "prismjs": "^1.26.0" } }, "@abp/select2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/select2/-/select2-1.1.1.tgz", - "integrity": "sha512-t0qcJhD+uo2+XWr4nmMQLAx7MRGQUBdZ81YmGty045ReoSaEKQf4haLkzBcMzpBRusiyMQO/PbxjtwMw/xJQTQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/select2/-/select2-5.2.1.tgz", + "integrity": "sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ==", "requires": { - "@abp/core": "^1.1.1", - "select2": "^4.0.12" + "@abp/core": "~5.2.1", + "select2": "^4.0.13" } }, - "@abp/sweetalert": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/sweetalert/-/sweetalert-1.1.1.tgz", - "integrity": "sha512-V6K/qg7J/bdFmom2kaXYeiLvcmLHFl+MacPX4yYAK2biZdb2pWOkUdmcAzZdOT+UruKfLRhvraVC2uXDySi9NA==", + "@abp/sweetalert2": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz", + "integrity": "sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg==", "requires": { - "@abp/core": "^1.1.1", - "sweetalert": "^2.1.2" + "@abp/core": "~5.2.1", + "sweetalert2": "^11.3.6" } }, "@abp/timeago": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/timeago/-/timeago-1.1.1.tgz", - "integrity": "sha512-QYYih/4n6XhCqkRw7fBfyg58T5CHqJHyz7SAfq86RiKAJ4jVtjdSVxj3XKxz8eCb56wZGsO1xXXStI3vdLwwNw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/timeago/-/timeago-5.2.1.tgz", + "integrity": "sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA==", "requires": { - "@abp/jquery": "^1.1.1", + "@abp/jquery": "~5.2.1", "timeago": "^1.6.7" } }, "@abp/toastr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@abp/toastr/-/toastr-1.1.1.tgz", - "integrity": "sha512-GDewBppm+0FO6kTTy0huczoH9P5q6lFicHFAoEawAMkuWJFW/Ihv/YnEvKGDQwGftuVSWexfqBMN/RZ5YSOiGQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/toastr/-/toastr-5.2.1.tgz", + "integrity": "sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA==", "requires": { - "@abp/jquery": "^1.1.1", + "@abp/jquery": "~5.2.1", "toastr": "^2.1.4" } }, + "@abp/utils": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@abp/utils/-/utils-5.2.1.tgz", + "integrity": "sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ==", + "requires": { + "just-compare": "^1.3.0" + } + }, "@fortawesome/fontawesome-free": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.0.tgz", - "integrity": "sha512-xKOeQEl5O47GPZYIMToj6uuA2syyFlq9EMSl2ui0uytjY9xbe8XS0pexNWmxrdcCyNGyDmLyYw5FtKsalBUeOg==" + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" + }, + "@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" }, "anchor-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/anchor-js/-/anchor-js-4.2.2.tgz", - "integrity": "sha512-Rg1tGaG4K3avYqDh7rOYCE/odWxpUiHStnlKL/bGOt9cl6NjR06zhPGVQcCAjE5PT48oQeHVgqNmLzxh0Kuk4A==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/anchor-js/-/anchor-js-4.3.1.tgz", + "integrity": "sha512-TziERoibspey7KSm95oIdzTxiogXonJl7inQI07Y3cI25DKQaLkUftB7RhCuSb1GcwunHL6/PcIKM4dDUb9xYQ==" }, "ansi-colors": { "version": "4.1.1", @@ -281,6 +299,36 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "append-buffer": { @@ -441,9 +489,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -510,9 +558,9 @@ } }, "bootstrap": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", - "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==" }, "bootstrap-datepicker": { "version": "1.9.0", @@ -564,9 +612,9 @@ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "cache-base": { "version": "1.0.1", @@ -584,6 +632,15 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -606,13 +663,6 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } } }, "class-utils": { @@ -637,9 +687,9 @@ } }, "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", - "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz", + "integrity": "sha512-cz3m2YVwFz95qSEbCDi2fzLN/epEN9zXBvfgAoGkvGOJZATMl9gtTDVOtBYkx2ODUJl2kvmud7n32sV2BpYR4g==", "requires": { "good-listener": "^1.2.2", "select": "^1.1.2", @@ -732,9 +782,9 @@ } }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "requires": { "safe-buffer": "~5.1.1" } @@ -745,18 +795,25 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + } } }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "d": { "version": "1.0.1", @@ -768,19 +825,19 @@ } }, "datatables.net": { - "version": "1.10.20", - "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.20.tgz", - "integrity": "sha512-4E4S7tTU607N3h0fZPkGmAtr9mwy462u+VJ6gxYZ8MxcRIjZqHy3Dv1GNry7i3zQCktTdWbULVKBbkAJkuHEnQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.11.5.tgz", + "integrity": "sha512-nlFst2xfwSWaQgaOg5sXVG3cxYC0tH8E8d65289w9ROgF2TmLULOOpcdMpyxxUim/qEwVSEem42RjkTWEpr3eA==", "requires": { "jquery": ">=1.7" } }, - "datatables.net-bs4": { - "version": "1.10.20", - "resolved": "https://registry.npmjs.org/datatables.net-bs4/-/datatables.net-bs4-1.10.20.tgz", - "integrity": "sha512-kQmMUMsHMOlAW96ztdoFqjSbLnlGZQ63iIM82kHbmldsfYdzuyhbb4hTx6YNBi481WCO3iPSvI6YodNec46ZAw==", + "datatables.net-bs5": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/datatables.net-bs5/-/datatables.net-bs5-1.11.5.tgz", + "integrity": "sha512-1zyh972GtuK1uAb9h8nP3jJ7f/3UgCDq69LAaZS2bVd4mEHECJ6vrZLacxrkOHOs/q/H3v5sEMeZ46vXz8ox4w==", "requires": { - "datatables.net": "1.10.20", + "datatables.net": ">=1.11.3", "jquery": ">=1.7" } }, @@ -823,11 +880,12 @@ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "define-property": { @@ -914,13 +972,13 @@ } }, "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.60", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", + "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" } }, "es6-iterator": { @@ -933,11 +991,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" - }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -999,17 +1052,17 @@ } }, "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", "requires": { - "type": "^2.0.0" + "type": "^2.5.0" }, "dependencies": { "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" } } }, @@ -1112,6 +1165,11 @@ "time-stamp": "^1.0.0" } }, + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=" + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1157,6 +1215,28 @@ "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" + }, + "dependencies": { + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, "fined": { @@ -1221,487 +1301,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } + "nan": "^2.12.1" } }, "function-bind": { @@ -1714,15 +1320,25 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1769,15 +1385,16 @@ } }, "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", "requires": { "anymatch": "^2.0.0", "async-done": "^1.2.0", "chokidar": "^2.0.0", "is-negated-glob": "^1.0.0", "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", "object.defaults": "^1.1.0" } }, @@ -1820,9 +1437,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "gulp": { "version": "4.0.2", @@ -1844,9 +1461,9 @@ } }, "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", "requires": { "ansi-colors": "^1.0.1", "archy": "^1.0.0", @@ -1856,7 +1473,7 @@ "copy-props": "^2.0.1", "fancy-log": "^1.3.2", "gulplog": "^1.0.0", - "interpret": "^1.1.0", + "interpret": "^1.4.0", "isobject": "^3.0.1", "liftoff": "^3.1.0", "matchdep": "^2.0.0", @@ -1864,7 +1481,7 @@ "pretty-hrtime": "^1.0.0", "replace-homedir": "^1.0.0", "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", + "v8flags": "^3.2.0", "yargs": "^7.1.0" } } @@ -1878,10 +1495,26 @@ "glogg": "^1.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-value": { "version": "1.0.0", @@ -1921,9 +1554,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "inflight": { "version": "1.0.6", @@ -1940,14 +1573,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "invert-kv": { "version": "1.0.0", @@ -1999,6 +1632,14 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -2053,9 +1694,9 @@ } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } @@ -2138,14 +1779,14 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "jquery-form": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/jquery-form/-/jquery-form-4.2.2.tgz", - "integrity": "sha512-HJTef7DRBSg8ge/RNUw8rUTTtB3l8ozO0OhD16AzDl+eIXp4skgCqRTd9fYPsOzL+pN6+1B9wvbTLGjgikz8Tg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jquery-form/-/jquery-form-4.3.0.tgz", + "integrity": "sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ==", "requires": { "jquery": ">=1.7.2" } @@ -2156,16 +1797,16 @@ "integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU=" }, "jquery-validation": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.19.1.tgz", - "integrity": "sha512-QNnrZBqSltWUEJx+shOY5WtfrIb0gWmDjFfQP8rZKqMMSfpRSwEkSqhfHPvDfkObD8Hnv5KHSYI8yg73sVFdqA==" + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.19.3.tgz", + "integrity": "sha512-iXxCS5W7STthSTMFX/NDZfWHBLbJ1behVK3eAgHXAV8/0vRa9M4tiqHvJMr39VGWHMGdlkhrtrkBuaL2UlE8yw==" }, "jquery-validation-unobtrusive": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.11.tgz", - "integrity": "sha512-3FQPllaWdD+Aq55zJLGSW39+eXPDz1HhwAvrSwYi8zHQ8DVcu5IJ1HVeTiCl0BnCnrIBvfFU3zEB/DrGdcoRIQ==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.12.tgz", + "integrity": "sha512-kPixGhVcuat7vZXngGFfSIksy4VlzZcHyRgnBIZdsfVneCU+D5sITC8T8dD/9c9K/Q+qkMlgp7ufJHz93nKSuQ==", "requires": { - "jquery": ">=1.8", + "jquery": "^3.5.1", "jquery-validation": ">=1.16" } }, @@ -2174,10 +1815,15 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, + "just-compare": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/just-compare/-/just-compare-1.5.1.tgz", + "integrity": "sha512-xDEEFHNIyJNmN4uo/2RVeUcay9THtN/5ka/iw98Y/gsa8w9KXZQuyaf5eFUY6VlntA2+G+bdPmdhqqTs7T+BRw==" + }, "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==" }, "kind-of": { "version": "6.0.3", @@ -2194,9 +1840,9 @@ } }, "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "requires": { "readable-stream": "^2.0.5" } @@ -2245,14 +1891,14 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "luxon": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.22.2.tgz", - "integrity": "sha512-vq6eSaOOw1fKob+JXwfu0e3/UFUT4G4HTFRJab7dch8J1OdOGW/vXqCiJsY7rm2In+5gKNYx0EtnYT0Tc5V4Qw==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.2.tgz", + "integrity": "sha512-MlAQQVMFhGk4WUA6gpfsy0QycnKP0+NlCBJRVRNPxxSIbjrCbQ65nrpJD3FVyJNZLuJ0uoqL57ye6BmDYgHaSw==" }, "make-iterator": { "version": "1.0.1", @@ -2312,6 +1958,26 @@ "requires": { "is-extglob": "^2.1.0" } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } } } }, @@ -2321,29 +1987,49 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -2378,9 +2064,9 @@ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "optional": true }, "nanomatch": { @@ -2402,9 +2088,9 @@ } }, "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "normalize-package-data": { "version": "2.5.0", @@ -2418,12 +2104,9 @@ } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "now-and-later": { "version": "2.0.1", @@ -2480,14 +2163,14 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.defaults": { @@ -2584,15 +2267,6 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -2612,9 +2286,9 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-root": { "version": "0.1.1", @@ -2639,6 +2313,11 @@ "pinkie-promise": "^2.0.0" } }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -2657,11 +2336,6 @@ "pinkie": "^2.0.0" } }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -2673,28 +2347,15 @@ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" }, "prismjs": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz", - "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==", - "requires": { - "clipboard": "^2.0.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "promise-polyfill": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", - "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=" - }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -2755,6 +2416,28 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "dependencies": { + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, "rechoir": { @@ -2799,9 +2482,9 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { "version": "1.6.1", @@ -2809,9 +2492,9 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" }, "replace-homedir": { "version": "1.0.0", @@ -2834,11 +2517,13 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-dir": { @@ -2868,14 +2553,6 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -3053,9 +2730,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" }, "sparkles": { "version": "1.0.1", @@ -3063,32 +2740,32 @@ "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, "split-string": { "version": "3.1.0", @@ -3166,6 +2843,11 @@ "is-utf8": "^0.2.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", @@ -3175,14 +2857,10 @@ "es6-symbol": "^3.1.1" } }, - "sweetalert": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/sweetalert/-/sweetalert-2.1.2.tgz", - "integrity": "sha512-iWx7X4anRBNDa/a+AdTmvAzQtkN1+s4j/JJRWlHpYE8Qimkohs8/XnFcWeYHH2lMA8LRCa5tj2d244If3S/hzA==", - "requires": { - "es6-object-assign": "^1.1.0", - "promise-polyfill": "^6.0.2" - } + "sweetalert2": { + "version": "11.4.8", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.4.8.tgz", + "integrity": "sha512-BDS/+E8RwaekGSxCPUbPnsRAyQ439gtXkTF/s98vY2l9DaVEOMjGj1FaQSorfGREKsbbxGSP7UXboibL5vgTMA==" }, "through2": { "version": "2.0.5", @@ -3299,15 +2977,16 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" }, "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", "requires": { "arr-flatten": "^1.0.1", "arr-map": "^2.0.0", "bach": "^1.0.0", "collection-map": "^1.0.0", "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", "last-run": "^1.1.0", "object.defaults": "^1.0.0", "object.reduce": "^1.0.0", @@ -3390,30 +3069,15 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "requires": { "homedir-polyfill": "^1.0.1" } @@ -3433,9 +3097,9 @@ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" }, "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "requires": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", @@ -3481,6 +3145,16 @@ "now-and-later": "^2.0.0", "remove-bom-buffer": "^3.0.0", "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "which": { @@ -3516,14 +3190,14 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", "requires": { "camelcase": "^3.0.0", "cliui": "^3.2.0", @@ -3537,15 +3211,16 @@ "string-width": "^1.0.2", "which-module": "^1.0.0", "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "yargs-parser": "^5.0.1" } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", "requires": { - "camelcase": "^3.0.0" + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" } } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index 802094ec7c..8e5f9ddd6d 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2009,9 +2009,9 @@ pretty-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" prismjs@^1.26.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + version "1.28.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" + integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.0" From ea0f3c2c18971ef6769016140ecb985a6d7da832 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 19 Apr 2022 09:15:20 +0300 Subject: [PATCH 168/242] Update BlogFeatureDataSeedContributor.cs --- .../Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs index e99ab47964..5306d302dd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureDataSeedContributor.cs @@ -2,6 +2,7 @@ using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.Blogs; @@ -20,7 +21,7 @@ public class BlogFeatureDataSeedContributor : IDataSeedContributor, ITransientDe public async Task SeedAsync(DataSeedContext context) { - if (!GlobalFeatureManager.Instance.IsEnabled()) + if (!GlobalFeatureManager.Instance.IsEnabled()) { return; } From 2fe31f2083569a19a7aacb7a06876cf440786e84 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 19 Apr 2022 10:10:36 +0300 Subject: [PATCH 169/242] AngularPwaSupportAdder. improvements --- .../Cli/ProjectModification/AngularPwaSupportAdder.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs index 4781252705..f774844884 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs @@ -21,12 +21,7 @@ public class AngularPwaSupportAdder : ITransientDependency public virtual void AddPwaSupport(string rootDirectory) { - var fileList = PackageJsonFileFinder.Find(rootDirectory).Where(x => x.Contains("angular")).ToList(); - - if (!fileList.Any()) - { - return; - } + var fileList = PackageJsonFileFinder.Find(rootDirectory).Where(x => x.Contains("angular" + Path.DirectorySeparatorChar)).ToList(); fileList.ForEach(AddPwaSupportToProject); } @@ -35,6 +30,6 @@ public class AngularPwaSupportAdder : ITransientDependency { var directory = Path.GetDirectoryName(filePath).EnsureEndsWith(Path.DirectorySeparatorChar); - CmdHelper.RunCmd($"cd {directory} && ng add @angular/pwa --skip-confirmation"); + CmdHelper.RunCmd("ng add @angular/pwa --skip-confirmation", workingDirectory: directory); } } From 061d152bcf855e32f0940e22c993689b6ca9f27f Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 19 Apr 2022 11:05:01 +0300 Subject: [PATCH 170/242] Update en.json --- .../AbpIoLocalization/Www/Localization/Resources/en.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 0b9d6d96b2..35b755e8c3 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -214,7 +214,11 @@ "SeeDocs": "See Docs", "None": "None", "Application": "Application", + "ApplicationExplanation": "Creates a fully layered solution based on Domain Driven Design practices. Recommended for long-term projects that need a maintainable and extensible codebase.", + "ApplicationNoLayer": "Application (single layer)", + "ApplicationNoLayerExplanation": "Creates a single-layer web application. Recommended for building an application with a simpler and easy to understand architecture.", "Module": "Module", + "ModuleExplanation": "Creates a reusable, fully layered application module solution. You can use this option to create modules for your modular application.", "PackageName": "Package Name", "LicenseURL": "License URL", "License": "License", From 9f4dacc984657c4ff77cc49a55f2dbfdb7bf9412 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 19 Apr 2022 11:13:36 +0300 Subject: [PATCH 171/242] Update tr.json --- .../AbpIoLocalization/Www/Localization/Resources/tr.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json index f9c6d54204..ad8393fab3 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json @@ -214,7 +214,11 @@ "SeeDocs": "Dökümanı Görüntüle", "None": "Hiç", "Application": "Uygulama", + "ApplicationExplanation": "Domain Driven Design pratikleri üzerine oluşturulmuş çok katmanlı bir çözüm oluşturur. Bakıma ve geliştirmeye açık kod tabanına ihtiyaç duyan uzun süreli projeler için önerilir.", + "ApplicationNoLayer": "Uygulama (tek katmanlı)", + "ApplicationNoLayerExplanation": "Tek katmanlı Web uygulaması oluşturur. Daha basit ve anlaması kolay mimari ile uygulama geliştirmek için önerilir.", "Module": "Modül", + "ModuleExplanation": "Tamamen katmanlanmış, tekrar kullanılabilir bir uygulama modülü oluşturur. Uygulamanıza modül yaratmak için bu seçeneği kullanabilirsiniz.", "PackageName": "Paket adı", "LicenseURL": "Lisans Linki", "License": "Lisans", From d30082bc9616c2f61aa7319aa9646a86401b79ad Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 19 Apr 2022 12:52:40 +0300 Subject: [PATCH 172/242] Determine angular project with `angular.json` --- .../Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs index f774844884..9ff8169e71 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs @@ -21,7 +21,7 @@ public class AngularPwaSupportAdder : ITransientDependency public virtual void AddPwaSupport(string rootDirectory) { - var fileList = PackageJsonFileFinder.Find(rootDirectory).Where(x => x.Contains("angular" + Path.DirectorySeparatorChar)).ToList(); + var fileList = PackageJsonFileFinder.Find(rootDirectory).Where(x => x.Contains("angular.json")).ToList(); fileList.ForEach(AddPwaSupportToProject); } From e6e5cb05a8aeb6222933f0977ef25e4cf8070399 Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 19 Apr 2022 14:51:12 +0300 Subject: [PATCH 173/242] Fix angular path finding --- .../Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs index 9ff8169e71..891ac28ecb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs @@ -21,7 +21,7 @@ public class AngularPwaSupportAdder : ITransientDependency public virtual void AddPwaSupport(string rootDirectory) { - var fileList = PackageJsonFileFinder.Find(rootDirectory).Where(x => x.Contains("angular.json")).ToList(); + var fileList = PackageJsonFileFinder.Find(rootDirectory).Where(x => File.Exists(x.RemovePostFix("package.json") + "angular.json")).ToList(); fileList.ForEach(AddPwaSupportToProject); } From d871f35b3440d214a856afc0ccca11fac467a5c1 Mon Sep 17 00:00:00 2001 From: albert <9526587+ebicoglu@users.noreply.github.com> Date: Wed, 20 Apr 2022 04:21:17 +0300 Subject: [PATCH 174/242] Add comparision table --- .../_results/with-without-abp-comparison.png | Bin 0 -> 62756 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/AbpPerfTest/_results/with-without-abp-comparison.png diff --git a/test/AbpPerfTest/_results/with-without-abp-comparison.png b/test/AbpPerfTest/_results/with-without-abp-comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..997e1bda13919de5a4a4c13b52c25a3218335b4e GIT binary patch literal 62756 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

    E3EJ+Cx)iXLumd$sN7rR> z5pQnt!GF3a0QR!Um=eX3^U@X(z#60^4=IM0yLE>uc0<30~ z=Zec!bh}H3hahwBfLzfVatdFU*ao>adk)091up-I%r$>pC)yfSG1+qN_)0z!X>);d zHel)}aGc5mbby}U&KE%~$jFQ1A7N3;b>vJIv`nk@C=b7RDtC%dg-b)XkPQku+49-q zqa2*fGWRtFiz(SMM@7{1f^qfRid%N>EjGt%JYs+FR zIfvqbk&flh`Ac>bZ*|g@G8%^{i;>LReFBPr>*#99P%8j^15Z)#wP+es}>k;4VD zG2x`7R`>D*&f&3eKo+Ndx?`i17G3^(dHL0EjF;;f{M`27o3Er^ zHu>GH>LOQ1!D}Ql1)RWOY*SWSht!G}fKZF=?3n6*6eix456bB*l1tZAMlSYb5UraP#}_ zjVP%*i(YOyt(B^ux;>iq>K%`DiY;je<(hR_VRr*_-l5D}_V%ZUxWE=Kw~qW`a2vqH zp1KT9hIF^s9YK~@oVQZRwwB_gH#5M*u1j=dGvVGfF$StAM-4_T4?U`Yw!6F!J4kQ~ zTGSi~E;S)DHT&p&@ws0r^=XvLb%~`5KHdQ9)cI(svQRz;3a{f=A=WeS2|>A=V;|>a zgqVDidtNi|^uf;7_`m;pva5k5Nwg`*DS`=INy-C6vgYwy!Z{`#B02o!LlgQ6L-?Q z_AUzs-aU&b_0(C)wZ*7LP2N#Xw=3z3W$NaLl^Ql1uQh;pxU+OCz`dQeVv|}gg_{ce zVd!w%ij$Ngy6kbfO=5Y&XEAvJ^H$!)$!~R6@sYLFMiOyU0B#AqlCt22vS&*7sM939 zIUIXBS4+A^vqZ!sP_Qjs#J!s2aVWP|{C80~uU2F2HiO9xVmRm8OUw7$XlZ)^MFycf zqI0sEl0 zFojIwP`glonH>doRzDnQa{$dxD?1R}@(vl={Up3fQ^-akZgrcl9Kk6xcKyYLE^lyi zCXjWbvm-6jwcoG7h1?6c9#%J35okj*}$qjoDRwNiKd2V>UCiT$nC~&I~tc}=Q&ibBrnXSnC@7Yv|v&E4&Q00fg$4fJZrtB;B7MO9BJK%YiCj4`y)5QW$cO2FZb7+d9=M| zNPPh}WK{CA>sYi(zvd~F340kE zcMV9@GW^OKUqVPBPp4O?*hkm{;=9=nT%r$&`%T)?b1w#DEK035n1ZOJW-eC97tSxF z?C6~02i^vDZ0q7%7@H=sn-cu4K&}@HV}zMO{0EJKE_sF^OF8^QoXEG&8_RVsG7X`5 z0)6ZZQ8;ZAiAFF3e@BW|3s;3K-W8_gyS*~|Vvo8P8ZOADo|g5_&e_2jPt&PP)~>q` z=K;+phJtt}_!K=9k;OPuUJUi45-bBOCLlHS@%Z5P9t9DWbfxzn(WXWis-g=OUWLSq zapm(_?y9xP^IwGfxmd%Z41`r+?po{~rGt!RF1cb1T=}oTiM)_88n<>MH;}o@mS$IH zqNe%Et{2VU6D11dYn_-rhUuB>&{j$}oitHzZ7fwUTQ^w9H?%x+02jAA44h`;Tl^K? z)SrRXShurgczhjxp;$Ds4-ZWdhVl@Y@0II{G7;*`Wd|3w-jed`yt~jE`xIfl5V0CS8Cy$QD*?RMxx&d}|HS&xc{;3~>o{2KnP;WhC zTAZKMuPXGQ-L$mC`VV;y)?qzS^FbkuYilNbR(4>{w-wf3O9*Y#*sb2C*B8VDzyNnp z0(*<+#Defurn1jxe>Ly3Amy2s0-kx%kIQ-U``8UkmA(}aQD0p&uZl6FHg%JXl?DRewt4!_kbf`)HvWq^{2#d?n>Rkz zRKz|v(3 z78{DGSzx%C_3h>6T|K}3HRS?kg5lcd)bpxR7#WswC2sG=$iz6FmHuOdxZur~iFGiG z0`8{F9S2R+*TPl(0+U@emQ6^sOhAyI^(JrrYXOX$L0EQpbJPP+w#+*qPT~F|s5OZ$ zDLYz?bc{!~^nEqBxJT)s+{xzD&oR8UZ@(E(n^ma zm!2Pn*R^*kv$MzI(0-5il7d}XRNR^+AL|*urG&Kd4e4NAb{Q5J4f#xB{P&2Wp5$`7 zm^3Zpfg!L|W&&q7HXba&>8NV7aKcJ=?-wyWh3osKY;5@#!Z~}SM=;BEALa3uZ-k+2 z3}=*NiliGaFz|N*x&^;3?Ydn#E)@qs5Va}`~7VDbV z7>0+)ZPT@?Qqw;DZ(79)P#H=G4M$)ffa+_xAuvOx$P)o5NVyKCDxkHL zq}`QhBr+M)wc##ZYVQPBFv~Rya=cAb#qSv?-2WI?-Ba!e!EeIU(UE^D{mTI_159&+ zT`o@7Vi|Mgt6{6$hvgx|Y4y}3o?4~g)nK7|2@S9-(Kq$Nk{6VB&}nD*Q)uAhYIGB< zqS_Q(H2(=UxG-e-Moa+bSuT%VM;KRFi}$YSfZ;YW{cXaiQ%_2&LkF|V?00u^+a}$E z0{13$3hmWR)-gj(5rP5bKG04b_!*f**4xbRiq9lSH(h5@MdVvQjUZ|0IP0M9uEWoc{suPY>d%`z$~F!67;
    cY%&+B><=(Jnh7MAgltRXWJUPk zg#_5)4EF}1FxL=NrKBN_L0e%md-W`WLr^(Zgje5LpV{>lQ7(%5#+N&vqxP&psi2{k zEPM9ME+{qNA59^=$F+_P^S1CkF_cgCVEDlp=6<_NwEgh151wymY}h6EJ_t0F|I|R; zFsrUcX|AFWT~lt|uyc$bQgK=&G+7=Z@mS{G@5eeeR6b1$^YMpN5^2#FqF{4xo%;GV zMxZ-ONLCEiN{Z}b(o9~fum>DPDi^0u?8pPV@I{|u*@L~FAx-Nr1GpkNc|uz@?Y&1` zz7%C_H~G`3v5)CmSduE7=foMdyC?y`I>NHFUpEsS>brl)GRO4{TIR3jLl(vPv}iCd zXNdjRH4sXUZYcNPwQ^tHRHzu38I$;8FI@GB1qvR_J|2yjy}|-1L-{SwDV`+%xz*F~ zAp&e$Sh!0^6oc~S+4f&>(=hM4>Qdgd1UX%#5m;YuP0my$MgojrMszoL>wC* zv1=~)+$b23AXuev^h}w;F09M*Xbn-w&xD9aD6(T_P`zL)xvD)RA4fiK=M}^f4qsatT~sjNpUvEWe{3FYeb7J zs<4bpl%n8FHPTOrUw!m@w?BB?J2YaYXN>uD{{$CTRlBqN?$@2&>Z-iOB+3$+ViCF* zYEPJL#9t@YR;gd@`9QG>`qW*jvc0$h_!v+_m&VE40*bRDQ096SU0SZ0g(|7%y${XKW9lfypYM7>3zd-A1=hPBg-L68To<82rdUNfKaRAP% zd#O{rExT8$sP&wF?p4=b`9cbkLxdK^K0XQfpklXyDw$)63?5-0$#A{{=2lp*_?B0c z?6r)55}%+ggD_LGBGa8nu(^4vFyO8gr*17&)51o#(;RcZYq;S&%WRzIjK^u2SR?6* zz(O={O4s5nhL?~|c%hm7tE;u_pQ9m`>W!Ld31A?E{=<2_Jk>2K*ULb(o+Mb0t%gS$ zq*)MJ8h@}ftJ@MPcLn-ZIv~yWYfNYG|hVS*n!Z&=zMJu{9sm1;+m2xA#`8g|$qZ?hqauwU%ne-SLNbyci z1y(qo#P)WT7T$aKO`gw<(|kT%E=TU9wpG+G@)w+jfZL93{@HTEO&OALT&7nqp_!`B zE|j(H%1J_KIc>~^-$ki=hCqKl%$bhS?${icV+x3S19^T-=1yXZKhH!~dgKiI*skom zXG})#^LghKPGVnDrp)P68CE@ira``9|5*m#5Om8^kJ0KLq%QcCav*Htef2j>QoZt2 zk9o)iho1(U)x|xupATf5Fl+I46Q@7B_-_Z6{vFl*_XBeOk7 Date: Wed, 20 Apr 2022 13:25:47 +0300 Subject: [PATCH 175/242] add scroll-index feature to blogging document --- docs/en/Modules/Cms-Kit/Blogging.md | 7 ++++++- .../images/cmskit-module-features-dialog-2.png | Bin 0 -> 10405 bytes .../cmskit-module-features-scroll-index.png | Bin 0 -> 108721 bytes 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/en/images/cmskit-module-features-dialog-2.png create mode 100644 docs/en/images/cmskit-module-features-scroll-index.png diff --git a/docs/en/Modules/Cms-Kit/Blogging.md b/docs/en/Modules/Cms-Kit/Blogging.md index 43ab85e129..12039b1669 100644 --- a/docs/en/Modules/Cms-Kit/Blogging.md +++ b/docs/en/Modules/Cms-Kit/Blogging.md @@ -33,7 +33,12 @@ Blog feature uses some of the other CMS Kit features. You can enable or disable You can select/deselect the desired features for blog posts. -![features-dialog](../../images/cmskit-module-features-dialog.png) +![features-dialog](../../images/cmskit-module-features-dialog-2.png) + +##### Quick Navigation Bar In Blog Post +If you enable "Quick navigation bar in blog posts", it will enabled scroll index as seen below. + +![scroll-index](../../images/cmskit-module-features-scroll-index.png) ### Blog Post Management diff --git a/docs/en/images/cmskit-module-features-dialog-2.png b/docs/en/images/cmskit-module-features-dialog-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b6dd409e0a59c728f50fb4d257f5ed06a129498b GIT binary patch literal 10405 zcmd6N2UJt*wr+H9;0TsYS1FMmB!HmO2^)!0r3AMWX@XG^0YM-jO+lq85eU6*swfgc ziWGwgQW7LvKoCNR5JE&Gm;?zCLf*n%?t5pP`^G)zp8LjQj10zF|NQHk-<;o^|4ebT zx7;IqP#6RP?Xk9kBS4^?5D;j`(BA}sH~b^c_ke#pt|Kf@fa-^37lDT#FPWb<2Z0*U zBAe$0fahJ;tlX}HKzn<(e>?hvA6@`~AV$`3^D~iN%Vd5Q5*e#@ZEJ`4+pkGanh&2m zSywd%&tPeoD|##1{Iqj#cOHcG&PNt!keaGnc)?Tj?H%~ra7j4%>Y>j;Pec@)e&|)) z+4tZ`%8v8L6jM{vlZ}#J78MhVH+DOiv5TUEIm;wo7-iz|Cr>gb#_ZDFjZQ;)1ko$n zjH_OpoSbZB>*NTB!zTDv#Q>H=*rQLD+qR)rV%yZu{%3Pok#gD(2G^6sd2V?djU zcKjfAFTJLVnuH>1j1#h2oEQPbK=7p8YTX?|@{sM>y0Xo=83#t(Y)UlBVg2=hI8vV7 zM32yp8?&A1zID=XDGd)L$4YOKU-P0 z`AWQW?8Rpq_9KkbMnvs1+q@VLj_wo`zX(&PLiXuSM)p^7pP zNJ$+6`uVzq1gOkVSQzx1tbhRMa(co}&@oH%9iW13i8oG;pqmSje@@J2U#`~;f6nZ_ z_~+3de@(jU+?R&*D;{V9CIXr~Bive}*b6DPHiy+3?CXp*1(3H3gWH-(mngg&;_Mwh zrm3$)QBJDr>QRO%;i~G#s1S%!-9_`L)wh-%GW<0Wa&53d#l{FFKFUB6baq%-1t~>S z24pG|LWe^7QKXhY8GFwIq*k-BK$Gavp|qbs_jDgs4m~RRQ2_ZPu*FX*$eiyTpw(r) z;358cY5a^_$o$*H@RHb<><+VUM1EBVe`{r5?t5AdsTJkId(Ho(SM;TTVFqJQCIVY| z%;)eAn2hgo@e2Ryb0Z%Db@CVqshVgL(dxW>M7t%Ua``pOn+Je6z&qZibtR5C#rt@< zKV6Re#QWO@<7-V3%%D1t6RlP<%^O`lC&;gxU-Z-#T%7Um_jmv`SK zEOs;dwoZ<;5L7jmbY8vzgOP_bQL+T`JsSq$LK<)7Lwtc~c)`9r!%6{ZMhz4j&%D z77ry@J35}SI$4%;#@+X3*J=+x@Q9``{99sbhr&uMMM!XzziI)ViB+2muJ1bEU7WIh zgDY8j5GwupgPIw4(C6DjOA}j7NCxDPSNO-;mfyBxgC8qVMrYW?BI+vLCeMaxY|Y*t$KdybP+S;pQ0kB@w)v zksurSMIqYclhqRab;Uv{pQb_Hp&iLgFh2ea0ztMVhhl8b;9`=g$kSzD~rZEe3~nO5weh`!$U}pV$GmeDSf&8yq7~>lOmb2JN}|^$}E!X{1ZY zEHAtFG%rC6B|Rrf6w=ztGG#RoU^>qe#qNCA$6qHW2KE&vubWs&q@sehdb+7u@1PK7 zbHwM2C*B)VKHTS2G1{jm!Dhjz+En6nuTby~*U~FA<$R>ITXsSyqm3T%Y-q`g(>}X+ z`ch^Bi?_n}`EqM~6>h~-tDFrS@y9OoC@&rjbp4YJ^N77 zoh!WP&uZEbrozA+{oO@&V-MhGAs^mFa6#X+ctov4Zzj5=rVa z9hj@N8*QHyjpM#y$Z$-y6sEphijSlDbTA(tj%)wh&98o$z#7Z{TH~TkX)gg(#Xf6X*!CWrfeNcZ+#Ya{aCl>K-cBF7}W^}U8hmScLg zFKt@m_mC!`S@dpq?zL#SmC&4r^7Ygr1P zH^e{p#n^2ww;^`E0!)fE2@z6}2Um?qZrrC(8)>C{WVfd@Xgmo5$;!!6&c@KzC+_({ zvG#d@p1ZuqENhg&*%?-d6Z`^(_8sSd(*FDvx_@G0Z#X5%{p;8+YTh--|k}m z-eFxLOJT5Nb|64{+$utZ{yl!|??G4UH-T=LHm-t;5 z#)srEB*tR9lGfx~)5W^}cC}9bFyDMvz40BOYO1IM8gej8B1^X+J#!~$)XDKiFZqG{ zj(p_?Ezr|2VH%Lj}04#td8Q6oV}n>QdoI$n5YCTI14oBkLErNIZFmJ&X>Ph_VUYn3bobIj3_i?G zjByX-`*-~6p&F>B4R4@q<^`Y}@k?R^kGR)0f|MVQm;s|BXRYoi+u$z+fj#XNslA|> zxxt!c`MQlUL8hZU8q56v#-I4f*WK$NzC43bG*(^Z>ukIhnr~3jIELx>!0l~jgM79i z5L5gs=2$CioE*1uZNbsoFy)@}jQYo;j|Si=10vneb;VRQA;413!bUuEbSu(ppvttR z2W#2EA~(4eWvdUf(>p8g9ahT-xsrJO^kadl>7d#O6Ph8qUC_UzeCLr;V4=+;8JVyo z-NRYQzDI(}R%Ch!i_IsFJWkLZB$rMB=6f0y)HY=Zdb*_!F+Dpc-CT96OLo9wE85Zb zL4B;%aqx4O#o*%bCX;QC=oCsz|7ut%msr7*2sR5`M>TJiLY zwPx&+eSD9M;7Ju>!YkS~`@BbkLJIW)Kh1E5QF~Jd+vp{vV$@7jBGkhk*g&7_aDtdM zIKeBwUX z`@qS@st#tKOve(oEAGOdxP3M)fXu8*Nf0|ptu74u#OPSTF)}RW57^6T=G+g*NPzOv z6GoI6ccsPGgiCuwzD>=+Kom4FilBjQrFmQi zcQRnkj|!r6&L$-6{5cKKy2rmbmgmU=Y*9d&fq+u}5LP6mA58oyMz<%5aqe*#I`^9R%Y4fGD&anhz1+(k;pje#c+Z z)FwoVtLNuc0QM#rLy+dyq@gs2I%xr=KsC8&nC7za6PKV?lL(L%unvu199bQ^Xr3wi zUk0F~%df7IqpVIUWG6I!z^JN2VmAmi6Zl^SINl^_&=`Qmv)}gG9Q?r66%|mhvGwvr zuoNFK&djr&%~NP2oa0ns8>9L#7iH;DJXM?Xi*f(vI;iZF`COV&rU|5sOLq<>QhjYj%Z_a=cdUs8_6rs<^Mi^vgX}&0mvS4)aw`Ly?o&g`J)er_)hJbtkhA@}L zGg2XZC+iKL=PmVa71``0qi)0u5G1t6zm`0f23 z5n&r>u9;x!gu-~*S9X+tG&5PPOI#dvQIXqn1$BkRWhQ?t2*8r4k-mV-wE8Rp%E z>$tGZVOb|oCgi7FZ)WZ6V^0CqR0}U*{PJyg^AugDoWdAy9c^zlT;I~>Gbjz`YX+>B za2n8Hgn&wyxXxgbyK{rpNhM5`!k94rArf&wop4IlAx=o8B`fzJC=bAVzYWFQ`gH|V zR3SU5a|l{hhIy^%ttxC4v!^8o?rcL2}GX!~ORPnx| zOBi${URO-&oa2chqIds9WU(}6{bf)AwhVMc1F$IB>%VZC6U535D*KIUm3x;4kfrPM z@>Pc<@8p%Xv|UjI~Ev)3Wm$m!Tzkd;Ye3Nibh4OE;^-x@#od_`;D zU*c{@1&}i_Uq;Z-=gygCS9adat}J_cZd!BD%)7h@^wj--obvt)Z1mLg<&t{ixlB27 z*6@wG=vRfO)N)dgesUlmBj9lVD}=JY?Zd0I_SiKtw%~_-u*!}l#*-eE9p8!2mDd&8 z#P^-_rq|C|j~;j2zZCqbB{=>v;II}76Gkeava#G%%?^2b(bnP}^ld4?vfR7_C_vQY zN87_{v$xS&!R9IcT))ytPdr#$?)o&7e0;)7f4x1B)Y85A-s`HqCiSf-DBuo&I&GPZ zedMPV(LT`=FV+)0vFuR9jA;t=l$&F@&mTSpBI%^{oxox|Y0BPenpx5qSJh1TEg&3m z6#=IGKj>eY4nx$TT|ARf4j(iCP#KN64>?j>hFJpWczM|>M5N!D^34^s@uDZ+B9^Ay zxF66#6(#(s8z$n`NTpP(C%?@LsJux3%JK(2l>*>>rAkR#y#jB2K?k28hOKa|v^1iT zA6SdnWVX~i1U)_byNF8cUgQ}mC2a`uz^>*5#Ky~jp%o1U9nFQRksm;s&W<;RzDYOJ zSP5eIeXV_)o1zYfpEr5lo zLjoL4a4CwJ6!nyTvp8ocXz5Nu(JQRmk1S4%`43POhZ@7Oc7oC>%64a?9Lg`-A?)zI zMo8-rX`rtq(6{vEpzX=&J++b#ti_fVNU4EX3}E>mk|NitgErQft$~d8=m6AegN&f} zInn;m58X*&`jpV6YxvJ~^Eh8{zbq=I70~Tj%%odAJGIL;!|5!m^Cq_(n9t0n6Vsul z-VlU)@_r4%RP7?-HZ%tSM`T*mVIYj3m%zN0knlOK4zY;(HF+%6(z~P~is(;UyHXB^ z=O=e7Ywz;^R(aB|*0=PDB*x8c`Bs?b-g&mWBS!0TVuJ1&sno`6tF+P9&xgS^@i%6T zfR1xo))blZht;Wq$^Hcah!XjJ@ccbDSnUwaXz2o z-{xx8HHwfq<6FGRbaKZ*A&Yt6W{O62dSQNG+FIs&uW89gZ?JOSII_FHO@DSvZc9dR zjfbjPlB?EfBK>qD7T0l(T5qn-bDMb)zLc<>8^6UgdZR(FiS=GfaoCIN+hna+K!_SI z?E4)_5vSYxxRg@Xjmp640J%QT9!IULHOa-SVd|RZxrowu_trCB{h|3`nxmUx_ZmEK zUU5OR&Z%ah9Q5}+cV30V!g|sfx0XFQbF)d8em5Ezl17z2iFMytnmu>_=*-_nWv+0m z_XqdtnC?kusupw|=--UFnN0J&nTF-+R4(TR&$l(%Z7mcD7Q{U5*i3a;j&s&-Jty-U z%b%-rXKHQqLl$@muv@Ls#XqrGO9)bM8+QHR#9@j{U2f@0$6lWqnGg_KNIKFKmS%c|`KqVqty24wM# zKCrXGtK4c=T*yLjC->X&#r-4vj0IAyb^n8|h9uU08}8Q?U&zn+3U~`V=0f|7^XB*TkkfjkOp{ zpKc987^5G6Eut9Ku-NIgT)IS`oXpcr3CypJj+i^t+Thr_4&Kb{t8G(?2*QqWP8B?U zQJWJyOe>7tI(2ZV7~o1GGncRXZ)8l}bovzShuvckvYQ#-tIpj7k_LXV=Vblb_i_!B zT;3Eek`_ZTe#}g8R1Sc^G@1Yh>5>Wa{`{ z?&{|Hs9wKkk85iS1;C6C5mw9)iJRPLIj1&1N)3p5GQu1iKYfKR$_k*g+EG@I zFp6xlwhXruRd>%)fgFW?JL}Dn7w2<==a_f%v}J-Tneo@Tq1>N;0xSuC&9`kT>4HUF zD@K1I<|c$P?MG_hvpjs;@}veiF7nRqW|T`YV0!WJGY>V-E|vj)$D<-CZ$j+rkerF& zY2ZY8ZdLxw<6~Q&edDHFC^*|@_F-adX5j0F`Hg)vN`}GOR4EE)AGIfd(97YL`k!_W zp5DUy+0hGH(!A?clH$Dlw zKN_BfnNTWrfdx(<-%ZmEk@feE9f|5a4xP{h5UZ6nY+CBQ73;86;|Fdw_0a=>Hon#H zGUjQjJ~igrEVDc7tKW2~|6$11xtrXwvfaGPbpHB6m7>^o@MniO10*L}plTWK^$2R& zty7-zHj&9B5W=C=S>b_UvCEP=8I`78pIi`kX|IlvS*prH>_tMoSHhUBQ{S-mfW35)%Q208_gT75o$hQAN%bsi~{$yg#g( zX6u2aLDYqXU&^L+>}uW-BQHjW*-wi;-1AD;D1=;HRR$Vri0X{a1YW0isM*?jwE6>A z#MkTet`VL4YWLuD-F}yuDl>IBP^0$+e<437Vds(lD~W3+$fBv28d*s9?a?3anPOu? zuKa+t%lTt~%ijm+{5KBp!h=g7dQo_vFPX{2Jb4qWKphjDp$!wXC*Q`>aP=K@Ax{no z>}l5J9{=Z>(yTFPOK@!1^JdSu^_S>&TUcm*g06Xa(KNGob~xhO!oCj1fZ3B=49BCj zB06%mic#P7jC|s#rhtG?`a8j8>+2L0P9Ji}WpmQ|bBWYz`*I-fgE$X8cK_p3)f-{R7Uwz2A^jh)7suDtGFYOHxR^TdU@khU!OknjH@~ve@7a4hTk{=xe$D359_2s7 ztp~u%V+bkC87m^ zb+rsG3V&Iro8`co>emw0o_*67IH(*4Pktdis`sRT;ee8k{*0 z_#)mVG)+@23gI*;VhJ-H1he69fnY1XdH%c8sRw7 zv}&MM8UAg&RCW7=tq~gPZT@&`o46$9*ezwr2cdDD!z-C^g+Y2YHdkpB;RsrA4g5_$ zH!QazW*Siqg*a*TnF4nRx$IM#tz+8XYv0RLh)FAy9jj3cJ1Upm*i>n(k}10ZdCP(MD9_(~Lr zaqWP+4wY<-M;rR}g+Jl+KMwJK&d6M)w$WXL7*SS58wL(Wk74WhkG%(nxYmczc+<%ptezP1fma%h2nwEyUfEfH=ESq_zC4%>_DIPav4JduD%gNl|^T++_ zkO=<3rJ}dwD0*?vC{VEjn2+avM{*|m*4-{H2p~tRPm^Cudz+Y?2Ki`mUkbsF{72c3 zA$#a(2d9hABfH>OlIUnqS%}Wr{yaH9)Vl_|pimh02K$u&&=r0bC=B~vdWMb!p8hIJ zTbtS#bXeSL7*0>?Rx0UfA7u&5bp9GWJj`tvI+Rq5^P!FIB`hot`4~^eY*(pORj%*0 zIqN7$Q|8;@&$YWO^CPV%n`UnYt?=~23P)JR6E53jZx;+l&Nhuo0+n4=h4OwTKGc!u%z9#1O7=!!r|?6XuP+m4e6+J_-K|IaG}y literal 0 HcmV?d00001 diff --git a/docs/en/images/cmskit-module-features-scroll-index.png b/docs/en/images/cmskit-module-features-scroll-index.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc3dedcc5a6474e5187ca176368bd41a5663b27 GIT binary patch literal 108721 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 aUs%qZQg}p9bXZ_Q=!%)`Z Date: Wed, 20 Apr 2022 14:11:03 +0300 Subject: [PATCH 176/242] jasmine-core bump to 4.0 --- templates/app-nolayers/angular/package.json | 2 +- templates/app/angular/package.json | 2 +- templates/module/angular/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index 5e66eb239a..6fdafdd93a 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -49,7 +49,7 @@ "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", "eslint": "^8.2.0", - "jasmine-core": "~3.7.0", + "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.1.0", diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 5e66eb239a..6fdafdd93a 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -49,7 +49,7 @@ "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", "eslint": "^8.2.0", - "jasmine-core": "~3.7.0", + "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.1.0", diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 3f2ae010fe..c7a0344227 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -52,7 +52,7 @@ "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", "eslint": "^8.2.0", - "jasmine-core": "~3.7.0", + "jasmine-core": "~4.0.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.1.0", From 88d86f87172ea7243df4f0151238198ce9d17382 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 20 Apr 2022 14:23:28 +0300 Subject: [PATCH 177/242] Update @angular/core @angular/cli @angular-eslint/schematics to 13.3 --- templates/app/angular/package.json | 38 +++++++++++++-------------- templates/module/angular/package.json | 38 +++++++++++++-------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 6fdafdd93a..cdddc9c658 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -20,30 +20,30 @@ "@abp/ng.tenant-management": "~5.2.1", "@abp/ng.theme.basic": "~5.2.1", "@abp/ng.theme.shared": "~5.2.1", - "@angular/animations": "~13.1.1", - "@angular/common": "~13.1.1", - "@angular/compiler": "~13.1.1", - "@angular/core": "~13.1.1", - "@angular/forms": "~13.1.1", - "@angular/localize": "~13.1.1", - "@angular/platform-browser": "~13.1.1", - "@angular/platform-browser-dynamic": "~13.1.1", - "@angular/router": "~13.1.1", + "@angular/animations": "~13.3.3", + "@angular/common": "~13.3.3", + "@angular/compiler": "~13.3.3", + "@angular/core": "~13.3.3", + "@angular/forms": "~13.3.3", + "@angular/localize": "~13.3.3", + "@angular/platform-browser": "~13.3.3", + "@angular/platform-browser-dynamic": "~13.3.3", + "@angular/router": "~13.3.3", "rxjs": "~6.6.0", "tslib": "^2.1.0", "zone.js": "~0.11.4" }, "devDependencies": { "@abp/ng.schematics": "~5.2.1", - "@angular-devkit/build-angular": "~13.1.2", - "@angular-eslint/builder": "~13.0.1", - "@angular-eslint/eslint-plugin": "~13.0.1", - "@angular-eslint/eslint-plugin-template": "~13.0.1", - "@angular-eslint/schematics": "~13.0.1", - "@angular-eslint/template-parser": "~13.0.1", - "@angular/cli": "~13.1.2", - "@angular/compiler-cli": "~13.1.1", - "@angular/language-service": "~13.1.1", + "@angular-devkit/build-angular": "~13.3.3", + "@angular-eslint/builder": "~13.2.1", + "@angular-eslint/eslint-plugin": "~13.2.1", + "@angular-eslint/eslint-plugin-template": "~13.2.1", + "@angular-eslint/schematics": "~13.2.1", + "@angular-eslint/template-parser": "~13.2.1", + "@angular/cli": "~13.3.3", + "@angular/compiler-cli": "~13.3.3", + "@angular/language-service": "~13.3.3", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "5.3.0", @@ -58,4 +58,4 @@ "ng-packagr": "^13.1.2", "typescript": "~4.5.4" } -} +} \ No newline at end of file diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index c7a0344227..05f715c7c2 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -23,30 +23,30 @@ "@abp/ng.tenant-management": "~5.2.1", "@abp/ng.theme.basic": "~5.2.1", "@abp/ng.theme.shared": "~5.2.1", - "@angular/animations": "~13.1.1", - "@angular/common": "~13.1.1", - "@angular/compiler": "~13.1.1", - "@angular/core": "~13.1.1", - "@angular/forms": "~13.1.1", - "@angular/localize": "~13.1.1", - "@angular/platform-browser": "~13.1.1", - "@angular/platform-browser-dynamic": "~13.1.1", - "@angular/router": "~13.1.1", + "@angular/animations": "~13.3.3", + "@angular/common": "~13.3.3", + "@angular/compiler": "~13.3.3", + "@angular/core": "~13.3.3", + "@angular/forms": "~13.3.3", + "@angular/localize": "~13.3.3", + "@angular/platform-browser": "~13.3.3", + "@angular/platform-browser-dynamic": "~13.3.3", + "@angular/router": "~13.3.3", "rxjs": "~6.6.0", "tslib": "^2.1.0", "zone.js": "~0.11.4" }, "devDependencies": { "@abp/ng.schematics": "~5.2.1", - "@angular-devkit/build-angular": "~13.1.2", - "@angular-eslint/builder": "~13.0.1", - "@angular-eslint/eslint-plugin": "~13.0.1", - "@angular-eslint/eslint-plugin-template": "~13.0.1", - "@angular-eslint/schematics": "~13.0.1", - "@angular-eslint/template-parser": "~13.0.1", - "@angular/cli": "~13.1.2", - "@angular/compiler-cli": "~13.1.1", - "@angular/language-service": "~13.1.1", + "@angular-devkit/build-angular": "~13.3.3", + "@angular-eslint/builder": "~13.2.1", + "@angular-eslint/eslint-plugin": "~13.2.1", + "@angular-eslint/eslint-plugin-template": "~13.2.1", + "@angular-eslint/schematics": "~13.2.1", + "@angular-eslint/template-parser": "~13.2.1", + "@angular/cli": "~13.3.3", + "@angular/compiler-cli": "~13.3.3", + "@angular/language-service": "~13.3.3", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "5.3.0", @@ -62,4 +62,4 @@ "symlink-manager": "^1.5.0", "typescript": "~4.5.4" } -} +} \ No newline at end of file From c2c1cc52205474e6bc9a882fc475561ddeff2be8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20Tosun?= Date: Thu, 21 Apr 2022 10:58:41 +0300 Subject: [PATCH 178/242] Grammatical Correction Given tenant does not exist --- .../Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json index 25516ba765..f3259dbb54 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json @@ -1,7 +1,7 @@ { "culture": "en", "texts": { - "GivenTenantIsNotExist": "Given tenant is not exist: {0}", + "GivenTenantIsNotExist": "Given tenant does not exist: {0}", "GivenTenantIsNotAvailable": "Given tenant is not available: {0}", "Tenant": "Tenant", "Switch": "switch", From ac7b6d3dc975674f82eceb90cdf071240f526982 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Sun, 24 Apr 2022 17:22:35 +0800 Subject: [PATCH 179/242] Create docs/zh-Hans/Testing.md --- docs/zh-Hans/Testing.md | 768 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 768 insertions(+) create mode 100644 docs/zh-Hans/Testing.md diff --git a/docs/zh-Hans/Testing.md b/docs/zh-Hans/Testing.md new file mode 100644 index 0000000000..5bb72803c8 --- /dev/null +++ b/docs/zh-Hans/Testing.md @@ -0,0 +1,768 @@ +# 自动化测试 + +## 介绍 + +ABP框架的设计考虑了可测试性. 有一些不同级别的自动化测试: + +* **单元测试**: 通常只测试一个类(或者一起测试几个类). 这些测试会很快. 然而, 你通常需要处理对服务依赖项的模拟. +* **集成测试**: 你通常会测试一个服务, 但这一次你不会模拟基本的基础设施和服务, 以查看它们是否正确地协同工作. +* **用户界面测试**: 测试应用程序的UI, 就像用户与应用程序交互一样. + +### 单元测试 vs 集成测试 + +与单元测试相比, 集成测试有一些显著的**优势**: + +* **编写更加简单** 因为你不需要模拟和处理依赖关系. +* 你的测试代码运行于所有真正的服务和基础设施(包括数据库映射和查询), 因此它更接近于**真正的应用程序测试**. + +同时它们有一些缺点: + +* 与单元测试相比, 它们**更慢**, 因为所有的基础设施都准备好了测试用例. +* 服务中的一个bug可能会导致多个测试用例失败, 因此在某些情况下, 可能会**更难找到真正的问题**. + +我们建议混合使用: 在必要的地方编写单元测试或集成测试, 并且有效的编写和维护它. + +## 应用程序启动模板 + +测试基础设施提供[应用程序启动模板](Startup-Templates/Application.md) , 并已经正确安装和配置. + +### 测试项目 + +请参见Visual Studio中的以下解决方案: + +![solution-test-projects](images/solution-test-projects.png) + +按层级系统分为多个测试项目: + +* `Domain.Tests` 用于测试领域层对象 (例如[领域服务](Domain-Services.md) 和 [实体](Entities.md)). +* `Application.Tests` 用于测试应用层对象 (例如[应用服务](Application-Services.md)). +* `EntityFrameworkCore.Tests` 用于测试你的自定义仓储实现或EF Core映射(如果你使用其他[数据访问](Data-Access.md))的话, 该项目将有所不同). +* `Web.Tests` 用于测试UI层(如页面、控制器和视图组件). 该项目仅适用于MVC / Razor页面应用程序. +* `TestBase` 包含一些由其他项目共享/使用的类. + +> `HttpApi.Client.ConsoleTestApp` 不是自动化测试的应用程序. 它是一个示例的控制台应用程序, 展示了如何从.NET控制台应用程序中调用HTTP API. + +以下的部分将介绍这些项目中包含的基类和其他基础设施. + +### 测试基础设施 + +解决方案中已经安装了以下库: + +* [xUnit](https://xunit.net/) 作为测试框架. +* [NSubstitute](https://nsubstitute.github.io/) 用于模拟. +* [Shouldly](https://github.com/shouldly/shouldly) 用于断言. + +虽然你可以用自己喜欢的工具替换它们, 但本文档和示例将基于这些工具. + +## 测试资源管理器 + +你可以在Visual Studio中使用测试资源管理器查看和运行测试. 其他IDE, 请参阅它们自己的文档. + +### 打开测试资源管理器 + +打开*测试*菜单下的*测试资源管理器*(如果尚未打开): + +![vs-test-explorer](images/vs-test-explorer.png) + +### 运行测试 + +然后, 你可以单击在视图中运行所有测试或运行按钮来运行测试. 初始启动模板为你提供了一些测试用例: + +![vs-startup-template-tests](images/vs-startup-template-tests.png) + +### 并行运行测试 + +支持并行运行测试. **强烈建议**并行运行所有测试, 这比逐个运行测试要快得多. + +要启用它, 请单击设置(齿轮)按钮附近的插入符号图标, 然后选择*并行运行测试*. + +![vs-run-tests-in-parallel](images/vs-run-tests-in-parallel.png) + +## 单元测试 + +对于单元测试, 不需要太多的配置. 通常会实例化你的类, 并对要测试的对象提供一些预先配置的模拟对象. + +### 没有依赖项的类 + +要测试的类没有依赖项是最简单的情况, 你可以直接实例化类, 调用其方法并做出断言. + +#### 示例: 测试实体 + +假设你有一个 `Issue` [实体](Entities.md), 如下所示: + +````csharp +using System; +using Volo.Abp.Domain.Entities; + +namespace MyProject.Issues +{ + public class Issue : AggregateRoot + { + public string Title { get; set; } + public string Description { get; set; } + public bool IsLocked { get; set; } + public bool IsClosed { get; private set; } + public DateTime? CloseDate { get; private set; } + + public void Close() + { + IsClosed = true; + CloseDate = DateTime.UtcNow; + } + + public void Open() + { + if (!IsClosed) + { + return; + } + + if (IsLocked) + { + throw new IssueStateException("You can not open a locked issue!"); + } + + IsClosed = true; + CloseDate = null; + } + } +} + +```` + +请注意, `IsClosed`和`CloseDate`属性具有私有setter, 可以使用`Open()`和`Close()`方法强制执行某些业务逻辑: + +* 无论何时关闭issue, `CloseDate`都应设置为[当前时间](Timing.md). +* 如果issue被锁定, 则无法重新打开. 如果它被重新打开, `CloseDate`应该设置为`null`. + +由于`Issue`实体是领域层的一部分, 所以我们应该在`Domain.Tests`项目中测试它. 在`Domain.Tests`项目中创建一个`Issue_Tests`类: + +````csharp +using Shouldly; +using Xunit; + +namespace MyProject.Issues +{ + public class Issue_Tests + { + [Fact] + public void Should_Set_The_CloseDate_Whenever_Close_An_Issue() + { + // Arrange + + var issue = new Issue(); + issue.CloseDate.ShouldBeNull(); // null at the beginning + + // Act + + issue.Close(); + + // Assert + + issue.IsClosed.ShouldBeTrue(); + issue.CloseDate.ShouldNotBeNull(); + } + } +} +```` + +这个测试遵循AAA(Arrange-Act-Assert)模式: + +* **Arrange** 部分创建一个`Issue`实体, 并确保`CloseDate`在初始值为`null`. +* **Act** 部分执行我们想要测试的方法. +* **Assert** 部分检查`Issue`属性是否与我们预期的相同. + +`[Fact]`属性由[xUnit](https://xunit.net/)并将方法标记为测试方法. `Should...`扩展方法由[Shouldly](https://github.com/shouldly/shouldly)提供. 你可以直接使用xUnit中的`Assert`类, 使用Shouldly让它更舒适、更直观. + +当你执行测试时, 你将看到它成功通过: + +![issue-first-test](images/issue-first-test.png) + +让我们再添加两种测试方法: + +````csharp +[Fact] +public void Should_Allow_To_ReOpen_An_Issue() +{ + // Arrange + + var issue = new Issue(); + issue.Close(); + + // Act + + issue.Open(); + + // Assert + + issue.IsClosed.ShouldBeFalse(); + issue.CloseDate.ShouldBeNull(); +} + +[Fact] +public void Should_Not_Allow_To_ReOpen_A_Locked_Issue() +{ + // Arrange + + var issue = new Issue(); + issue.Close(); + issue.IsLocked = true; + + // Act & Assert + + Assert.Throws(() => + { + issue.Open(); + }); +} +```` + +`Assert.Throws` 检查执行的代码是否匹配引发的异常. + +> 有关这些库的更多信息, 请参阅xUnit & Shoudly的文档. + +### 具有依赖项的类 + +如果你的服务中有依赖项, 并且你想对该服务进行单元测试, 那么你需要模拟这些依赖项. + +#### 示例: 测试领域服务 + +假设你有一个`IssueManager` [领域服务](Domain-Services.md), 定义如下: + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Services; + +namespace MyProject.Issues +{ + public class IssueManager : DomainService + { + public const int MaxAllowedOpenIssueCountForAUser = 3; + + private readonly IIssueRepository _issueRepository; + + public IssueManager(IIssueRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task AssignToUserAsync(Issue issue, Guid userId) + { + var issueCount = await _issueRepository.GetIssueCountOfUserAsync(userId); + + if (issueCount >= MaxAllowedOpenIssueCountForAUser) + { + throw new BusinessException( + code: "IM:00392", + message: $"You can not assign more" + + $"than {MaxAllowedOpenIssueCountForAUser} issues to a user!" + ); + } + + issue.AssignedUserId = userId; + } + } +} +```` + +`IssueManager`依赖于`IssueRepository`服务, 在本例中将模拟该服务. + +**业务逻辑**: 示例`AssignToUserAsync`不允许向用户分配超过3个issue (`MaxAllowedOpenIssueCountForAUser`常量). 在这种情况下, 如果要分配issue, 首先需要取消现有issue的分配. + +下面的测试用例给出一个有效的赋值: + +````csharp +using System; +using System.Threading.Tasks; +using NSubstitute; +using Shouldly; +using Volo.Abp; +using Xunit; + +namespace MyProject.Issues +{ + public class IssueManager_Tests + { + [Fact] + public async Task Should_Assign_An_Issue_To_A_User() + { + // Arrange + + var userId = Guid.NewGuid(); + + var fakeRepo = Substitute.For(); + fakeRepo.GetIssueCountOfUserAsync(userId).Returns(1); + + var issueManager = new IssueManager(fakeRepo); + + var issue = new Issue(); + + // Act + + await issueManager.AssignToUserAsync(issue, userId); + + //Assert + + issue.AssignedUserId.ShouldBe(userId); + await fakeRepo.Received(1).GetIssueCountOfUserAsync(userId); + } + } +} +```` + +* `Substitute.For` 创建一个模拟(假)对象, 该对象被传递到`IssueManager`构造函数中. +* `fakeRepo.GetIssueCountOfUserAsync(userId).Returns(1)` 确保仓储中的`GetIssueContofuseRasync`方法返回`1`. +* `issueManager.AssignToUserAsync` 不会引发任何异常, 因为仓储统计当前分配的issue数量并且返回`1`. +* `issue.AssignedUserId.ShouldBe(userId);` 行检查`AssignedUserId`的值是否正确. +* `await fakeRepo.Received(1).GetIssueCountOfUserAsync(userId);` 检查 `IssueManager` 实际只调用了 `GetIssueCountOfUserAsync` 方法一次. + +让我们添加第二个测试, 看看它是否能阻止将issue分配给超过分配数量的用户: + +````csharp +[Fact] +public async Task Should_Not_Allow_To_Assign_Issues_Over_The_Limit() +{ + // Arrange + + var userId = Guid.NewGuid(); + + var fakeRepo = Substitute.For(); + fakeRepo + .GetIssueCountOfUserAsync(userId) + .Returns(IssueManager.MaxAllowedOpenIssueCountForAUser); + + var issueManager = new IssueManager(fakeRepo); + + // Act & Assert + + var issue = new Issue(); + + await Assert.ThrowsAsync(async () => + { + await issueManager.AssignToUserAsync(issue, userId); + }); + + issue.AssignedUserId.ShouldBeNull(); + await fakeRepo.Received(1).GetIssueCountOfUserAsync(userId); +} +```` + +> 有关模拟的更多信息, 请参阅[NSubstitute](https://nsubstitute.github.io/)文档. + +模拟单个依赖项相对容易. 但是, 当依赖关系增长时, 设置测试对象和模拟所有依赖关系变得越来越困难. 请参阅不需要模拟依赖项的*Integration Tests*部分. + +### 提示: 共享测试类构造函数 + +[xUnit](https://xunit.net/) 为每个测试方法创建一个**新测试类实例**(本例中为`IssueManager_Tests`). 因此, 你可以将一些*Arrange*代码移动到构造函数中, 以减少代码重复. 构造函数将针对每个测试用例执行, 并且不会相互影响, 即使它们是并行工作. + +**示例: 重构`IssueManager_Tests`以减少代码重复** + +````csharp +using System; +using System.Threading.Tasks; +using NSubstitute; +using Shouldly; +using Volo.Abp; +using Xunit; + +namespace MyProject.Issues +{ + public class IssueManager_Tests + { + private readonly Guid _userId; + private readonly IIssueRepository _fakeRepo; + private readonly IssueManager _issueManager; + private readonly Issue _issue; + + public IssueManager_Tests() + { + _userId = Guid.NewGuid(); + _fakeRepo = Substitute.For(); + _issueManager = new IssueManager(_fakeRepo); + _issue = new Issue(); + } + + [Fact] + public async Task Should_Assign_An_Issue_To_A_User() + { + // Arrange + _fakeRepo.GetIssueCountOfUserAsync(_userId).Returns(1); + + // Act + await _issueManager.AssignToUserAsync(_issue, _userId); + + //Assert + _issue.AssignedUserId.ShouldBe(_userId); + await _fakeRepo.Received(1).GetIssueCountOfUserAsync(_userId); + } + + [Fact] + public async Task Should_Not_Allow_To_Assign_Issues_Over_The_Limit() + { + // Arrange + _fakeRepo + .GetIssueCountOfUserAsync(_userId) + .Returns(IssueManager.MaxAllowedOpenIssueCountForAUser); + + // Act & Assert + await Assert.ThrowsAsync(async () => + { + await _issueManager.AssignToUserAsync(_issue, _userId); + }); + + _issue.AssignedUserId.ShouldBeNull(); + await _fakeRepo.Received(1).GetIssueCountOfUserAsync(_userId); + } + } +} +```` + +> 保持测试代码整洁, 以创建可维护的测试组件. + +## 集成测试 + +> 你还可以按照[Web应用程序开发教程](Tutorials/Part-1.md)学习开发全栈应用程序, 包括集成测试. + +### 集成测试基础 + +ABP为编写集成测试提供了完整的基础设施. 所有ABP基础设施和服务都将在你的测试中执行. 应用程序启动模板附带了为你预先配置的必要基础设施; + +#### 数据库 + +启动模板使用EF Core配置**内存中的SQLite**数据库(对于MongoDB, 它使用[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)). 因此, 所有配置和查询都是针对真实数据库执行的, 你甚至可以测试数据库事务. + +使用内存中的SQLite数据库有两个主要优点: + +* 它比外部DBMS更快. +* 它会为每个测试用例创建一个**新的数据库**, 这样测试就不会相互影响. + +> **提示**: 不要将EF Core的内存数据库用于高级集成测试. 它不是一个真正的DBMS, 在细节上有很多不同. 例如, 它不支持事务和回滚场景, 因此无法真正测试失败的场景. 另一方面, 内存中的SQLite是一个真正的DBMS, 支持SQL数据库的基本功能. + +### 种子数据 + +针对空数据库编写测试是不现实的. 在大多数情况下, 需要在数据库中保存一些初始数据. 例如, 如果你编写了一个查询、更新和删除产品的测试类, 那么在执行测试用例之前, 在数据库中有一些产品数据会很有帮助. + +ABP的[种子数据](Data-Seeding.md)系统是一种强大的初始化数据的方法. 应用程序启动模板在`.TestBase`项目中有一个*YourProject*TestDataSeedContributor类. 你可以在其中添加, 以获得可用于每个测试方法的初始数据. + +**示例: 创建一些Issue作为种子数据** + +````csharp +using System.Threading.Tasks; +using MyProject.Issues; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace MyProject +{ + public class MyProjectTestDataSeedContributor + : IDataSeedContributor, ITransientDependency + { + private readonly IIssueRepository _issueRepository; + + public MyProjectTestDataSeedContributor(IIssueRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task SeedAsync(DataSeedContext context) + { + await _issueRepository.InsertAsync( + new Issue + { + Title = "Test issue one", + Description = "Test issue one description", + AssignedUserId = TestData.User1Id + }); + + await _issueRepository.InsertAsync( + new Issue + { + Title = "Test issue two", + Description = "Test issue two description", + AssignedUserId = TestData.User1Id + }); + + await _issueRepository.InsertAsync( + new Issue + { + Title = "Test issue three", + Description = "Test issue three description", + AssignedUserId = TestData.User1Id + }); + + await _issueRepository.InsertAsync( + new Issue + { + Title = "Test issue four", + Description = "Test issue four description", + AssignedUserId = TestData.User2Id + }); + } + } +} +```` + +还创建了一个静态类来存储用户的 `Id`: + +````csharp +using System; + +namespace MyProject +{ + public static class TestData + { + public static Guid User1Id = Guid.Parse("41951813-5CF9-4204-8B18-CD765DBCBC9B"); + public static Guid User2Id = Guid.Parse("2DAB4460-C21B-4925-BF41-A52750A9B999"); + } +} +```` + +通过这种方式, 我们可以使用这些已知Issue和用户的`Id`来运行测试. + +### 示例: 测试领域服务 + +`AbpIntegratedTest`类 (定义在[Volo.Abp.TestBase](https://www.nuget.org/packages/Volo.Abp.TestBase)) 用于编写集成到ABP框架的测试. `T`是用于设置和初始化应用程序的根模块的类型. + +应用程序启动模板在每个测试项目中都有基类, 因此你可以从这些基类派生, 以使其更简单. + +`IssueManager`测试将被重写成集成测试 + +````csharp +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp; +using Xunit; + +namespace MyProject.Issues +{ + public class IssueManager_Integration_Tests : MyProjectDomainTestBase + { + private readonly IssueManager _issueManager; + private readonly Issue _issue; + + public IssueManager_Integration_Tests() + { + _issueManager = GetRequiredService(); + _issue = new Issue + { + Title = "Test title", + Description = "Test description" + }; + } + + [Fact] + public async Task Should_Not_Allow_To_Assign_Issues_Over_The_Limit() + { + // Act & Assert + await Assert.ThrowsAsync(async () => + { + await _issueManager.AssignToUserAsync(_issue, TestData.User1Id); + }); + + _issue.AssignedUserId.ShouldBeNull(); + } + + [Fact] + public async Task Should_Assign_An_Issue_To_A_User() + { + // Act + await _issueManager.AssignToUserAsync(_issue, TestData.User2Id); + + //Assert + _issue.AssignedUserId.ShouldBe(TestData.User2Id); + } + } +} +```` + +* 第一个测试方法将issue分配给User1, 其中User1已经分配了种子数据代码中的3个issue. 因此, 它抛出了一个`BusinessException`. +* 第二种测试方法将issue分配给User2, User2只分配了一个issue. 因此, 该方法成功了. + +这个类通常位于`.Domain.Tests`项目中, 因为它测试位于`.Domain`项目中的类. 它派生自`MyProjectDomainTestBase`, 并已经为正确运行测试进行了配置. + +编写这样一个集成测试类非常简单. 另一个好处是, 在以后向`IssueManager`类添加另一个依赖项时, 不需要更改测试类. + +### 示例: 测试应用服务 + +测试[应用服务](Application-Services.md)并没有太大的不同. 假设你已经创建了一个`IssueAppService`, 定义如下: + +````csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace MyProject.Issues +{ + public class IssueAppService : ApplicationService, IIssueAppService + { + private readonly IIssueRepository _issueRepository; + + public IssueAppService(IIssueRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task> GetListAsync() + { + var issues = await _issueRepository.GetListAsync(); + + return ObjectMapper.Map, List>(issues); + } + } +} +```` + +*(假设你还定义了`IIssueAppService`和`IssueDto`, 并在`Issue`和`IssueDto`之间创建了[对象映射](Object-To-Object-Mapping.md))* + +现在, 你可以在`.Application.Tests`项目中编写一个测试类: + +````csharp +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace MyProject.Issues +{ + public class IssueAppService_Tests : MyProjectApplicationTestBase + { + private readonly IIssueAppService _issueAppService; + + public IssueAppService_Tests() + { + _issueAppService = GetRequiredService(); + } + + [Fact] + public async Task Should_Get_All_Issues() + { + //Act + var issueDtos = await _issueAppService.GetListAsync(); + + //Assert + issueDtos.Count.ShouldBeGreaterThan(0); + } + } +} +```` + +就这么简单. 此测试方法测试的所有内容, 包括应用服务、EF Core映射、对象到对象映射和仓储实现. 通过这种方式, 你可以完全测试解决方案的应用层和领域层. + +### 处理集成测试中的工作单元 + +ABP的[工作单元](Unit-Of-Work.md)系统控制应用程序中的数据库连接和事务管理. 它可以在你编写应用程序代码时无缝工作, 因此你可能没有意识到它. + +在ABP框架中, 所有数据库操作都必须在一个工作单元作用域内执行. 当你测试[应用服务](Application-Services.md)方法时, 工作单元的作用域将是应用服务方法的作用域. 如果你正在测试[仓储](Repositories.md)方法, 那么工作单元作用域将是你的仓储方法的作用域. + +在某些情况下, 你可能需要手动控制工作单元作用域. 可以考虑下面的测试方法: + +````csharp +public class IssueRepository_Tests : MyProjectDomainTestBase +{ + private readonly IRepository _issueRepository; + + public IssueRepository_Tests() + { + _issueRepository = GetRequiredService>(); + } + + public async Task Should_Query_By_Title() + { + IQueryable queryable = await _issueRepository.GetQueryableAsync(); + var issue = queryable.FirstOrDefaultAsync(i => i.Title == "My issue title"); + issue.ShouldNotBeNull(); + } +} +```` + +我们正在使用`_issueRepository.GetQueryableAsync`获取`IQueryable` 对象. 然后, 我们使用`FirstOrDefaultAsync`方法按标题查询issue. 此时执行数据库查询, 你将会得到一个异常, 表明没有起作用的工作单元. + +要使该测试正常工作, 你应该手动启动工作单元作用域, 如下所示: + +````csharp +public class IssueRepository_Tests : MyProjectDomainTestBase +{ + private readonly IRepository _issueRepository; + private readonly IUnitOfWorkManager _unitOfWorkManager; + + public IssueRepository_Tests() + { + _issueRepository = GetRequiredService>(); + _unitOfWorkManager = GetRequiredService(); + } + + public async Task Should_Query_By_Title() + { + using (var uow = _unitOfWorkManager.Begin()) + { + IQueryable queryable = await _issueRepository.GetQueryableAsync(); + var issue = queryable.FirstOrDefaultAsync(i => i.Title == "My issue title"); + issue.ShouldNotBeNull(); + await uow.CompleteAsync(); + } + } +} +```` + +我们已经使用了`IUnitOfWorkManager`服务来创建一个工作单元作用域, 然后在该作用域内调用了`FirstOrDefaultAsync`方法, 所以不再有问题了. + +> 请注意, 我们测试了`FirstOrDefaultAsync`来演示工作单元的问题. 作为一个好的标准, 编写自己的代码. + +### 使用DbContext + +在某些情况下, 你可能希望使用Entity Framework的`DbContext`对象来执行测试方法中的数据库操作. 在这种情况下, 可以使用`IDbContextProvider`服务在工作单元内获取`DbContext`实例. + +下面的示例展示了如何在测试方法中创建`DbContext`对象: + +````csharp +public class MyDbContext_Tests : MyProjectDomainTestBase +{ + private readonly IDbContextProvider _dbContextProvider; + private readonly IUnitOfWorkManager _unitOfWorkManager; + + public IssueRepository_Tests() + { + _dbContextProvider = GetRequiredService>(); + _unitOfWorkManager = GetRequiredService(); + } + + public async Task Should_Query_By_Title() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var dbContext = await _dbContextProvider.GetDbContextAsync(); + var issue = await dbContext.Issues.FirstOrDefaultAsync(i => i.Title == "My issue title"); + issue.ShouldNotBeNull(); + await uow.CompleteAsync(); + } + } +} +```` + +就像我们在*集成测试中处理工作单元*一节中所做的那样, 我们应该在起作用的工作单元内执行`DbContext`操作. + +对于[MongoDB](MongoDB.md), 你可以使用`IMongoDbContextProvider`服务获取`DbContext`对象, 并在测试方法中直接使用MongoDB APIs. + +## 用户界面测试 + +一般来说, 有两种类型的UI测试: + +### 非可视化测试 + +此类测试完全取决于UI框架的选择: + +* 对于MVC / Razor页面UI, 通常向服务器发出请求, 获取HTML, 并测试返回的结果中是否存在一些预期的DOM元素. +* Angular有自己的基础设施和实践来测试组件、视图和服务. + +请参阅以下文档以了解非可视化UI测试: + +* [Testing in ASP.NET Core MVC / Razor Pages](UI/AspNetCore/Testing.md) +* [Testing in Angular](UI/Angular/Testing.md) +* [Testing in Blazor](UI/Blazor/Testing.md) + +### 可视化测试 + +与真实用户一样, 可视化测试用于与应用程序UI交互. 它全面测试应用程序, 包括页面和组件的外观. + +可视化UI测试超出了ABP框架的范围. 行业中有很多工具(比如[Selenium](https://www.selenium.dev/))可以用来测试应用程序的UI. From bc6f1b6780b9c684428d30bd5e4078774487d9e9 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 25 Apr 2022 09:34:02 +0800 Subject: [PATCH 180/242] Update docs-nav.json --- docs/zh-Hans/docs-nav.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index db0fc10aed..6586fa978f 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -682,6 +682,10 @@ } ] }, + { + "text": "测试", + "path": "Testing.md" + }, { "text": "示例", "items": [ From 440ba40f14de84f0bebe0e2111de07a05fd777d4 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 25 Apr 2022 11:24:09 +0800 Subject: [PATCH 181/242] Create UI/Angular/Testing.md --- docs/zh-Hans/UI/Angular/Testing.md | 380 +++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 docs/zh-Hans/UI/Angular/Testing.md diff --git a/docs/zh-Hans/UI/Angular/Testing.md b/docs/zh-Hans/UI/Angular/Testing.md new file mode 100644 index 0000000000..c176d82247 --- /dev/null +++ b/docs/zh-Hans/UI/Angular/Testing.md @@ -0,0 +1,380 @@ +# Angular UI 单元测试 + +ABP Angular UI的测试与其他Angular应用程序一样. 所以, [这里的指南](https://angular.io/guide/testing)也适用于ABP. 也就是说, 我们想指出一些**特定于ABP Angular应用程序的单元测试内容**. + +## 设置 + +在Angular中, 单元测试默认使用[Karma](https://karma-runner.github.io/)和[Jasmine](https://jasmine.github.io). 虽然我们更喜欢Jest, 但我们选择不偏离这些默认设置, 因此**你下载的应用程序模板将预先配置Karma和Jasmine**. 你可以在根目录中的 _karma.conf.js_ 文件中找到Karma配置. 你什么都不用做. 添加一个spec文件并运行`npm test`即可. + +## 基础 + +简化版的spec文件如下所示: + +```js +import { CoreTestingModule } from "@abp/ng.core/testing"; +import { ThemeBasicTestingModule } from "@abp/ng.theme.basic/testing"; +import { ThemeSharedTestingModule } from "@abp/ng.theme.shared/testing"; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; +import { NgxValidateCoreModule } from "@ngx-validate/core"; +import { MyComponent } from "./my.component"; + +describe("MyComponent", () => { + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [MyComponent], + imports: [ + CoreTestingModule.withConfig(), + ThemeSharedTestingModule.withConfig(), + ThemeBasicTestingModule.withConfig(), + NgxValidateCoreModule, + ], + providers: [ + /* mock providers here */ + ], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(MyComponent); + fixture.detectChanges(); + }); + + it("should be initiated", () => { + expect(fixture.componentInstance).toBeTruthy(); + }); +}); +``` + +如果你看一下导入内容, 你会注意到我们已经准备了一些测试模块来取代内置的ABP模块. 这对于模拟某些特性是必要的, 否则这些特性会破坏你的测试. 请记住**使用测试模块**并**调用其`withConfig`静态方法**. + +## 提示 + +### Angular测试库 + +虽然你可以使用Angular TestBed测试代码, 但你可以找到一个好的替代品[Angular测试库](https://testing-library.com/docs/angular-testing-library/intro). + +上面的简单示例可以用Angular测试库编写, 如下所示: + +```js +import { CoreTestingModule } from "@abp/ng.core/testing"; +import { ThemeBasicTestingModule } from "@abp/ng.theme.basic/testing"; +import { ThemeSharedTestingModule } from "@abp/ng.theme.shared/testing"; +import { ComponentFixture } from "@angular/core/testing"; +import { NgxValidateCoreModule } from "@ngx-validate/core"; +import { render } from "@testing-library/angular"; +import { MyComponent } from "./my.component"; + +describe("MyComponent", () => { + let fixture: ComponentFixture; + + beforeEach(async () => { + const result = await render(MyComponent, { + imports: [ + CoreTestingModule.withConfig(), + ThemeSharedTestingModule.withConfig(), + ThemeBasicTestingModule.withConfig(), + NgxValidateCoreModule, + ], + providers: [ + /* mock providers here */ + ], + }); + + fixture = result.fixture; + }); + + it("should be initiated", () => { + expect(fixture.componentInstance).toBeTruthy(); + }); +}); +``` + +正如你所见, 二者非常相似. 当我们使用查询和触发事件时, 真正的区别就显现出来了. + +```js +// other imports +import { getByLabelText, screen } from "@testing-library/angular"; +import userEvent from "@testing-library/user-event"; + +describe("MyComponent", () => { + beforeEach(/* removed for sake of brevity */); + + it("should display advanced filters", () => { + const filters = screen.getByTestId("author-filters"); + const nameInput = getByLabelText(filters, /name/i) as HTMLInputElement; + expect(nameInput.offsetWidth).toBe(0); + + const advancedFiltersBtn = screen.getByRole("link", { name: /advanced/i }); + userEvent.click(advancedFiltersBtn); + + expect(nameInput.offsetWidth).toBeGreaterThan(0); + + userEvent.type(nameInput, "fooo{backspace}"); + expect(nameInput.value).toBe("foo"); + }); +}); +``` + +**Angular测试库中的查询遵循可维护测试**, 用户事件库提供了与DOM的**类人交互**, 并且该库通常有**清晰的API**简化组件测试. 下面提供一些有用的链接: + +- [查询](https://testing-library.com/docs/dom-testing-library/api-queries) +- [用户事件](https://testing-library.com/docs/ecosystem-user-event) +- [范例](https://github.com/testing-library/angular-testing-library/tree/main/apps/example-app/src/app/examples) + +### 在每个Spec之后清除DOM + +需要记住的一点是, Karma在真实的浏览器实例中运行测试. 这意味着, 你将能够看到测试代码的结果, 但也会遇到与文档正文连接的组件的问题, 这些组件可能无法在每次测试后都清除, 即使你配置了Karma也一样无法清除. + +我们准备了一个简单的函数, 可以在每次测试后清除所有剩余的DOM元素. + +```js +// other imports +import { clearPage } from "@abp/ng.core/testing"; + +describe("MyComponent", () => { + let fixture: ComponentFixture; + + afterEach(() => clearPage(fixture)); + + beforeEach(async () => { + const result = await render(MyComponent, { + /* removed for sake of brevity */ + }); + fixture = result.fixture; + }); + + // specs here +}); +``` + +请确保你使用它, 否则Karma将无法删除对话框, 并且你将有多个模态对话框、确认框等的副本. + +### 等待 + +一些组件, 特别是在检测周期之外工作的模态对话框. 换句话说, 你无法在打开这些组件后立即访问这些组件插入的DOM元素. 同样, 插入的元素在关闭时也不会立即销毁. + +为此, 我们准备了一个`wait`函数. + +```js +// other imports +import { wait } from "@abp/ng.core/testing"; + +describe("MyComponent", () => { + beforeEach(/* removed for sake of brevity */); + + it("should open a modal", async () => { + const openModalBtn = screen.getByRole("button", { name: "Open Modal" }); + userEvent.click(openModalBtn); + + await wait(fixture); + + const modal = screen.getByRole("dialog"); + + expect(modal).toBeTruthy(); + + /* wait again after closing the modal */ + }); +}); +``` + +`wait`函数接受第二个参数, 即超时(默认值为`0`). 但是尽量不要使用它. 使用大于`0`的超时通常表明某些不正确事情发生了. + +## 测试示例 + +下面是一个测试示例. 它并没有涵盖所有内容, 但却能够对测试有一个更好的了解. + +```js +import { clearPage, CoreTestingModule, wait } from "@abp/ng.core/testing"; +import { ThemeBasicTestingModule } from "@abp/ng.theme.basic/testing"; +import { ThemeSharedTestingModule } from "@abp/ng.theme.shared/testing"; +import { ComponentFixture } from "@angular/core/testing"; +import { + NgbCollapseModule, + NgbDatepickerModule, + NgbDropdownModule, +} from "@ng-bootstrap/ng-bootstrap"; +import { NgxValidateCoreModule } from "@ngx-validate/core"; +import { CountryService } from "@proxy/countries"; +import { + findByText, + getByLabelText, + getByRole, + getByText, + queryByRole, + render, + screen, +} from "@testing-library/angular"; +import userEvent from "@testing-library/user-event"; +import { BehaviorSubject, of } from "rxjs"; +import { CountryComponent } from "./country.component"; + +const list$ = new BehaviorSubject({ + items: [{ id: "ID_US", name: "United States of America" }], + totalCount: 1, +}); + +describe("Country", () => { + let fixture: ComponentFixture; + + afterEach(() => clearPage(fixture)); + + beforeEach(async () => { + const result = await render(CountryComponent, { + imports: [ + CoreTestingModule.withConfig(), + ThemeSharedTestingModule.withConfig(), + ThemeBasicTestingModule.withConfig(), + NgxValidateCoreModule, + NgbCollapseModule, + NgbDatepickerModule, + NgbDropdownModule, + ], + providers: [ + { + provide: CountryService, + useValue: { + getList: () => list$, + }, + }, + ], + }); + + fixture = result.fixture; + }); + + it("should display advanced filters", () => { + const filters = screen.getByTestId("country-filters"); + const nameInput = getByLabelText(filters, /name/i) as HTMLInputElement; + expect(nameInput.offsetWidth).toBe(0); + + const advancedFiltersBtn = screen.getByRole("link", { name: /advanced/i }); + userEvent.click(advancedFiltersBtn); + + expect(nameInput.offsetWidth).toBeGreaterThan(0); + + userEvent.type(nameInput, "fooo{backspace}"); + expect(nameInput.value).toBe("foo"); + + userEvent.click(advancedFiltersBtn); + expect(nameInput.offsetWidth).toBe(0); + }); + + it("should have a heading", () => { + const heading = screen.getByRole("heading", { name: "Countries" }); + expect(heading).toBeTruthy(); + }); + + it("should render list in table", async () => { + const table = await screen.findByTestId("country-table"); + + const name = getByText(table, "United States of America"); + expect(name).toBeTruthy(); + }); + + it("should display edit modal", async () => { + const actionsBtn = screen.queryByRole("button", { name: /actions/i }); + userEvent.click(actionsBtn); + + const editBtn = screen.getByRole("button", { name: /edit/i }); + userEvent.click(editBtn); + + await wait(fixture); + + const modal = screen.getByRole("dialog"); + const modalHeading = queryByRole(modal, "heading", { name: /edit/i }); + expect(modalHeading).toBeTruthy(); + + const closeBtn = getByText(modal, "×"); + userEvent.click(closeBtn); + + await wait(fixture); + + expect(screen.queryByRole("dialog")).toBeFalsy(); + }); + + it("should display create modal", async () => { + const newBtn = screen.getByRole("button", { name: /new/i }); + userEvent.click(newBtn); + + await wait(fixture); + + const modal = screen.getByRole("dialog"); + const modalHeading = queryByRole(modal, "heading", { name: /new/i }); + + expect(modalHeading).toBeTruthy(); + }); + + it("should validate required name field", async () => { + const newBtn = screen.getByRole("button", { name: /new/i }); + userEvent.click(newBtn); + + await wait(fixture); + + const modal = screen.getByRole("dialog"); + const nameInput = getByRole(modal, "textbox", { + name: /^name/i, + }) as HTMLInputElement; + + userEvent.type(nameInput, "x"); + userEvent.type(nameInput, "{backspace}"); + + const nameError = await findByText(modal, /required/i); + expect(nameError).toBeTruthy(); + }); + + it("should delete a country", () => { + const getSpy = spyOn(fixture.componentInstance.list, "get"); + const deleteSpy = jasmine.createSpy().and.returnValue(of(null)); + fixture.componentInstance.service.delete = deleteSpy; + + const actionsBtn = screen.queryByRole("button", { name: /actions/i }); + userEvent.click(actionsBtn); + + const deleteBtn = screen.getByRole("button", { name: /delete/i }); + userEvent.click(deleteBtn); + + const confirmText = screen.getByText("AreYouSure"); + expect(confirmText).toBeTruthy(); + + const confirmBtn = screen.getByRole("button", { name: "Yes" }); + userEvent.click(confirmBtn); + + expect(deleteSpy).toHaveBeenCalledWith(list$.value.items[0].id); + expect(getSpy).toHaveBeenCalledTimes(1); + }); +}); +``` + +## CI配置 + +你的CI环境需要不同的配置. 要为单元测试设置新的配置, 请在测试项目中找到 _angular.json_ 文件, 或者如下所示添加一个: + +```json +// angular.json + +"test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { /* several options here */ }, + "configurations": { + "production": { + "karmaConfig": "karma.conf.prod.js" + } + } +} +``` + +现在你可以复制 _karma.conf.js_ 作为 _karma.conf.prod.js_ 并在其中使用你喜欢的任何配置. 请查看[Karma配置文档](http://karma-runner.github.io/5.2/config/configuration-file.html)配置选项. + +最后, 不要忘记使用以下命令运行CI测试: + +```sh +npm test -- --prod +``` + +## 另请参阅 + +- [ABP Community Video - Unit Testing with the Angular UI](https://community.abp.io/articles/unit-testing-with-the-angular-ui-p4l550q3) From 40a2ba7a45f96143e1fb27796c191a5e933078a9 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 25 Apr 2022 11:25:26 +0800 Subject: [PATCH 182/242] Create UI/AspNetCore/Testing.md --- docs/zh-Hans/UI/AspNetCore/Testing.md | 220 ++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 docs/zh-Hans/UI/AspNetCore/Testing.md diff --git a/docs/zh-Hans/UI/AspNetCore/Testing.md b/docs/zh-Hans/UI/AspNetCore/Testing.md new file mode 100644 index 0000000000..e5b09353fb --- /dev/null +++ b/docs/zh-Hans/UI/AspNetCore/Testing.md @@ -0,0 +1,220 @@ +# ASP.NET Core MVC / Razor Pages: 测试 + +> 你可以参考[ASP.NET Core集成测试文档](https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests)了解ASP.NET Core集成测试的详细内容. 本文档解释了ABP框架提供的附加测试基础设施. + +## 应用程序启动模板 + +应用程序启动模板的`.Web`项目其中包含应用程序的UI视图/页面/组件, 并提供`.Web.Tests`项目来测试这些内容. + +![aspnetcore-web-tests-in-solution](../../images/aspnetcore-web-tests-in-solution.png) + +## 测试Razor页面 + +假设你已经创建了一个名为`Issues.cshtml`的Razor页面, 包含以下内容; + +**Issues.cshtml.cs** + +````csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.RazorPages; +using MyProject.Issues; + +namespace MyProject.Web.Pages +{ + public class IssuesModel : PageModel + { + public List Issues { get; set; } + + private readonly IIssueAppService _issueAppService; + + public IssuesModel(IIssueAppService issueAppService) + { + _issueAppService = issueAppService; + } + + public async Task OnGetAsync() + { + Issues = await _issueAppService.GetListAsync(); + } + } +} +```` + +**Issues.cshtml** + +````html +@page +@model MyProject.Web.Pages.IssuesModel +

    Issue List

    + + + + + + + + + @foreach (var issue in Model.Issues) + { + + + + + } + +
    IssueClosed?
    @issue.Title + @if (issue.IsClosed) + { + Closed + } + else + { + Open + } +
    +```` + +本页仅创建一个包含issue的表格: + +![issue-list](../../images/issue-list.png) + +你可以在`.Web.Tests`项目中编写一个测试类如下所示: + +````csharp +using System.Threading.Tasks; +using HtmlAgilityPack; +using Shouldly; +using Xunit; + +namespace MyProject.Pages +{ + public class Issues_Tests : MyProjectWebTestBase + { + [Fact] + public async Task Should_Get_Table_Of_Issues() + { + // Act + + var response = await GetResponseAsStringAsync("/Issues"); + + //Assert + + var htmlDocument = new HtmlDocument(); + htmlDocument.LoadHtml(response); + + var tableElement = htmlDocument.GetElementbyId("IssueTable"); + tableElement.ShouldNotBeNull(); + + var trNodes = tableElement.SelectNodes("//tbody/tr"); + trNodes.Count.ShouldBeGreaterThan(0); + } + } +} +```` + +`GetResponseAsStringAsync`是一个快捷方法, 它来自执行HTTP GET请求的基类, 检查生成的HTTP状态是否为`200`, 并将响应作为`string`返回. + +> 你可以使用`Client`对象(类型为`HttpClient`)对服务器执行任何类型的请求, 并读取响应.`GetResponseAsStringAsync`只是一种快捷方法. + +本例使用[HtmlAgilityPack](https://html-agility-pack.net/)库来解析传入的HTML并测试它是否包含issue表格. + +> 本例假设的数据库中存在一些初始issue. 请参阅[测试文档](../../Testing.md)的*种子数据*部分, 了解如何设置种子数据, 以便可以假定数据库中有一些可用的初始数据. + +## 控制器测试 + +测试控制器也不例外. 只需使用正确的URL向服务器执行请求, 获取响应并做出断言. + +### 查看结果 + +如果控制器返回一个视图, 你可以使用类似的代码来测试返回的HTML. 参见上面的Razor页面示例. + +### 对象结果 + +如果控制器返回对象结果, 则可以使用`GetResponseAsObjectAsync`方法. + +假设你有一个如下定义的控制器: + +````csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using MyProject.Issues; +using Volo.Abp.AspNetCore.Mvc; + +namespace MyProject.Web.Controllers +{ + [Route("api/issues")] + public class IssueController : AbpController + { + private readonly IIssueAppService _issueAppService; + + public IssueController(IIssueAppService issueAppService) + { + _issueAppService = issueAppService; + } + + [HttpGet] + public async Task> GetAsync() + { + return await _issueAppService.GetListAsync(); + } + } +} +```` + +你可以编写测试代码来调用API并获得结果: + +````csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using MyProject.Issues; +using Shouldly; +using Xunit; + +namespace MyProject.Pages +{ + public class Issues_Tests : MyProjectWebTestBase + { + [Fact] + public async Task Should_Get_Issues_From_Api() + { + var issues = await GetResponseAsObjectAsync>("/api/issues"); + + issues.ShouldNotBeNull(); + issues.Count.ShouldBeGreaterThan(0); + } + } +} +```` + +## 测试JavaScript代码 + +ABP框架不提供任何基础设施来测试JavaScript代码. 你可以使用任何测试框架和工具来测试JavaScript代码. + +## 测试基础设施 + +[Volo.Abp.AspNetCore.TestBase](https://www.nuget.org/packages/Volo.Abp.AspNetCore.TestBase) 提供了集成到ABP框架和ASP.NET Core的测试基础设施. + +> Volo.Abp.AspNetCore.TestBase 已经安装在 `.Web.Tests` 项目中. + +此包提供的`AbpAspNetCoreIntegratedTestBase`作为派生测试类的基类. 上面使用的`MyProjectWebTestBase`继承自`AbpAspNetCoreIntegratedTestBase`, 因此我们间接继承了`AbpAspNetCoreIntegratedTestBase`. + +### 基本属性 + +`AbpAspNetCoreIntegratedTestBase` 提供了测试中使用的以下基本属性: + +* `Server`: 在测试中托管web应用程序的`TestServer`实例. +* `Client`: 为执行对测试服务器的请求配置`HttpClient`实例. +* `ServiceProvider`: 可以在你需要时处理服务提供服务. + +### 基本方法 + +`AbpAspNetCoreIntegratedTestBase` 提供了以下方法, 如果需要自定义测试服务器, 可以重写这些方法: + +* `ConfigureServices` 仅为派生测试类注册/替换服务时可以重写使用. +* `CreateHostBuilder` 可用于自定义生成 `IHostBuilder`. + +另请参阅 + +* [总览/服务器端测试](../../Testing.md) From 82d8320c9010eeb90494a93562262254d4d3f367 Mon Sep 17 00:00:00 2001 From: hpstory <33348162+hpstory@users.noreply.github.com> Date: Mon, 25 Apr 2022 11:26:22 +0800 Subject: [PATCH 183/242] Update docs-nav.json --- docs/zh-Hans/docs-nav.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index 6586fa978f..fa38a203d0 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -515,6 +515,10 @@ "text": "自定义/扩展UI", "path": "UI/AspNetCore/Customization-User-Interface.md" }, + { + "text": "测试", + "path": "UI/AspNetCore/Testing.md" + }, { "text": "主题化", "path": "UI/AspNetCore/Theming.md" @@ -536,6 +540,10 @@ "text": "服务代理", "path": "UI/Angular/Service-Proxies.md" }, + { + "text": "单元测试", + "path": "UI/Angular/Testing.md" + }, { "text": "HTTP请求", "path": "UI/Angular/HTTP-Requests.md" From 6efc1b56dd90a4e551d945ad8bbb5880c97a6d50 Mon Sep 17 00:00:00 2001 From: braim23 <94292623+braim23@users.noreply.github.com> Date: Mon, 25 Apr 2022 12:22:50 +0300 Subject: [PATCH 184/242] Update en.json --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 18c5524d1f..ec9be431ba 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -382,6 +382,7 @@ "SuccessfullyAdded": "Successfully added", "PurchaseState": "Purchase State", "ShowBetweenDayCount": "Show Between Days", - "PurchaseOrder": "Purchase Order" + "PurchaseOrder": "Purchase Order", + "ShowCreateInvoiceOfOrganization": "Create Invoice" } } \ No newline at end of file From e48efa412eab56ec1a1570767eb4d3ad4ef87083 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 25 Apr 2022 15:07:34 +0300 Subject: [PATCH 185/242] Add Volo.Abp.Gdpr.Abstractions.csproj --- framework/Volo.Abp.sln | 7 ++++ .../FodyWeavers.xml | 3 ++ .../FodyWeavers.xsd | 30 ++++++++++++++ .../Volo.Abp.Gdpr.Abstractions.csproj | 15 +++++++ .../Abp/Gdpr/AbpGdprAbstractionsModule.cs | 9 ++++ .../Volo/Abp/Gdpr/GdprDataInfo.cs | 10 +++++ .../Gdpr/GdprUserDataDeleteRequestedEto.cs | 9 ++++ .../Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs | 13 ++++++ .../Volo/Abp/Gdpr/GdprUserDataProviderBase.cs | 8 ++++ .../Abp/Gdpr/GdprUserDataProviderContext.cs | 8 ++++ .../Gdpr/GdprUserDataRequestEventHandler.cs | 41 +++++++++++++++++++ .../Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs | 11 +++++ .../Volo/Abp/Gdpr/IGdprUserDataProvider.cs | 8 ++++ 13 files changed, 172 insertions(+) create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/AbpGdprAbstractionsModule.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprDataInfo.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataDeleteRequestedEto.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderBase.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderContext.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestEventHandler.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs create mode 100644 framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/IGdprUserDataProvider.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index f3e495c814..94a2e79415 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -403,6 +403,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.DistributedLocking EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BackgroundWorkers.Hangfire", "src\Volo.Abp.BackgroundWorkers.Hangfire\Volo.Abp.BackgroundWorkers.Hangfire.csproj", "{E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Gdpr.Abstractions", "src\Volo.Abp.Gdpr.Abstractions\Volo.Abp.Gdpr.Abstractions.csproj", "{3683340D-92F5-4B14-B77B-34A163333309}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1201,6 +1203,10 @@ Global {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|Any CPU.Build.0 = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1404,6 +1410,7 @@ Global {CA805B77-D50C-431F-B3CB-1111C9C6E807} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C4F54FB5-C828-414D-BA03-E8E7A10C784D} = {447C8A77-E5F0-4538-8687-7383196D04EA} {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {3683340D-92F5-4B14-B77B-34A163333309} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xml b/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xml new file mode 100644 index 0000000000..00e1d9a1c1 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xsd b/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj new file mode 100644 index 0000000000..3a5f8369b0 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj @@ -0,0 +1,15 @@ + + + + + + + netstandard2.0 + + + + + + + + diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/AbpGdprAbstractionsModule.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/AbpGdprAbstractionsModule.cs new file mode 100644 index 0000000000..9d1e95eae9 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/AbpGdprAbstractionsModule.cs @@ -0,0 +1,9 @@ +using Volo.Abp.EventBus; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Gdpr; + +[DependsOn(typeof(AbpEventBusModule))] +public class AbpGdprAbstractionsModule : AbpModule +{ +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprDataInfo.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprDataInfo.cs new file mode 100644 index 0000000000..550f556a1c --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprDataInfo.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprDataInfo : Dictionary +{ + +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataDeleteRequestedEto.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataDeleteRequestedEto.cs new file mode 100644 index 0000000000..c5975e1496 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataDeleteRequestedEto.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprUserDataDeleteRequestedEto +{ + public Guid UserId { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs new file mode 100644 index 0000000000..3a2c440f97 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataPreparedEto.cs @@ -0,0 +1,13 @@ +using System; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprUserDataPreparedEto +{ + public Guid RequestId { get; set; } + + public string Provider { get; set; } + + public GdprDataInfo Data { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderBase.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderBase.cs new file mode 100644 index 0000000000..696cf16e74 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderBase.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Gdpr; + +public abstract class GdprUserDataProviderBase : IGdprUserDataProvider +{ + public abstract Task GetAsync(GdprUserDataProviderContext context); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderContext.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderContext.cs new file mode 100644 index 0000000000..1ccd035b7e --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataProviderContext.cs @@ -0,0 +1,8 @@ +using System; + +namespace Volo.Abp.Gdpr; + +public class GdprUserDataProviderContext +{ + public Guid UserId { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestEventHandler.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestEventHandler.cs new file mode 100644 index 0000000000..d9453c7ef5 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestEventHandler.cs @@ -0,0 +1,41 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; + +namespace Volo.Abp.Gdpr; + +public class GdprUserDataRequestEventHandler + : IDistributedEventHandler, ITransientDependency +{ + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected IDistributedEventBus EventBus { get; } + + public GdprUserDataRequestEventHandler(IServiceScopeFactory serviceScopeFactory, IDistributedEventBus eventBus) + { + ServiceScopeFactory = serviceScopeFactory; + EventBus = eventBus; + } + + public async Task HandleEventAsync(GdprUserDataRequestedEto eventData) + { + using (var scope = ServiceScopeFactory.CreateScope()) + { + var gdprDataProviders = scope.ServiceProvider.GetServices().ToList(); + + foreach (var gdprDataProvider in gdprDataProviders) + { + var gdprDataInfo = await gdprDataProvider.GetAsync(new GdprUserDataProviderContext { UserId = eventData.UserId}); + + await EventBus.PublishAsync( + new GdprUserDataPreparedEto + { + RequestId = eventData.RequestId, + Data = gdprDataInfo, + Provider = gdprDataProvider.GetType().FullName + }); + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs new file mode 100644 index 0000000000..b341ab2659 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/GdprUserDataRequestedEto.cs @@ -0,0 +1,11 @@ +using System; + +namespace Volo.Abp.Gdpr; + +[Serializable] +public class GdprUserDataRequestedEto +{ + public Guid UserId { get; set; } + + public Guid RequestId { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/IGdprUserDataProvider.cs b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/IGdprUserDataProvider.cs new file mode 100644 index 0000000000..e04fc950d9 --- /dev/null +++ b/framework/src/Volo.Abp.Gdpr.Abstractions/Volo/Abp/Gdpr/IGdprUserDataProvider.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Gdpr; + +public interface IGdprUserDataProvider +{ + Task GetAsync(GdprUserDataProviderContext context); +} \ No newline at end of file From f15ed95068d2e15fa63c50d9d3c336fdd276bca2 Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Tue, 26 Apr 2022 02:28:34 +0300 Subject: [PATCH 186/242] closes #12355 --- .../docs/src/Volo.Docs.Web/DocsWebModule.cs | 7 ++ .../Pages/Documents/Project/Index.cshtml | 110 +++++++++--------- .../Pages/Documents/Project/Index.cshtml.cs | 30 +++-- .../Shared/Components/Head/Default.cshtml | 4 + .../Components/Head/HeadViewComponent.cs | 15 +++ 5 files changed, 102 insertions(+), 64 deletions(-) create mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Shared/Components/Head/Default.cshtml create mode 100644 modules/docs/src/Volo.Docs.Web/Pages/Shared/Components/Head/HeadViewComponent.cs diff --git a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs index 77f5bec551..42c1717690 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; using Volo.Abp.AspNetCore.Mvc.UI.Packages; using Volo.Abp.AspNetCore.Mvc.UI.Packages.Prismjs; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; @@ -16,6 +17,7 @@ using Volo.Docs.Bundling; using Volo.Docs.HtmlConverting; using Volo.Docs.Localization; using Volo.Docs.Markdown; +using Volo.Docs.Pages.Shared.Components.Head; namespace Volo.Docs { @@ -91,6 +93,11 @@ namespace Volo.Docs { options.DisableModule(DocsRemoteServiceConsts.ModuleName); }); + + Configure(options => + { + options.Add(LayoutHooks.Head.Last, typeof(HeadViewComponent)); + }); } } } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index c0ea0c4d7c..5ca2b7fbd9 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -11,38 +11,42 @@ @using Volo.Docs.Localization @using Volo.Docs.Pages.Documents.Project @using Volo.Docs.Pages.Documents.Shared.ErrorComponent +@using Volo.Docs.Pages.Shared.Components.Head @inject IThemeManager ThemeManager @inject IPageLayout PageLayout @inject IHtmlLocalizer L + @model IndexModel @{ ViewBag.FluidLayout = true; Layout = ThemeManager.CurrentTheme.GetEmptyLayout(); PageLayout.Content.Title = Model.DocumentName?.Replace("-", " "); ViewBag.Description = Model.GetDescription(); + ViewBag.CanonicalUrl = Model.IsLatestVersion ? null : Model.GetFullUrlOfTheLatestDocument(); //issue #12355 } + @section styles { - - - - - - - + + + + + + + } @section scripts { - - - - - - - - - - - - + + + + + + + + + + + + } @if (Model.LoadSuccess) { @@ -93,8 +97,8 @@
    @@ -112,11 +116,11 @@ - +
    @@ -131,11 +135,11 @@
    @* - - *@ + + *@
    @@ -149,11 +153,11 @@
    + id="filter" + type="search" + data-search-url="@Model." + placeholder="@L["FilterTopics"].Value" + aria-label="Filter">
    @@ -168,13 +172,13 @@ else { + version="@(Model.LatestVersionInfo == null || Model.LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Model.Version)" + project-name="@Model.ProjectName" + project-format="@Model.Project.Format" + selected-document-name="@Model.DocumentNameWithExtension" + language="@Model.LanguageCode" + id="sidebar-scroll" + class="nav nav-list"> }
    @@ -194,11 +198,11 @@ + id="fullsearch" + type="search" + data-fullsearch-url="/search/@Model.LanguageCode/@Model.ProjectName/@Model.Version/" + placeholder="@L["FullSearch"].Value" + aria-label="Filter">

    } @@ -210,15 +214,15 @@ @(L["Contributors"].Value) - @foreach (var contributor in Model.Document.Contributors.OrderByDescending(c=> c.CommitCount).ToList()) + @foreach (var contributor in Model.Document.Contributors.OrderByDescending(c => c.CommitCount).ToList()) { Avatar + class="rounded-circle" + alt="Avatar" + height="21" + width="21" + title="@contributor.Username" /> } } @@ -261,8 +265,8 @@
    @(parameter.DisplayName) ' + cm.phrase("(Use line:column or scroll% syntax)") + ''; + } + + function interpretLine(cm, string) { + var num = Number(string) + if (/^[-+]/.test(string)) return cm.getCursor().line + num + else return num - 1 + } + + CodeMirror.commands.jumpToLine = function(cm) { + var cur = cm.getCursor(); + dialog(cm, getJumpDialog(cm), cm.phrase("Jump to line:"), (cur.line + 1) + ":" + cur.ch, function(posStr) { + if (!posStr) return; + + var match; + if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), Number(match[2])) + } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { + var line = Math.round(cm.lineCount() * Number(match[1]) / 100); + if (/^[-+]/.test(match[1])) line = cur.line + line + 1; + cm.setCursor(line - 1, cur.ch); + } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), cur.ch); + } + }); + }; + + CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/match-highlighter.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/match-highlighter.js new file mode 100644 index 0000000000..9b181ebc01 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/match-highlighter.js @@ -0,0 +1,167 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Highlighting text that matches the selection +// +// Defines an option highlightSelectionMatches, which, when enabled, +// will style strings that match the selection throughout the +// document. +// +// The option can be set to true to simply enable it, or to a +// {minChars, style, wordsOnly, showToken, delay} object to explicitly +// configure it. minChars is the minimum amount of characters that should be +// selected for the behavior to occur, and style is the token style to +// apply to the matches. This will be prefixed by "cm-" to create an +// actual CSS class name. If wordsOnly is enabled, the matches will be +// highlighted only if the selected text is a word. showToken, when enabled, +// will cause the current token to be highlighted when nothing is selected. +// delay is used to specify how much time to wait, in milliseconds, before +// highlighting the matches. If annotateScrollbar is enabled, the occurrences +// will be highlighted on the scrollbar via the matchesonscrollbar addon. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./matchesonscrollbar")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./matchesonscrollbar"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var defaults = { + style: "matchhighlight", + minChars: 2, + delay: 100, + wordsOnly: false, + annotateScrollbar: false, + showToken: false, + trim: true + } + + function State(options) { + this.options = {} + for (var name in defaults) + this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name] + this.overlay = this.timeout = null; + this.matchesonscroll = null; + this.active = false; + } + + CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + removeOverlay(cm); + clearTimeout(cm.state.matchHighlighter.timeout); + cm.state.matchHighlighter = null; + cm.off("cursorActivity", cursorActivity); + cm.off("focus", onFocus) + } + if (val) { + var state = cm.state.matchHighlighter = new State(val); + if (cm.hasFocus()) { + state.active = true + highlightMatches(cm) + } else { + cm.on("focus", onFocus) + } + cm.on("cursorActivity", cursorActivity); + } + }); + + function cursorActivity(cm) { + var state = cm.state.matchHighlighter; + if (state.active || cm.hasFocus()) scheduleHighlight(cm, state) + } + + function onFocus(cm) { + var state = cm.state.matchHighlighter + if (!state.active) { + state.active = true + scheduleHighlight(cm, state) + } + } + + function scheduleHighlight(cm, state) { + clearTimeout(state.timeout); + state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay); + } + + function addOverlay(cm, query, hasBoundary, style) { + var state = cm.state.matchHighlighter; + cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style)); + if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) { + var searchFor = hasBoundary ? new RegExp((/\w/.test(query.charAt(0)) ? "\\b" : "") + + query.replace(/[\\\[.+*?(){|^$]/g, "\\$&") + + (/\w/.test(query.charAt(query.length - 1)) ? "\\b" : "")) : query; + state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false, + {className: "CodeMirror-selection-highlight-scrollbar"}); + } + } + + function removeOverlay(cm) { + var state = cm.state.matchHighlighter; + if (state.overlay) { + cm.removeOverlay(state.overlay); + state.overlay = null; + if (state.matchesonscroll) { + state.matchesonscroll.clear(); + state.matchesonscroll = null; + } + } + } + + function highlightMatches(cm) { + cm.operation(function() { + var state = cm.state.matchHighlighter; + removeOverlay(cm); + if (!cm.somethingSelected() && state.options.showToken) { + var re = state.options.showToken === true ? /[\w$]/ : state.options.showToken; + var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start; + while (start && re.test(line.charAt(start - 1))) --start; + while (end < line.length && re.test(line.charAt(end))) ++end; + if (start < end) + addOverlay(cm, line.slice(start, end), re, state.options.style); + return; + } + var from = cm.getCursor("from"), to = cm.getCursor("to"); + if (from.line != to.line) return; + if (state.options.wordsOnly && !isWord(cm, from, to)) return; + var selection = cm.getRange(from, to) + if (state.options.trim) selection = selection.replace(/^\s+|\s+$/g, "") + if (selection.length >= state.options.minChars) + addOverlay(cm, selection, false, state.options.style); + }); + } + + function isWord(cm, from, to) { + var str = cm.getRange(from, to); + if (str.match(/^\w+$/) !== null) { + if (from.ch > 0) { + var pos = {line: from.line, ch: from.ch - 1}; + var chr = cm.getRange(pos, from); + if (chr.match(/\W/) === null) return false; + } + if (to.ch < cm.getLine(from.line).length) { + var pos = {line: to.line, ch: to.ch + 1}; + var chr = cm.getRange(to, pos); + if (chr.match(/\W/) === null) return false; + } + return true; + } else return false; + } + + function boundariesAround(stream, re) { + return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && + (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); + } + + function makeOverlay(query, hasBoundary, style) { + return {token: function(stream) { + if (stream.match(query) && + (!hasBoundary || boundariesAround(stream, hasBoundary))) + return style; + stream.next(); + stream.skipTo(query.charAt(0)) || stream.skipToEnd(); + }}; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.css new file mode 100644 index 0000000000..77932cc908 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.css @@ -0,0 +1,8 @@ +.CodeMirror-search-match { + background: gold; + border-top: 1px solid orange; + border-bottom: 1px solid orange; + -moz-box-sizing: border-box; + box-sizing: border-box; + opacity: .5; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.js new file mode 100644 index 0000000000..8a4a827584 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/matchesonscrollbar.js @@ -0,0 +1,97 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) { + if (typeof options == "string") options = {className: options}; + if (!options) options = {}; + return new SearchAnnotation(this, query, caseFold, options); + }); + + function SearchAnnotation(cm, query, caseFold, options) { + this.cm = cm; + this.options = options; + var annotateOptions = {listenForChanges: false}; + for (var prop in options) annotateOptions[prop] = options[prop]; + if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match"; + this.annotation = cm.annotateScrollbar(annotateOptions); + this.query = query; + this.caseFold = caseFold; + this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1}; + this.matches = []; + this.update = null; + + this.findMatches(); + this.annotation.update(this.matches); + + var self = this; + cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); }); + } + + var MAX_MATCHES = 1000; + + SearchAnnotation.prototype.findMatches = function() { + if (!this.gap) return; + for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + if (match.from.line >= this.gap.to) break; + if (match.to.line >= this.gap.from) this.matches.splice(i--, 1); + } + var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), {caseFold: this.caseFold, multiline: this.options.multiline}); + var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES; + while (cursor.findNext()) { + var match = {from: cursor.from(), to: cursor.to()}; + if (match.from.line >= this.gap.to) break; + this.matches.splice(i++, 0, match); + if (this.matches.length > maxMatches) break; + } + this.gap = null; + }; + + function offsetLine(line, changeStart, sizeChange) { + if (line <= changeStart) return line; + return Math.max(changeStart, line + sizeChange); + } + + SearchAnnotation.prototype.onChange = function(change) { + var startLine = change.from.line; + var endLine = CodeMirror.changeEnd(change).line; + var sizeChange = endLine - change.to.line; + if (this.gap) { + this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line); + this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line); + } else { + this.gap = {from: change.from.line, to: endLine + 1}; + } + + if (sizeChange) for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + var newFrom = offsetLine(match.from.line, startLine, sizeChange); + if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch); + var newTo = offsetLine(match.to.line, startLine, sizeChange); + if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch); + } + clearTimeout(this.update); + var self = this; + this.update = setTimeout(function() { self.updateAfterChange(); }, 250); + }; + + SearchAnnotation.prototype.updateAfterChange = function() { + this.findMatches(); + this.annotation.update(this.matches); + }; + + SearchAnnotation.prototype.clear = function() { + this.cm.off("change", this.changeHandler); + this.annotation.clear(); + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/search.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/search.js new file mode 100644 index 0000000000..24a0855e9e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/search.js @@ -0,0 +1,292 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Define search commands. Depends on dialog.js or another +// implementation of the openDialog method. + +// Replace works a little oddly -- it will do the replace on the next +// Ctrl-G (or whatever is bound to findNext) press. You prevent a +// replace by making sure the match is no longer selected when hitting +// Ctrl-G. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + // default search panel location + CodeMirror.defineOption("search", {bottom: false}); + + function searchOverlay(query, caseInsensitive) { + if (typeof query == "string") + query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g"); + else if (!query.global) + query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); + + return {token: function(stream) { + query.lastIndex = stream.pos; + var match = query.exec(stream.string); + if (match && match.index == stream.pos) { + stream.pos += match[0].length || 1; + return "searching"; + } else if (match) { + stream.pos = match.index; + } else { + stream.skipToEnd(); + } + }}; + } + + function SearchState() { + this.posFrom = this.posTo = this.lastQuery = this.query = null; + this.overlay = null; + } + + function getSearchState(cm) { + return cm.state.search || (cm.state.search = new SearchState()); + } + + function queryCaseInsensitive(query) { + return typeof query == "string" && query == query.toLowerCase(); + } + + function getSearchCursor(cm, query, pos) { + // Heuristic: if the query string is all lowercase, do a case insensitive search. + return cm.getSearchCursor(query, pos, {caseFold: queryCaseInsensitive(query), multiline: true}); + } + + function persistentDialog(cm, text, deflt, onEnter, onKeyDown) { + cm.openDialog(text, onEnter, { + value: deflt, + selectValueOnOpen: true, + closeOnEnter: false, + onClose: function() { clearSearch(cm); }, + onKeyDown: onKeyDown, + bottom: cm.options.search.bottom + }); + } + + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom}); + else f(prompt(shortText, deflt)); + } + + function confirmDialog(cm, text, shortText, fs) { + if (cm.openConfirm) cm.openConfirm(text, fs); + else if (confirm(shortText)) fs[0](); + } + + function parseString(string) { + return string.replace(/\\([nrt\\])/g, function(match, ch) { + if (ch == "n") return "\n" + if (ch == "r") return "\r" + if (ch == "t") return "\t" + if (ch == "\\") return "\\" + return match + }) + } + + function parseQuery(query) { + var isRE = query.match(/^\/(.*)\/([a-z]*)$/); + if (isRE) { + try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); } + catch(e) {} // Not a regular expression after all, do a string search + } else { + query = parseString(query) + } + if (typeof query == "string" ? query == "" : query.test("")) + query = /x^/; + return query; + } + + function startSearch(cm, state, query) { + state.queryText = query; + state.query = parseQuery(query); + cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); + state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); + cm.addOverlay(state.overlay); + if (cm.showMatchesOnScrollbar) { + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); + } + } + + function doSearch(cm, rev, persistent, immediate) { + var state = getSearchState(cm); + if (state.query) return findNext(cm, rev); + var q = cm.getSelection() || state.lastQuery; + if (q instanceof RegExp && q.source == "x^") q = null + if (persistent && cm.openDialog) { + var hiding = null + var searchNext = function(query, event) { + CodeMirror.e_stop(event); + if (!query) return; + if (query != state.queryText) { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + } + if (hiding) hiding.style.opacity = 1 + findNext(cm, event.shiftKey, function(_, to) { + var dialog + if (to.line < 3 && document.querySelector && + (dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) && + dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top) + (hiding = dialog).style.opacity = .4 + }) + }; + persistentDialog(cm, getQueryDialog(cm), q, searchNext, function(event, query) { + var keyName = CodeMirror.keyName(event) + var extra = cm.getOption('extraKeys'), cmd = (extra && extra[keyName]) || CodeMirror.keyMap[cm.getOption("keyMap")][keyName] + if (cmd == "findNext" || cmd == "findPrev" || + cmd == "findPersistentNext" || cmd == "findPersistentPrev") { + CodeMirror.e_stop(event); + startSearch(cm, getSearchState(cm), query); + cm.execCommand(cmd); + } else if (cmd == "find" || cmd == "findPersistent") { + CodeMirror.e_stop(event); + searchNext(query, event); + } + }); + if (immediate && q) { + startSearch(cm, state, q); + findNext(cm, rev); + } + } else { + dialog(cm, getQueryDialog(cm), "Search for:", q, function(query) { + if (query && !state.query) cm.operation(function() { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + findNext(cm, rev); + }); + }); + } + } + + function findNext(cm, rev, callback) {cm.operation(function() { + var state = getSearchState(cm); + var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); + if (!cursor.find(rev)) { + cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); + if (!cursor.find(rev)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20); + state.posFrom = cursor.from(); state.posTo = cursor.to(); + if (callback) callback(cursor.from(), cursor.to()) + });} + + function clearSearch(cm) {cm.operation(function() { + var state = getSearchState(cm); + state.lastQuery = state.query; + if (!state.query) return; + state.query = state.queryText = null; + cm.removeOverlay(state.overlay); + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + });} + + function el(tag, attrs) { + var element = tag ? document.createElement(tag) : document.createDocumentFragment(); + for (var key in attrs) { + element[key] = attrs[key]; + } + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i] + element.appendChild(typeof child == "string" ? document.createTextNode(child) : child); + } + return element; + } + + function getQueryDialog(cm) { + return el("", null, + el("span", {className: "CodeMirror-search-label"}, cm.phrase("Search:")), " ", + el("input", {type: "text", "style": "width: 10em", className: "CodeMirror-search-field"}), " ", + el("span", {style: "color: #888", className: "CodeMirror-search-hint"}, + cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplaceQueryDialog(cm) { + return el("", null, " ", + el("input", {type: "text", "style": "width: 10em", className: "CodeMirror-search-field"}), " ", + el("span", {style: "color: #888", className: "CodeMirror-search-hint"}, + cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplacementQueryDialog(cm) { + return el("", null, + el("span", {className: "CodeMirror-search-label"}, cm.phrase("With:")), " ", + el("input", {type: "text", "style": "width: 10em", className: "CodeMirror-search-field"})); + } + function getDoReplaceConfirm(cm) { + return el("", null, + el("span", {className: "CodeMirror-search-label"}, cm.phrase("Replace?")), " ", + el("button", {}, cm.phrase("Yes")), " ", + el("button", {}, cm.phrase("No")), " ", + el("button", {}, cm.phrase("All")), " ", + el("button", {}, cm.phrase("Stop"))); + } + + function replaceAll(cm, query, text) { + cm.operation(function() { + for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { + if (typeof query != "string") { + var match = cm.getRange(cursor.from(), cursor.to()).match(query); + cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + } else cursor.replace(text); + } + }); + } + + function replace(cm, all) { + if (cm.getOption("readOnly")) return; + var query = cm.getSelection() || getSearchState(cm).lastQuery; + var dialogText = all ? cm.phrase("Replace all:") : cm.phrase("Replace:") + var fragment = el("", null, + el("span", {className: "CodeMirror-search-label"}, dialogText), + getReplaceQueryDialog(cm)) + dialog(cm, fragment, dialogText, query, function(query) { + if (!query) return; + query = parseQuery(query); + dialog(cm, getReplacementQueryDialog(cm), cm.phrase("Replace with:"), "", function(text) { + text = parseString(text) + if (all) { + replaceAll(cm, query, text) + } else { + clearSearch(cm); + var cursor = getSearchCursor(cm, query, cm.getCursor("from")); + var advance = function() { + var start = cursor.from(), match; + if (!(match = cursor.findNext())) { + cursor = getSearchCursor(cm, query); + if (!(match = cursor.findNext()) || + (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); + confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase("Replace?"), + [function() {doReplace(match);}, advance, + function() {replaceAll(cm, query, text)}]); + }; + var doReplace = function(match) { + cursor.replace(typeof query == "string" ? text : + text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + advance(); + }; + advance(); + } + }); + }); + } + + CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; + CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);}; + CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);}; + CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);}; + CodeMirror.commands.findNext = doSearch; + CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; + CodeMirror.commands.clearSearch = clearSearch; + CodeMirror.commands.replace = replace; + CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/searchcursor.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/searchcursor.js new file mode 100644 index 0000000000..230017b781 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/search/searchcursor.js @@ -0,0 +1,305 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod) + else // Plain browser env + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + var Pos = CodeMirror.Pos + + function regexpFlags(regexp) { + var flags = regexp.flags + return flags != null ? flags : (regexp.ignoreCase ? "i" : "") + + (regexp.global ? "g" : "") + + (regexp.multiline ? "m" : "") + } + + function ensureFlags(regexp, flags) { + var current = regexpFlags(regexp), target = current + for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1) + target += flags.charAt(i) + return current == target ? regexp : new RegExp(regexp.source, target) + } + + function maybeMultiline(regexp) { + return /\\s|\\n|\n|\\W|\\D|\[\^/.test(regexp.source) + } + + function searchRegexpForward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g") + for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) { + regexp.lastIndex = ch + var string = doc.getLine(line), match = regexp.exec(string) + if (match) + return {from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match} + } + } + + function searchRegexpForwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start) + + regexp = ensureFlags(regexp, "gm") + var string, chunk = 1 + for (var line = start.line, last = doc.lastLine(); line <= last;) { + // This grows the search buffer in exponentially-sized chunks + // between matches, so that nearby matches are fast and don't + // require concatenating the whole document (in case we're + // searching for something that has tons of matches), but at the + // same time, the amount of retries is limited. + for (var i = 0; i < chunk; i++) { + if (line > last) break + var curLine = doc.getLine(line++) + string = string == null ? curLine : string + "\n" + curLine + } + chunk = chunk * 2 + regexp.lastIndex = start.ch + var match = regexp.exec(string) + if (match) { + var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n") + var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length + return {from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, + inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match} + } + } + } + + function lastMatchIn(string, regexp, endMargin) { + var match, from = 0 + while (from <= string.length) { + regexp.lastIndex = from + var newMatch = regexp.exec(string) + if (!newMatch) break + var end = newMatch.index + newMatch[0].length + if (end > string.length - endMargin) break + if (!match || end > match.index + match[0].length) + match = newMatch + from = newMatch.index + 1 + } + return match + } + + function searchRegexpBackward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g") + for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) { + var string = doc.getLine(line) + var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch) + if (match) + return {from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match} + } + } + + function searchRegexpBackwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start) + regexp = ensureFlags(regexp, "gm") + var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch + for (var line = start.line, first = doc.firstLine(); line >= first;) { + for (var i = 0; i < chunkSize && line >= first; i++) { + var curLine = doc.getLine(line--) + string = string == null ? curLine : curLine + "\n" + string + } + chunkSize *= 2 + + var match = lastMatchIn(string, regexp, endMargin) + if (match) { + var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n") + var startLine = line + before.length, startCh = before[before.length - 1].length + return {from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, + inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match} + } + } + } + + var doFold, noFold + if (String.prototype.normalize) { + doFold = function(str) { return str.normalize("NFD").toLowerCase() } + noFold = function(str) { return str.normalize("NFD") } + } else { + doFold = function(str) { return str.toLowerCase() } + noFold = function(str) { return str } + } + + // Maps a position in a case-folded line back to a position in the original line + // (compensating for codepoints increasing in number during folding) + function adjustPos(orig, folded, pos, foldFunc) { + if (orig.length == folded.length) return pos + for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) { + if (min == max) return min + var mid = (min + max) >> 1 + var len = foldFunc(orig.slice(0, mid)).length + if (len == pos) return mid + else if (len > pos) max = mid + else min = mid + 1 + } + } + + function searchStringForward(doc, query, start, caseFold) { + // Empty string would match anything and never progress, so we + // define it to match nothing instead. + if (!query.length) return null + var fold = caseFold ? doFold : noFold + var lines = fold(query).split(/\r|\n\r?/) + + search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) { + var orig = doc.getLine(line).slice(ch), string = fold(orig) + if (lines.length == 1) { + var found = string.indexOf(lines[0]) + if (found == -1) continue search + var start = adjustPos(orig, string, found, fold) + ch + return {from: Pos(line, adjustPos(orig, string, found, fold) + ch), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)} + } else { + var cutFrom = string.length - lines[0].length + if (string.slice(cutFrom) != lines[0]) continue search + for (var i = 1; i < lines.length - 1; i++) + if (fold(doc.getLine(line + i)) != lines[i]) continue search + var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1] + if (endString.slice(0, lastLine.length) != lastLine) continue search + return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch), + to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))} + } + } + } + + function searchStringBackward(doc, query, start, caseFold) { + if (!query.length) return null + var fold = caseFold ? doFold : noFold + var lines = fold(query).split(/\r|\n\r?/) + + search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) { + var orig = doc.getLine(line) + if (ch > -1) orig = orig.slice(0, ch) + var string = fold(orig) + if (lines.length == 1) { + var found = string.lastIndexOf(lines[0]) + if (found == -1) continue search + return {from: Pos(line, adjustPos(orig, string, found, fold)), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))} + } else { + var lastLine = lines[lines.length - 1] + if (string.slice(0, lastLine.length) != lastLine) continue search + for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++) + if (fold(doc.getLine(start + i)) != lines[i]) continue search + var top = doc.getLine(line + 1 - lines.length), topString = fold(top) + if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search + return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)), + to: Pos(line, adjustPos(orig, string, lastLine.length, fold))} + } + } + } + + function SearchCursor(doc, query, pos, options) { + this.atOccurrence = false + this.afterEmptyMatch = false + this.doc = doc + pos = pos ? doc.clipPos(pos) : Pos(0, 0) + this.pos = {from: pos, to: pos} + + var caseFold + if (typeof options == "object") { + caseFold = options.caseFold + } else { // Backwards compat for when caseFold was the 4th argument + caseFold = options + options = null + } + + if (typeof query == "string") { + if (caseFold == null) caseFold = false + this.matches = function(reverse, pos) { + return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold) + } + } else { + query = ensureFlags(query, "gm") + if (!options || options.multiline !== false) + this.matches = function(reverse, pos) { + return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos) + } + else + this.matches = function(reverse, pos) { + return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos) + } + } + } + + SearchCursor.prototype = { + findNext: function() {return this.find(false)}, + findPrevious: function() {return this.find(true)}, + + find: function(reverse) { + var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); + if (this.afterEmptyMatch && this.atOccurrence) { + // do not return the same 0 width match twice + head = Pos(head.line, head.ch) + if (reverse) { + head.ch--; + if (head.ch < 0) { + head.line--; + head.ch = (this.doc.getLine(head.line) || "").length; + } + } else { + head.ch++; + if (head.ch > (this.doc.getLine(head.line) || "").length) { + head.ch = 0; + head.line++; + } + } + if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) { + return this.atOccurrence = false + } + } + var result = this.matches(reverse, head) + this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0 + + if (result) { + this.pos = result + this.atOccurrence = true + return this.pos.match || true + } else { + var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0) + this.pos = {from: end, to: end} + return this.atOccurrence = false + } + }, + + from: function() {if (this.atOccurrence) return this.pos.from}, + to: function() {if (this.atOccurrence) return this.pos.to}, + + replace: function(newText, origin) { + if (!this.atOccurrence) return + var lines = CodeMirror.splitLines(newText) + this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin) + this.pos.to = Pos(this.pos.from.line + lines.length - 1, + lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)) + } + } + + CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this.doc, query, pos, caseFold) + }) + CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this, query, pos, caseFold) + }) + + CodeMirror.defineExtension("selectMatches", function(query, caseFold) { + var ranges = [] + var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold) + while (cur.findNext()) { + if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break + ranges.push({anchor: cur.from(), head: cur.to()}) + } + if (ranges.length) + this.setSelections(ranges, 0) + }) +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/active-line.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/active-line.js new file mode 100644 index 0000000000..c7b14ce07f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/active-line.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var WRAP_CLASS = "CodeMirror-activeline"; + var BACK_CLASS = "CodeMirror-activeline-background"; + var GUTT_CLASS = "CodeMirror-activeline-gutter"; + + CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { + var prev = old == CodeMirror.Init ? false : old; + if (val == prev) return + if (prev) { + cm.off("beforeSelectionChange", selectionChange); + clearActiveLines(cm); + delete cm.state.activeLines; + } + if (val) { + cm.state.activeLines = []; + updateActiveLines(cm, cm.listSelections()); + cm.on("beforeSelectionChange", selectionChange); + } + }); + + function clearActiveLines(cm) { + for (var i = 0; i < cm.state.activeLines.length; i++) { + cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); + cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); + cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS); + } + } + + function sameArray(a, b) { + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) + if (a[i] != b[i]) return false; + return true; + } + + function updateActiveLines(cm, ranges) { + var active = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var option = cm.getOption("styleActiveLine"); + if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty()) + continue + var line = cm.getLineHandleVisualStart(range.head.line); + if (active[active.length - 1] != line) active.push(line); + } + if (sameArray(cm.state.activeLines, active)) return; + cm.operation(function() { + clearActiveLines(cm); + for (var i = 0; i < active.length; i++) { + cm.addLineClass(active[i], "wrap", WRAP_CLASS); + cm.addLineClass(active[i], "background", BACK_CLASS); + cm.addLineClass(active[i], "gutter", GUTT_CLASS); + } + cm.state.activeLines = active; + }); + } + + function selectionChange(cm, sel) { + updateActiveLines(cm, sel.ranges); + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/mark-selection.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/mark-selection.js new file mode 100644 index 0000000000..adfaa62d1a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/mark-selection.js @@ -0,0 +1,119 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Because sometimes you need to mark the selected *text*. +// +// Adds an option 'styleSelectedText' which, when enabled, gives +// selected text the CSS class given as option value, or +// "CodeMirror-selectedtext" when the value is not a string. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.state.markedSelection = []; + cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext"; + reset(cm); + cm.on("cursorActivity", onCursorActivity); + cm.on("change", onChange); + } else if (!val && prev) { + cm.off("cursorActivity", onCursorActivity); + cm.off("change", onChange); + clear(cm); + cm.state.markedSelection = cm.state.markedSelectionStyle = null; + } + }); + + function onCursorActivity(cm) { + if (cm.state.markedSelection) + cm.operation(function() { update(cm); }); + } + + function onChange(cm) { + if (cm.state.markedSelection && cm.state.markedSelection.length) + cm.operation(function() { clear(cm); }); + } + + var CHUNK_SIZE = 8; + var Pos = CodeMirror.Pos; + var cmp = CodeMirror.cmpPos; + + function coverRange(cm, from, to, addAt) { + if (cmp(from, to) == 0) return; + var array = cm.state.markedSelection; + var cls = cm.state.markedSelectionStyle; + for (var line = from.line;;) { + var start = line == from.line ? from : Pos(line, 0); + var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line; + var end = atEnd ? to : Pos(endLine, 0); + var mark = cm.markText(start, end, {className: cls}); + if (addAt == null) array.push(mark); + else array.splice(addAt++, 0, mark); + if (atEnd) break; + line = endLine; + } + } + + function clear(cm) { + var array = cm.state.markedSelection; + for (var i = 0; i < array.length; ++i) array[i].clear(); + array.length = 0; + } + + function reset(cm) { + clear(cm); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) + coverRange(cm, ranges[i].from(), ranges[i].to()); + } + + function update(cm) { + if (!cm.somethingSelected()) return clear(cm); + if (cm.listSelections().length > 1) return reset(cm); + + var from = cm.getCursor("start"), to = cm.getCursor("end"); + + var array = cm.state.markedSelection; + if (!array.length) return coverRange(cm, from, to); + + var coverStart = array[0].find(), coverEnd = array[array.length - 1].find(); + if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE || + cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0) + return reset(cm); + + while (cmp(from, coverStart.from) > 0) { + array.shift().clear(); + coverStart = array[0].find(); + } + if (cmp(from, coverStart.from) < 0) { + if (coverStart.to.line - from.line < CHUNK_SIZE) { + array.shift().clear(); + coverRange(cm, from, coverStart.to, 0); + } else { + coverRange(cm, from, coverStart.from, 0); + } + } + + while (cmp(to, coverEnd.to) < 0) { + array.pop().clear(); + coverEnd = array[array.length - 1].find(); + } + if (cmp(to, coverEnd.to) > 0) { + if (to.line - coverEnd.from.line < CHUNK_SIZE) { + array.pop().clear(); + coverRange(cm, coverEnd.from, to); + } else { + coverRange(cm, coverEnd.to, to); + } + } + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/selection-pointer.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/selection-pointer.js new file mode 100644 index 0000000000..f0bd61a33e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/selection/selection-pointer.js @@ -0,0 +1,98 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("selectionPointer", false, function(cm, val) { + var data = cm.state.selectionPointer; + if (data) { + CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.off(window, "scroll", data.windowScroll); + cm.off("cursorActivity", reset); + cm.off("scroll", reset); + cm.state.selectionPointer = null; + cm.display.lineDiv.style.cursor = ""; + } + if (val) { + data = cm.state.selectionPointer = { + value: typeof val == "string" ? val : "default", + mousemove: function(event) { mousemove(cm, event); }, + mouseout: function(event) { mouseout(cm, event); }, + windowScroll: function() { reset(cm); }, + rects: null, + mouseX: null, mouseY: null, + willUpdate: false + }; + CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.on(window, "scroll", data.windowScroll); + cm.on("cursorActivity", reset); + cm.on("scroll", reset); + } + }); + + function mousemove(cm, event) { + var data = cm.state.selectionPointer; + if (event.buttons == null ? event.which : event.buttons) { + data.mouseX = data.mouseY = null; + } else { + data.mouseX = event.clientX; + data.mouseY = event.clientY; + } + scheduleUpdate(cm); + } + + function mouseout(cm, event) { + if (!cm.getWrapperElement().contains(event.relatedTarget)) { + var data = cm.state.selectionPointer; + data.mouseX = data.mouseY = null; + scheduleUpdate(cm); + } + } + + function reset(cm) { + cm.state.selectionPointer.rects = null; + scheduleUpdate(cm); + } + + function scheduleUpdate(cm) { + if (!cm.state.selectionPointer.willUpdate) { + cm.state.selectionPointer.willUpdate = true; + setTimeout(function() { + update(cm); + cm.state.selectionPointer.willUpdate = false; + }, 50); + } + } + + function update(cm) { + var data = cm.state.selectionPointer; + if (!data) return; + if (data.rects == null && data.mouseX != null) { + data.rects = []; + if (cm.somethingSelected()) { + for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling) + data.rects.push(sel.getBoundingClientRect()); + } + } + var inside = false; + if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) { + var rect = data.rects[i]; + if (rect.left <= data.mouseX && rect.right >= data.mouseX && + rect.top <= data.mouseY && rect.bottom >= data.mouseY) + inside = true; + } + var cursor = inside ? data.value : ""; + if (cm.display.lineDiv.style.cursor != cursor) + cm.display.lineDiv.style.cursor = cursor; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.css new file mode 100644 index 0000000000..c4b8a2f77e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.css @@ -0,0 +1,87 @@ +.CodeMirror-Tern-completion { + padding-left: 22px; + position: relative; + line-height: 1.5; +} +.CodeMirror-Tern-completion:before { + position: absolute; + left: 2px; + bottom: 2px; + border-radius: 50%; + font-size: 12px; + font-weight: bold; + height: 15px; + width: 15px; + line-height: 16px; + text-align: center; + color: white; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.CodeMirror-Tern-completion-unknown:before { + content: "?"; + background: #4bb; +} +.CodeMirror-Tern-completion-object:before { + content: "O"; + background: #77c; +} +.CodeMirror-Tern-completion-fn:before { + content: "F"; + background: #7c7; +} +.CodeMirror-Tern-completion-array:before { + content: "A"; + background: #c66; +} +.CodeMirror-Tern-completion-number:before { + content: "1"; + background: #999; +} +.CodeMirror-Tern-completion-string:before { + content: "S"; + background: #999; +} +.CodeMirror-Tern-completion-bool:before { + content: "B"; + background: #999; +} + +.CodeMirror-Tern-completion-guess { + color: #999; +} + +.CodeMirror-Tern-tooltip { + border: 1px solid silver; + border-radius: 3px; + color: #444; + padding: 2px 5px; + font-size: 90%; + font-family: monospace; + background-color: white; + white-space: pre-wrap; + + max-width: 40em; + position: absolute; + z-index: 10; + -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + box-shadow: 2px 3px 5px rgba(0,0,0,.2); + + transition: opacity 1s; + -moz-transition: opacity 1s; + -webkit-transition: opacity 1s; + -o-transition: opacity 1s; + -ms-transition: opacity 1s; +} + +.CodeMirror-Tern-hint-doc { + max-width: 25em; + margin-top: -3px; +} + +.CodeMirror-Tern-fname { color: black; } +.CodeMirror-Tern-farg { color: #70a; } +.CodeMirror-Tern-farg-current { text-decoration: underline; } +.CodeMirror-Tern-type { color: #07c; } +.CodeMirror-Tern-fhint-guess { opacity: .7; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.js new file mode 100644 index 0000000000..a88371747c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/tern.js @@ -0,0 +1,750 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Glue code between CodeMirror and Tern. +// +// Create a CodeMirror.TernServer to wrap an actual Tern server, +// register open documents (CodeMirror.Doc instances) with it, and +// call its methods to activate the assisting functions that Tern +// provides. +// +// Options supported (all optional): +// * defs: An array of JSON definition data structures. +// * plugins: An object mapping plugin names to configuration +// options. +// * getFile: A function(name, c) that can be used to access files in +// the project that haven't been loaded yet. Simply do c(null) to +// indicate that a file is not available. +// * fileFilter: A function(value, docName, doc) that will be applied +// to documents before passing them on to Tern. +// * switchToDoc: A function(name, doc) that should, when providing a +// multi-file view, switch the view or focus to the named file. +// * showError: A function(editor, message) that can be used to +// override the way errors are displayed. +// * completionTip: Customize the content in tooltips for completions. +// Is passed a single argument—the completion's data as returned by +// Tern—and may return a string, DOM node, or null to indicate that +// no tip should be shown. By default the docstring is shown. +// * typeTip: Like completionTip, but for the tooltips shown for type +// queries. +// * responseFilter: A function(doc, query, request, error, data) that +// will be applied to the Tern responses before treating them +// +// +// It is possible to run the Tern server in a web worker by specifying +// these additional options: +// * useWorker: Set to true to enable web worker mode. You'll probably +// want to feature detect the actual value you use here, for example +// !!window.Worker. +// * workerScript: The main script of the worker. Point this to +// wherever you are hosting worker.js from this directory. +// * workerDeps: An array of paths pointing (relative to workerScript) +// to the Acorn and Tern libraries and any Tern plugins you want to +// load. Or, if you minified those into a single script and included +// them in the workerScript, simply leave this undefined. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + // declare global: tern + + CodeMirror.TernServer = function(options) { + var self = this; + this.options = options || {}; + var plugins = this.options.plugins || (this.options.plugins = {}); + if (!plugins.doc_comment) plugins.doc_comment = true; + this.docs = Object.create(null); + if (this.options.useWorker) { + this.server = new WorkerServer(this); + } else { + this.server = new tern.Server({ + getFile: function(name, c) { return getFile(self, name, c); }, + async: true, + defs: this.options.defs || [], + plugins: plugins + }); + } + this.trackChange = function(doc, change) { trackChange(self, doc, change); }; + + this.cachedArgHints = null; + this.activeArgHints = null; + this.jumpStack = []; + + this.getHint = function(cm, c) { return hint(self, cm, c); }; + this.getHint.async = true; + }; + + CodeMirror.TernServer.prototype = { + addDoc: function(name, doc) { + var data = {doc: doc, name: name, changed: null}; + this.server.addFile(name, docValue(this, data)); + CodeMirror.on(doc, "change", this.trackChange); + return this.docs[name] = data; + }, + + delDoc: function(id) { + var found = resolveDoc(this, id); + if (!found) return; + CodeMirror.off(found.doc, "change", this.trackChange); + delete this.docs[found.name]; + this.server.delFile(found.name); + }, + + hideDoc: function(id) { + closeArgHints(this); + var found = resolveDoc(this, id); + if (found && found.changed) sendDoc(this, found); + }, + + complete: function(cm) { + cm.showHint({hint: this.getHint}); + }, + + showType: function(cm, pos, c) { showContextInfo(this, cm, pos, "type", c); }, + + showDocs: function(cm, pos, c) { showContextInfo(this, cm, pos, "documentation", c); }, + + updateArgHints: function(cm) { updateArgHints(this, cm); }, + + jumpToDef: function(cm) { jumpToDef(this, cm); }, + + jumpBack: function(cm) { jumpBack(this, cm); }, + + rename: function(cm) { rename(this, cm); }, + + selectName: function(cm) { selectName(this, cm); }, + + request: function (cm, query, c, pos) { + var self = this; + var doc = findDoc(this, cm.getDoc()); + var request = buildRequest(this, doc, query, pos); + var extraOptions = request.query && this.options.queryOptions && this.options.queryOptions[request.query.type] + if (extraOptions) for (var prop in extraOptions) request.query[prop] = extraOptions[prop]; + + this.server.request(request, function (error, data) { + if (!error && self.options.responseFilter) + data = self.options.responseFilter(doc, query, request, error, data); + c(error, data); + }); + }, + + destroy: function () { + closeArgHints(this) + if (this.worker) { + this.worker.terminate(); + this.worker = null; + } + } + }; + + var Pos = CodeMirror.Pos; + var cls = "CodeMirror-Tern-"; + var bigDoc = 250; + + function getFile(ts, name, c) { + var buf = ts.docs[name]; + if (buf) + c(docValue(ts, buf)); + else if (ts.options.getFile) + ts.options.getFile(name, c); + else + c(null); + } + + function findDoc(ts, doc, name) { + for (var n in ts.docs) { + var cur = ts.docs[n]; + if (cur.doc == doc) return cur; + } + if (!name) for (var i = 0;; ++i) { + n = "[doc" + (i || "") + "]"; + if (!ts.docs[n]) { name = n; break; } + } + return ts.addDoc(name, doc); + } + + function resolveDoc(ts, id) { + if (typeof id == "string") return ts.docs[id]; + if (id instanceof CodeMirror) id = id.getDoc(); + if (id instanceof CodeMirror.Doc) return findDoc(ts, id); + } + + function trackChange(ts, doc, change) { + var data = findDoc(ts, doc); + + var argHints = ts.cachedArgHints; + if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) >= 0) + ts.cachedArgHints = null; + + var changed = data.changed; + if (changed == null) + data.changed = changed = {from: change.from.line, to: change.from.line}; + var end = change.from.line + (change.text.length - 1); + if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end); + if (end >= changed.to) changed.to = end + 1; + if (changed.from > change.from.line) changed.from = change.from.line; + + if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() { + if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data); + }, 200); + } + + function sendDoc(ts, doc) { + ts.server.request({files: [{type: "full", name: doc.name, text: docValue(ts, doc)}]}, function(error) { + if (error) window.console.error(error); + else doc.changed = null; + }); + } + + // Completion + + function hint(ts, cm, c) { + ts.request(cm, {type: "completions", types: true, docs: true, urls: true}, function(error, data) { + if (error) return showError(ts, cm, error); + var completions = [], after = ""; + var from = data.start, to = data.end; + if (cm.getRange(Pos(from.line, from.ch - 2), from) == "[\"" && + cm.getRange(to, Pos(to.line, to.ch + 2)) != "\"]") + after = "\"]"; + + for (var i = 0; i < data.completions.length; ++i) { + var completion = data.completions[i], className = typeToIcon(completion.type); + if (data.guess) className += " " + cls + "guess"; + completions.push({text: completion.name + after, + displayText: completion.displayName || completion.name, + className: className, + data: completion}); + } + + var obj = {from: from, to: to, list: completions}; + var tooltip = null; + CodeMirror.on(obj, "close", function() { remove(tooltip); }); + CodeMirror.on(obj, "update", function() { remove(tooltip); }); + CodeMirror.on(obj, "select", function(cur, node) { + remove(tooltip); + var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc; + if (content) { + tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, + node.getBoundingClientRect().top + window.pageYOffset, content, cm, cls + "hint-doc"); + } + }); + c(obj); + }); + } + + function typeToIcon(type) { + var suffix; + if (type == "?") suffix = "unknown"; + else if (type == "number" || type == "string" || type == "bool") suffix = type; + else if (/^fn\(/.test(type)) suffix = "fn"; + else if (/^\[/.test(type)) suffix = "array"; + else suffix = "object"; + return cls + "completion " + cls + "completion-" + suffix; + } + + // Type queries + + function showContextInfo(ts, cm, pos, queryName, c) { + ts.request(cm, queryName, function(error, data) { + if (error) return showError(ts, cm, error); + if (ts.options.typeTip) { + var tip = ts.options.typeTip(data); + } else { + var tip = elt("span", null, elt("strong", null, data.type || "not found")); + if (data.doc) + tip.appendChild(document.createTextNode(" — " + data.doc)); + if (data.url) { + tip.appendChild(document.createTextNode(" ")); + var child = tip.appendChild(elt("a", null, "[docs]")); + child.href = data.url; + child.target = "_blank"; + } + } + tempTooltip(cm, tip, ts); + if (c) c(); + }, pos); + } + + // Maintaining argument hints + + function updateArgHints(ts, cm) { + closeArgHints(ts); + + if (cm.somethingSelected()) return; + var state = cm.getTokenAt(cm.getCursor()).state; + var inner = CodeMirror.innerMode(cm.getMode(), state); + if (inner.mode.name != "javascript") return; + var lex = inner.state.lexical; + if (lex.info != "call") return; + + var ch, argPos = lex.pos || 0, tabSize = cm.getOption("tabSize"); + for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) { + var str = cm.getLine(line), extra = 0; + for (var pos = 0;;) { + var tab = str.indexOf("\t", pos); + if (tab == -1) break; + extra += tabSize - (tab + extra) % tabSize - 1; + pos = tab + 1; + } + ch = lex.column - extra; + if (str.charAt(ch) == "(") {found = true; break;} + } + if (!found) return; + + var start = Pos(line, ch); + var cache = ts.cachedArgHints; + if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0) + return showArgHints(ts, cm, argPos); + + ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) { + if (error || !data.type || !(/^fn\(/).test(data.type)) return; + ts.cachedArgHints = { + start: start, + type: parseFnType(data.type), + name: data.exprName || data.name || "fn", + guess: data.guess, + doc: cm.getDoc() + }; + showArgHints(ts, cm, argPos); + }); + } + + function showArgHints(ts, cm, pos) { + closeArgHints(ts); + + var cache = ts.cachedArgHints, tp = cache.type; + var tip = elt("span", cache.guess ? cls + "fhint-guess" : null, + elt("span", cls + "fname", cache.name), "("); + for (var i = 0; i < tp.args.length; ++i) { + if (i) tip.appendChild(document.createTextNode(", ")); + var arg = tp.args[i]; + tip.appendChild(elt("span", cls + "farg" + (i == pos ? " " + cls + "farg-current" : ""), arg.name || "?")); + if (arg.type != "?") { + tip.appendChild(document.createTextNode(":\u00a0")); + tip.appendChild(elt("span", cls + "type", arg.type)); + } + } + tip.appendChild(document.createTextNode(tp.rettype ? ") ->\u00a0" : ")")); + if (tp.rettype) tip.appendChild(elt("span", cls + "type", tp.rettype)); + var place = cm.cursorCoords(null, "page"); + var tooltip = ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip, cm) + setTimeout(function() { + tooltip.clear = onEditorActivity(cm, function() { + if (ts.activeArgHints == tooltip) closeArgHints(ts) }) + }, 20) + } + + function parseFnType(text) { + var args = [], pos = 3; + + function skipMatching(upto) { + var depth = 0, start = pos; + for (;;) { + var next = text.charAt(pos); + if (upto.test(next) && !depth) return text.slice(start, pos); + if (/[{\[\(]/.test(next)) ++depth; + else if (/[}\]\)]/.test(next)) --depth; + ++pos; + } + } + + // Parse arguments + if (text.charAt(pos) != ")") for (;;) { + var name = text.slice(pos).match(/^([^, \(\[\{]+): /); + if (name) { + pos += name[0].length; + name = name[1]; + } + args.push({name: name, type: skipMatching(/[\),]/)}); + if (text.charAt(pos) == ")") break; + pos += 2; + } + + var rettype = text.slice(pos).match(/^\) -> (.*)$/); + + return {args: args, rettype: rettype && rettype[1]}; + } + + // Moving to the definition of something + + function jumpToDef(ts, cm) { + function inner(varName) { + var req = {type: "definition", variable: varName || null}; + var doc = findDoc(ts, cm.getDoc()); + ts.server.request(buildRequest(ts, doc, req), function(error, data) { + if (error) return showError(ts, cm, error); + if (!data.file && data.url) { window.open(data.url); return; } + + if (data.file) { + var localDoc = ts.docs[data.file], found; + if (localDoc && (found = findContext(localDoc.doc, data))) { + ts.jumpStack.push({file: doc.name, + start: cm.getCursor("from"), + end: cm.getCursor("to")}); + moveTo(ts, doc, localDoc, found.start, found.end); + return; + } + } + showError(ts, cm, "Could not find a definition."); + }); + } + + if (!atInterestingExpression(cm)) + dialog(cm, "Jump to variable", function(name) { if (name) inner(name); }); + else + inner(); + } + + function jumpBack(ts, cm) { + var pos = ts.jumpStack.pop(), doc = pos && ts.docs[pos.file]; + if (!doc) return; + moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end); + } + + function moveTo(ts, curDoc, doc, start, end) { + doc.doc.setSelection(start, end); + if (curDoc != doc && ts.options.switchToDoc) { + closeArgHints(ts); + ts.options.switchToDoc(doc.name, doc.doc); + } + } + + // The {line,ch} representation of positions makes this rather awkward. + function findContext(doc, data) { + var before = data.context.slice(0, data.contextOffset).split("\n"); + var startLine = data.start.line - (before.length - 1); + var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length); + + var text = doc.getLine(startLine).slice(start.ch); + for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur) + text += "\n" + doc.getLine(cur); + if (text.slice(0, data.context.length) == data.context) return data; + + var cursor = doc.getSearchCursor(data.context, 0, false); + var nearest, nearestDist = Infinity; + while (cursor.findNext()) { + var from = cursor.from(), dist = Math.abs(from.line - start.line) * 10000; + if (!dist) dist = Math.abs(from.ch - start.ch); + if (dist < nearestDist) { nearest = from; nearestDist = dist; } + } + if (!nearest) return null; + + if (before.length == 1) + nearest.ch += before[0].length; + else + nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length); + if (data.start.line == data.end.line) + var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch)); + else + var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch); + return {start: nearest, end: end}; + } + + function atInterestingExpression(cm) { + var pos = cm.getCursor("end"), tok = cm.getTokenAt(pos); + if (tok.start < pos.ch && tok.type == "comment") return false; + return /[\w)\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1)); + } + + // Variable renaming + + function rename(ts, cm) { + var token = cm.getTokenAt(cm.getCursor()); + if (!/\w/.test(token.string)) return showError(ts, cm, "Not at a variable"); + dialog(cm, "New name for " + token.string, function(newName) { + ts.request(cm, {type: "rename", newName: newName, fullDocs: true}, function(error, data) { + if (error) return showError(ts, cm, error); + applyChanges(ts, data.changes); + }); + }); + } + + function selectName(ts, cm) { + var name = findDoc(ts, cm.doc).name; + ts.request(cm, {type: "refs"}, function(error, data) { + if (error) return showError(ts, cm, error); + var ranges = [], cur = 0; + var curPos = cm.getCursor(); + for (var i = 0; i < data.refs.length; i++) { + var ref = data.refs[i]; + if (ref.file == name) { + ranges.push({anchor: ref.start, head: ref.end}); + if (cmpPos(curPos, ref.start) >= 0 && cmpPos(curPos, ref.end) <= 0) + cur = ranges.length - 1; + } + } + cm.setSelections(ranges, cur); + }); + } + + var nextChangeOrig = 0; + function applyChanges(ts, changes) { + var perFile = Object.create(null); + for (var i = 0; i < changes.length; ++i) { + var ch = changes[i]; + (perFile[ch.file] || (perFile[ch.file] = [])).push(ch); + } + for (var file in perFile) { + var known = ts.docs[file], chs = perFile[file];; + if (!known) continue; + chs.sort(function(a, b) { return cmpPos(b.start, a.start); }); + var origin = "*rename" + (++nextChangeOrig); + for (var i = 0; i < chs.length; ++i) { + var ch = chs[i]; + known.doc.replaceRange(ch.text, ch.start, ch.end, origin); + } + } + } + + // Generic request-building helper + + function buildRequest(ts, doc, query, pos) { + var files = [], offsetLines = 0, allowFragments = !query.fullDocs; + if (!allowFragments) delete query.fullDocs; + if (typeof query == "string") query = {type: query}; + query.lineCharPositions = true; + if (query.end == null) { + query.end = pos || doc.doc.getCursor("end"); + if (doc.doc.somethingSelected()) + query.start = doc.doc.getCursor("start"); + } + var startPos = query.start || query.end; + + if (doc.changed) { + if (doc.doc.lineCount() > bigDoc && allowFragments !== false && + doc.changed.to - doc.changed.from < 100 && + doc.changed.from <= startPos.line && doc.changed.to > query.end.line) { + files.push(getFragmentAround(doc, startPos, query.end)); + query.file = "#0"; + var offsetLines = files[0].offsetLines; + if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch); + query.end = Pos(query.end.line - offsetLines, query.end.ch); + } else { + files.push({type: "full", + name: doc.name, + text: docValue(ts, doc)}); + query.file = doc.name; + doc.changed = null; + } + } else { + query.file = doc.name; + } + for (var name in ts.docs) { + var cur = ts.docs[name]; + if (cur.changed && cur != doc) { + files.push({type: "full", name: cur.name, text: docValue(ts, cur)}); + cur.changed = null; + } + } + + return {query: query, files: files}; + } + + function getFragmentAround(data, start, end) { + var doc = data.doc; + var minIndent = null, minLine = null, endLine, tabSize = 4; + for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) { + var line = doc.getLine(p), fn = line.search(/\bfunction\b/); + if (fn < 0) continue; + var indent = CodeMirror.countColumn(line, null, tabSize); + if (minIndent != null && minIndent <= indent) continue; + minIndent = indent; + minLine = p; + } + if (minLine == null) minLine = min; + var max = Math.min(doc.lastLine(), end.line + 20); + if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize)) + endLine = max; + else for (endLine = end.line + 1; endLine < max; ++endLine) { + var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize); + if (indent <= minIndent) break; + } + var from = Pos(minLine, 0); + + return {type: "part", + name: data.name, + offsetLines: from.line, + text: doc.getRange(from, Pos(endLine, end.line == endLine ? null : 0))}; + } + + // Generic utilities + + var cmpPos = CodeMirror.cmpPos; + + function elt(tagname, cls /*, ... elts*/) { + var e = document.createElement(tagname); + if (cls) e.className = cls; + for (var i = 2; i < arguments.length; ++i) { + var elt = arguments[i]; + if (typeof elt == "string") elt = document.createTextNode(elt); + e.appendChild(elt); + } + return e; + } + + function dialog(cm, text, f) { + if (cm.openDialog) + cm.openDialog(text + ": ", f); + else + f(prompt(text, "")); + } + + // Tooltips + + function tempTooltip(cm, content, ts) { + if (cm.state.ternTooltip) remove(cm.state.ternTooltip); + var where = cm.cursorCoords(); + var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content, cm); + function maybeClear() { + old = true; + if (!mouseOnTip) clear(); + } + function clear() { + cm.state.ternTooltip = null; + if (tip.parentNode) fadeOut(tip) + clearActivity() + } + var mouseOnTip = false, old = false; + CodeMirror.on(tip, "mousemove", function() { mouseOnTip = true; }); + CodeMirror.on(tip, "mouseout", function(e) { + var related = e.relatedTarget || e.toElement + if (!related || !CodeMirror.contains(tip, related)) { + if (old) clear(); + else mouseOnTip = false; + } + }); + setTimeout(maybeClear, ts.options.hintDelay ? ts.options.hintDelay : 1700); + var clearActivity = onEditorActivity(cm, clear) + } + + function onEditorActivity(cm, f) { + cm.on("cursorActivity", f) + cm.on("blur", f) + cm.on("scroll", f) + cm.on("setDoc", f) + return function() { + cm.off("cursorActivity", f) + cm.off("blur", f) + cm.off("scroll", f) + cm.off("setDoc", f) + } + } + + function makeTooltip(x, y, content, cm, className) { + var node = elt("div", cls + "tooltip" + " " + (className || ""), content); + node.style.left = x + "px"; + node.style.top = y + "px"; + var container = ((cm.options || {}).hintOptions || {}).container || document.body; + container.appendChild(node); + + var pos = cm.cursorCoords(); + var winW = window.innerWidth; + var winH = window.innerHeight; + var box = node.getBoundingClientRect(); + var hints = document.querySelector(".CodeMirror-hints"); + var overlapY = box.bottom - winH; + var overlapX = box.right - winW; + + if (hints && overlapX > 0) { + node.style.left = 0; + var box = node.getBoundingClientRect(); + node.style.left = (x = x - hints.offsetWidth - box.width) + "px"; + overlapX = box.right - winW; + } + if (overlapY > 0) { + var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); + if (curTop - height > 0) { // Fits above cursor + node.style.top = (pos.top - height) + "px"; + } else if (height > winH) { + node.style.height = (winH - 5) + "px"; + node.style.top = (pos.bottom - box.top) + "px"; + } + } + if (overlapX > 0) { + if (box.right - box.left > winW) { + node.style.width = (winW - 5) + "px"; + overlapX -= (box.right - box.left) - winW; + } + node.style.left = (x - overlapX) + "px"; + } + + return node; + } + + function remove(node) { + var p = node && node.parentNode; + if (p) p.removeChild(node); + } + + function fadeOut(tooltip) { + tooltip.style.opacity = "0"; + setTimeout(function() { remove(tooltip); }, 1100); + } + + function showError(ts, cm, msg) { + if (ts.options.showError) + ts.options.showError(cm, msg); + else + tempTooltip(cm, String(msg), ts); + } + + function closeArgHints(ts) { + if (ts.activeArgHints) { + if (ts.activeArgHints.clear) ts.activeArgHints.clear() + remove(ts.activeArgHints) + ts.activeArgHints = null + } + } + + function docValue(ts, doc) { + var val = doc.doc.getValue(); + if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc); + return val; + } + + // Worker wrapper + + function WorkerServer(ts) { + var worker = ts.worker = new Worker(ts.options.workerScript); + worker.postMessage({type: "init", + defs: ts.options.defs, + plugins: ts.options.plugins, + scripts: ts.options.workerDeps}); + var msgId = 0, pending = {}; + + function send(data, c) { + if (c) { + data.id = ++msgId; + pending[msgId] = c; + } + worker.postMessage(data); + } + worker.onmessage = function(e) { + var data = e.data; + if (data.type == "getFile") { + getFile(ts, data.name, function(err, text) { + send({type: "getFile", err: String(err), text: text, id: data.id}); + }); + } else if (data.type == "debug") { + window.console.log(data.message); + } else if (data.id && pending[data.id]) { + pending[data.id](data.err, data.body); + delete pending[data.id]; + } + }; + worker.onerror = function(e) { + for (var id in pending) pending[id](e); + pending = {}; + }; + + this.addFile = function(name, text) { send({type: "add", name: name, text: text}); }; + this.delFile = function(name) { send({type: "del", name: name}); }; + this.request = function(body, c) { send({type: "req", body: body}, c); }; + } +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/worker.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/worker.js new file mode 100644 index 0000000000..e134ad47d6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/tern/worker.js @@ -0,0 +1,44 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// declare global: tern, server + +var server; + +this.onmessage = function(e) { + var data = e.data; + switch (data.type) { + case "init": return startServer(data.defs, data.plugins, data.scripts); + case "add": return server.addFile(data.name, data.text); + case "del": return server.delFile(data.name); + case "req": return server.request(data.body, function(err, reqData) { + postMessage({id: data.id, body: reqData, err: err && String(err)}); + }); + case "getFile": + var c = pending[data.id]; + delete pending[data.id]; + return c(data.err, data.text); + default: throw new Error("Unknown message type: " + data.type); + } +}; + +var nextId = 0, pending = {}; +function getFile(file, c) { + postMessage({type: "getFile", name: file, id: ++nextId}); + pending[nextId] = c; +} + +function startServer(defs, plugins, scripts) { + if (scripts) importScripts.apply(null, scripts); + + server = new tern.Server({ + getFile: getFile, + async: true, + defs: defs, + plugins: plugins + }); +} + +this.console = { + log: function(v) { postMessage({type: "debug", message: v}); } +}; diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/wrap/hardwrap.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/wrap/hardwrap.js new file mode 100644 index 0000000000..516368c80d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/addon/wrap/hardwrap.js @@ -0,0 +1,160 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var Pos = CodeMirror.Pos; + + function findParagraph(cm, pos, options) { + var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart"); + for (var start = pos.line, first = cm.firstLine(); start > first; --start) { + var line = cm.getLine(start); + if (startRE && startRE.test(line)) break; + if (!/\S/.test(line)) { ++start; break; } + } + var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd"); + for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) { + var line = cm.getLine(end); + if (endRE && endRE.test(line)) { ++end; break; } + if (!/\S/.test(line)) break; + } + return {from: start, to: end}; + } + + function findBreakPoint(text, column, wrapOn, killTrailingSpace, forceBreak) { + var at = column + while (at < text.length && text.charAt(at) == " ") at++ + for (; at > 0; --at) + if (wrapOn.test(text.slice(at - 1, at + 1))) break; + + if (!forceBreak && at <= text.match(/^[ \t]*/)[0].length) { + // didn't find a break point before column, in non-forceBreak mode try to + // find one after 'column'. + for (at = column + 1; at < text.length - 1; ++at) { + if (wrapOn.test(text.slice(at - 1, at + 1))) break; + } + } + + for (var first = true;; first = false) { + var endOfText = at; + if (killTrailingSpace) + while (text.charAt(endOfText - 1) == " ") --endOfText; + if (endOfText == 0 && first) at = column; + else return {from: endOfText, to: at}; + } + } + + function wrapRange(cm, from, to, options) { + from = cm.clipPos(from); to = cm.clipPos(to); + var column = options.column || 80; + var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/; + var forceBreak = options.forceBreak !== false; + var killTrailing = options.killTrailingSpace !== false; + var changes = [], curLine = "", curNo = from.line; + var lines = cm.getRange(from, to, false); + if (!lines.length) return null; + var leadingSpace = lines[0].match(/^[ \t]*/)[0]; + if (leadingSpace.length >= column) column = leadingSpace.length + 1 + + for (var i = 0; i < lines.length; ++i) { + var text = lines[i], oldLen = curLine.length, spaceInserted = 0; + if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) { + curLine += " "; + spaceInserted = 1; + } + var spaceTrimmed = ""; + if (i) { + spaceTrimmed = text.match(/^\s*/)[0]; + text = text.slice(spaceTrimmed.length); + } + curLine += text; + if (i) { + var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed && + findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak); + // If this isn't broken, or is broken at a different point, remove old break + if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) { + changes.push({text: [spaceInserted ? " " : ""], + from: Pos(curNo, oldLen), + to: Pos(curNo + 1, spaceTrimmed.length)}); + } else { + curLine = leadingSpace + text; + ++curNo; + } + } + while (curLine.length > column) { + var bp = findBreakPoint(curLine, column, wrapOn, killTrailing, forceBreak); + if (bp.from != bp.to || + forceBreak && leadingSpace !== curLine.slice(0, bp.to)) { + changes.push({text: ["", leadingSpace], + from: Pos(curNo, bp.from), + to: Pos(curNo, bp.to)}); + curLine = leadingSpace + curLine.slice(bp.to); + ++curNo; + } else { + break; + } + } + } + if (changes.length) cm.operation(function() { + for (var i = 0; i < changes.length; ++i) { + var change = changes[i]; + if (change.text || CodeMirror.cmpPos(change.from, change.to)) + cm.replaceRange(change.text, change.from, change.to); + } + }); + return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null; + } + + CodeMirror.defineExtension("wrapParagraph", function(pos, options) { + options = options || {}; + if (!pos) pos = this.getCursor(); + var para = findParagraph(this, pos, options); + return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options); + }); + + CodeMirror.commands.wrapLines = function(cm) { + cm.operation(function() { + var ranges = cm.listSelections(), at = cm.lastLine() + 1; + for (var i = ranges.length - 1; i >= 0; i--) { + var range = ranges[i], span; + if (range.empty()) { + var para = findParagraph(cm, range.head, {}); + span = {from: Pos(para.from, 0), to: Pos(para.to - 1)}; + } else { + span = {from: range.from(), to: range.to()}; + } + if (span.to.line >= at) continue; + at = span.from.line; + wrapRange(cm, span.from, span.to, {}); + } + }); + }; + + CodeMirror.defineExtension("wrapRange", function(from, to, options) { + return wrapRange(this, from, to, options || {}); + }); + + CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) { + options = options || {}; + var cm = this, paras = []; + for (var line = from.line; line <= to.line;) { + var para = findParagraph(cm, Pos(line, 0), options); + paras.push(para); + line = para.to; + } + var madeChange = false; + if (paras.length) cm.operation(function() { + for (var i = paras.length - 1; i >= 0; --i) + madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options); + }); + return madeChange; + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.css new file mode 100644 index 0000000000..f4d5718a78 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.css @@ -0,0 +1,344 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} +.cm-fat-cursor .CodeMirror-line::selection, +.cm-fat-cursor .CodeMirror-line > span::selection, +.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; } +.cm-fat-cursor .CodeMirror-line::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; } +.cm-fat-cursor { caret-color: transparent; } +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: 0; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 50px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -50px; margin-right: -50px; + padding-bottom: 50px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; + z-index: 0; +} +.CodeMirror-sizer { + position: relative; + border-right: 50px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; + outline: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -50px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre.CodeMirror-line, +.CodeMirror-wrap pre.CodeMirror-line-like { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.js new file mode 100644 index 0000000000..e142f1dbd0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/codemirror.js @@ -0,0 +1,9849 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// This is CodeMirror (https://codemirror.net), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.CodeMirror = factory()); +}(this, (function () { 'use strict'; + + // Kludges for bugs and behavior differences that can't be feature + // detected are enabled based on userAgent etc sniffing. + var userAgent = navigator.userAgent; + var platform = navigator.platform; + + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\//.test(userAgent); + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + + var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); + var android = /Android/.test(userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { presto_version = Number(presto_version[1]); } + if (presto_version && presto_version >= 15) { presto = false; webkit = true; } + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || (ie && ie_version >= 9); + + function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + + var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) + } + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { e.className = className; } + if (style) { e.style.cssText = style; } + if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } + else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } + return e + } + // wrapper for elt, which removes the elt from the accessibility tree + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e + } + + var range; + if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r + }; } + else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r + }; } + + function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) + } + + function activeElt() { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = document.activeElement; + } catch(e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement + } + + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b + } + + var selectInput = function(node) { node.select(); }; + if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } + else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} + } + + function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } + } + + var Delayed = function() { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function (self) { + self.id = 0; + if (self.time <= +new Date) { + self.f(); + } else { + setTimeout(self.handler, self.time - +new Date); + } + }; + Delayed.prototype.set = function (ms, f) { + this.f = f; + var time = +new Date + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + + function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 + } + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerGap = 50; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = {toString: function(){return "CodeMirror.Pass"}}; + + // Reused option objects for setSelection & friends + var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; + + // The inverse of countColumn -- find the offset that corresponds to + // a particular column. + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } + } + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] + } + + function lst(arr) { return arr[arr.length-1] } + + function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out + } + + function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); + } + + function nothing() {} + + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst + } + + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + } + function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) + } + + function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true + } + + // Extending unicode characters. A series of a non-extending char + + // any number of extending chars is treated as a single unit as far + // as editing and measuring is concerned. This is not fully correct, + // since some scripts/fonts/browsers also treat other configurations + // of code points as a group. + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + + // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos + } + + // Returns the value from the range [`from`; `to`] that satisfies + // `pred` and is closest to `from`. Assumes that at least `to` + // satisfies `pred`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { return from } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { return pred(mid) ? from : to } + if (pred(mid)) { to = mid; } + else { from = mid + dir; } + } + } + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr", 0) } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } + } + + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + + return direction == "rtl" ? order.reverse() : order + } + })(); + + // Get the bidi ordering for the given line (and cache it). Returns + // false for lines that are fully left-to-right, and an array of + // BidiSpan objects otherwise. + function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order + } + + // EVENT HANDLING + + // Lightweight event framework. on/off also work on DOM nodes, + // registering native DOM handlers. + + var noHandlers = []; + + var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map = emitter._handlers || (emitter._handlers = {}); + map[type] = (map[type] || noHandlers).concat(f); + } + }; + + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map = emitter._handlers, arr = map && map[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } + } + + function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } + } + + // The DOM events that CodeMirror handles can be overridden by + // registering a (non-DOM) handler on the editor for the event name, + // and preventDefault-ing the event in that handler. + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore + } + + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } + } + + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 + } + + // Add on and off methods to a constructor's prototype, to make + // registering events on such objects more convenient. + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; + } + + // Due to the fact that we still support jurassic IE versions, some + // compatibility wrappers are needed. + + function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + + function e_target(e) {return e.target || e.srcElement} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b + } + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div + }(); + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node + } + + // Feature-detect IE's crummy client rect reporting for bidi text + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result + } : function (string) { return string.split(/\r\n?|\n/); }; + + var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } + } : function (te) { + var range; + try {range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) { return false } + return range.compareEndPoints("StartToEnd", range) != 0 + }; + + var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" + })(); + + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 + } + + // Known modes, by name and by MIME + var modes = {}, mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; + } + + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + } + + function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} + } + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true + } + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + + StringStream.prototype.eol = function () {return this.pos >= this.string.length}; + StringStream.prototype.sol = function () {return this.pos == this.lineStart}; + StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } + return this.pos > start + }; + StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} + }; + StringStream.prototype.backUp = function (n) {this.pos -= n;}; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } + }; + StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + // Find the line object corresponding to the given line number. + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] + } + + // Get the part of a document between two positions, as an array of + // strings. + function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out + } + // Get the lines between from and to, as array of strings. + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out + } + + // Update the height of a line, propagating the height change + // upwards to parent nodes. + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } + } + + // Given a line object, find its line number by walking up through + // its parent links. + function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first + } + + // Find the line at the given vertical position, using the height + // information in the document tree. + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); + } + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i + } + + function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) + } + + // A Pos instance represents a position within the text. + function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + + // Compare two positions, return 0 if they are the same, a negative + // number when a is less, and a positive number otherwise. + function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + + function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + + function copyPos(x) {return Pos(x.line, x.ch)} + function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } + function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + + // Most of the external API clips given positions to make sure they + // actually exist within the document. + function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} + function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } + } + function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out + } + + var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + + var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line + }; + + Context.prototype.baseToken = function (n) { + if (!this.baseTokens) { return null } + while (this.baseTokens[this.baseTokenPos] <= n) + { this.baseTokenPos += 2; } + var type = this.baseTokens[this.baseTokenPos + 1]; + return {type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n} + }; + + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } + }; + + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } + }; + + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state + }; + + + // Compute a style array (an array starting with a mode generation + // -- for invalidation -- followed by pairs of end positions and + // style strings), which is used to highlight the tokens on the + // line. + function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + context.baseTokens = st; + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} + } + + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles + } + + function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. Used for lines that + // aren't currently visible. + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + + function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } + } + + function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") + } + + var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + + // Utility for getTokenAt and getLineTokens + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) + } + + function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type + } + + // Run the given mode's parser over a line, calling f for each token. + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline + } + + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + + // Optimize some code when these features are not used. + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + + // TEXTMARKER SPANS + + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; + } + + // Search an array of spans for a span matching the given marker. + function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } + } + + // Remove a span from an array, returning undefined if no spans are + // left (we don't store arrays for lines without spans). + function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r + } + + // Add a span to a line. + function addMarkedSpan(line, span, op) { + var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet)); + if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { + line.markedSpans.push(span); + } else { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + if (inThisOp) { inThisOp.add(line.markedSpans); } + } + span.marker.attachLine(line); + } + + // Used for the algorithm that adjusts markers for a change in the + // document. These functions cut an array of spans at a given + // character position, returning an array of remaining chunks (or + // undefined if nothing remains). + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw + } + + // Given a change object, compute the new set of marker spans that + // cover the line in which the change took place. Removes spans + // entirely within the change, reconnects spans belonging to the + // same marker that appear on both sides of the change, and cuts off + // spans partially within the change. Returns an array of span + // arrays with one element for each line in (after) the change. + function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers + } + + // Remove spans that are empty and don't have a clearWhenEmpty + // option of false. + function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans + } + + // Used to 'clip' out readOnly ranges when making a change. + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts + } + + // Connect or disconnect spans from a line. + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; + } + + // Helpers used when computing which overlapping collapsed span + // counts as the larger one. + function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } + function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + + // Returns a number indicating which of two overlapping collapsed + // spans is larger (and thus includes the other). Falls back to + // comparing ids when the spans cover exactly the same range. + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id + } + + // Find out whether a line ends or starts in a collapsed span. If + // so, return the marker for that span. + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } + } } + return found + } + function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } + function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } + } } + return found + } + + // Test whether there exists a collapsed span that partially + // overlaps (covers the start or end, but not both) of a new span. + // Such overlap is not allowed. + function conflictingCollapsedRange(doc, lineNo, from, to, marker) { + var line = getLine(doc, lineNo); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } + } + + // A visual line is a line as drawn on the screen. Folding, for + // example, can cause multiple logical lines to appear on the same + // visual line. This finds the start of the visual line that the + // given line is part of (usually that is the line itself). + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line + } + + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line + } + + // Returns an array of logical lines that continue the visual line + // started by the argument, or undefined if there are no such lines. + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines + } + + // Get the line number of the start of the visual line that the + // given line number is part of. + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) + } + + // Get the line number of the start of the next visual line after + // the given line. + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 + } + + // Compute whether a line is hidden. Lines count as hidden when they + // are part of a visual line that starts with another line, or when + // they are entirely covered by collapsed, non-widget span. + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } + } + + // Find the height above the given line. + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h + } + + // Compute the character length of a line, taking into account + // collapsed ranges (see markText) that might hide parts, and join + // other lines onto it. + function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len + } + + // Find the longest line in the document. + function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + + Line.prototype.lineNo = function () { return lineNo(this) }; + eventMixin(Line); + + // Change the content (text, markers) of a line. Automatically + // invalidates cached information and tries to re-estimate the + // line's height. + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + } + + // Detach a line from the document tree and its markers. + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Convert a style as returned by a mode (either null, or a string + // containing one or more styles) to a CSS style. This is cached, + // and also looks for line-wide styles. + var styleToClassCache = {}, styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) + } + + // Render the DOM representation of the text of a line. Also builds + // up a 'line map', which points at the DOM nodes that represent + // specific stretches of text, and is used by the measuring code. + // The returned object contains the DOM node, this map, and + // information about line-wide styles that were set by the mode. + function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder + } + + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token + } + + // Build up the DOM representation for a single token, and add it to + // the line map. Takes care to render special characters separately. + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css || attributes) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") + { token.setAttribute(attr, attributes[attr]); } } + } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result + } + + // Work around nonsense dimensions being reported for stretches of + // right-to-left text. + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } + } + + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { (attributes || (attributes = {})).title = m.title; } + if (m.attributes) { + for (var attr in m.attributes) + { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } + } + + + // These objects are used to represent the visible (currently drawn) + // part of the document. A LineView may correspond to multiple + // logical lines, if those are connected by collapsed ranges. + function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + + // Create a range of LineView objects for the given lines. + function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array + } + + var operationGroup = null; + + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + + function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) + } + + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } + } + + var orphanDelayedCallbacks = null; + + // Often, we want to signal events at a point where we are in the + // middle of some work, but don't want the handler to start calling + // other methods on the editor, which might be in an inconsistent + // state or simply not expect any other events to happen. + // signalLater looks whether there are any handlers, and schedules + // them to be executed when the last operation ends, or, if no + // operation is active, when a timeout fires. + function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); + } + + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } + } + + // When an aspect of a line changes, a string is added to + // lineView.changes. This updates the relevant part of the line's + // DOM structure. + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; + } + + // Lines with gutter elements, widgets or a background class need to + // be wrapped, and have the extra elements added to the wrapper div + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node + } + + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + + // Wrapper around buildLineContent which will reuse the structure + // in display.externalMeasured when possible. + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) + } + + // Redraw the line's text. Interacts with the background and text + // classes because the mode may output tokens that influence these + // classes. + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + gutterWrap.setAttribute("aria-hidden", "true"); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } + } + + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); + } + + // Build a line's DOM representation from scratch + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node + } + + // A lineView may contain multiple logical lines (when merged by + // collapsed spans). The widgets for all of them need to be drawn. + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } + } + + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } + } + + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } + } + + function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight + } + + // Return true when the given mouse event happened in a widget + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop} + function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} + function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data + } + + function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight + } + + // Ensure the lineView.wrapping.heights array is populated. This is + // an array of bottom offsets for the lines that make up a drawn + // line. When lineWrapping is on, there might be more than one + // height. + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } + } + + // Find a line map (mapping character offsets to text nodes) and a + // measurement cache for the given line number. (A line view might + // contain multiple lines when collapsed ranges are present.) + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + if (lineView.rest) { + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } + } + } + + // Render a line into the hidden node display.externalMeasured. Used + // when measurement is needed for a line that's not in the viewport. + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view + } + + // Get a {top, bottom, left, right} box (in line-local coordinates) + // for a given character. + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) + } + + // Find a line view that corresponds to the given line number. + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } + } + + // Measurement can be split in two steps, the set-up work that + // applies to the whole line, and the measurement of the actual + // character. Functions like coordsChar, that need to do a lot of + // measurements in a row, can thus ensure that the set-up work is + // only done once. + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } + } + + // Given a prepared measurement object, measures the position of an + // actual character (or fetches it from the cache). + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} + } + + var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + + function nodeAndOffsetInLineMap(map, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map.length; i += 3) { + mStart = map[i]; + mEnd = map[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { + node = map[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { + node = map[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} + } + + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect + } + + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result + } + + // Work around problem with bounding client rects on ranges being + // returned incorrectly when zoomed on IE10 and below. + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} + } + + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } + } + + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } + } + + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; + } + + function pageScrollX() { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft + } + function pageScrollY() { + if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } + return window.pageYOffset || (document.documentElement || document.body).scrollTop + } + + function widgetTopHeight(lineObj) { + var ref = visualLine(lineObj); + var widgets = ref.widgets; + var height = 0; + if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above) + { height += widgetHeight(widgets[i]); } } } + return height + } + + // Converts a {top, bottom, left, right} box from line-local + // coordinates into another coordinate system. Context may be one of + // "line", "div" (display.lineDiv), "local"./null (editor), "window", + // or "page". + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; rect.bottom += height; + } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect + } + + // Coverts a box from "div" coords to another coordinate system. + // Context may be "window", "page", "div", or "local"./null. + function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} + } + + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) + } + + // Returns a box for a given cursor position, which may have an + // 'other' property containing the position of the secondary cursor + // on a bidi boundary. + // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` + // and after `char - 1` in writing order of `char - 1` + // A cursor Pos(line, char, "after") is on the same visual line as `char` + // and before `char` in writing order of `char` + // Examples (upper-case letters are RTL, lower-case are LTR): + // Pos(0, 1, ...) + // before after + // ab a|b a|b + // aB a|B aB| + // Ab |Ab A|b + // AB B|A B|A + // Every position after the last character on a line is considered to stick + // to the last character on the line. + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = part.level == 1; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val + } + + // Used to cheaply estimate the coordinates for a position. Used for + // intermediate scroll updates. + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} + } + + // Positions returned by coordsChar contain some extra information. + // xRel is the relative x position of the input coordinates compared + // to the found position (so xRel > 0 means the coordinates are to + // the right of the character position, for example). When outside + // is true, that means the coordinates lie outside the line's + // vertical range. + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = outside; } + return pos + } + + // Compute the character position closest to the given coordinates. + // Input must be lineSpace-local ("div" coordinate system). + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { return found } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { return rangeEnd } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); + return {begin: begin, end: end} + } + + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) + (cm, lineObj, lineNo, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight; box.bottom += widgetHeight; + if (!boxIsAfter(box, x, y, false)) { return false } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true + }, begin, end); + + var baseX, sticky, outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { ch++; } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : + (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ? + "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo, ch, sticky, outside, x - baseX) + } + + function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"), + "line", lineObj, preparedMeasure), x, y, true) + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) + { part = order[index - 1]; } + } + return part + } + + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } + var part = null, closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { continue } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { part = order[order.length - 1]; } + // Clip the part to the wrapped line. + if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } + if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } + return part + } + + var measureText; + // Compute the default text height. + function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 + } + + // Compute the default character width. + function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 + } + + // Do a bulk-read of the DOM positions and sizes needed to draw the + // view, so that we don't interleave reading and writing to the DOM. + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + var id = cm.display.gutterSpecs[i].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} + } + + // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, + // but using getBoundingClientRect to get a sub-pixel-accurate + // result. + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left + } + + // Returns a function that estimates the height of a line, to use as + // first approximation until the line becomes visible (and is thus + // properly measurable). + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } + } + + function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); + } + + // Given a mouse event, find the corresponding position. If liberal + // is false, it checks whether a gutter or scrollbar was clicked, + // and returns null if it was. forRect is used by rectangular + // selections, and tries to estimate a character position even for + // coordinates beyond the right of the text. + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e$1) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords + } + + // Find the view element corresponding to a given line. Return null + // when the line isn't visible. + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } + } + + // Updates the display.view data structure for a given change to the + // document. From and to are in pre-change coordinates. Lendiff is + // the amount of lines added or subtracted by the change. This is + // used for changes that span multiple lines, or change the way + // lines are divided into visual lines. regLineChange (below) + // registers single-line changes. + function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } + } + + // Register a change to a single line. Type must be one of "text", + // "gutter", "class", "widget" + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } + } + + // Clear the view. + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} + } + + // Force the view to cover a given range, adding empty view element + // or clipping off existing ones as needed. + function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; + } + + // Count the number of lines in the view whose DOM representation is + // out of date (or nonexistent). + function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty + } + + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + + function prepareSelection(cm, primary) { + if ( primary === void 0 ) primary = true; + + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + var customCursor = cm.options.$customCursor; + if (customCursor) { primary = true; } + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (!primary && i == doc.sel.primIndex) { continue } + var range = doc.sel.ranges[i]; + if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue } + var collapsed = range.empty(); + if (customCursor) { + var head = customCursor(cm, range); + if (head) { drawSelectionCursor(cm, head, curFragment); } + } else if (collapsed || cm.options.showCursorWhenSelecting) { + drawSelectionCursor(cm, range.head, curFragment); + } + if (!collapsed) + { drawSelectionRange(cm, range, selFragment); } + } + return result + } + + // Draws a cursor for the given range + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { + var charPos = charCoords(cm, head, "div", null, null); + var width = charPos.right - charPos.left; + cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; + } + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } + } + + function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } + + // Draws the given range as a highlighted selection + function drawSelectionRange(cm, range, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop] + } + + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i == 0, last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + + if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } + if (cmpCoords(toPos, start) < 0) { start = toPos; } + if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } + if (cmpCoords(toPos, end) < 0) { end = toPos; } + }); + return {start: start, end: end} + } + + var sFrom = range.from(), sTo = range.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); + } + + // Cursor-blinking + function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { + if (!cm.hasFocus()) { onBlur(cm); } + display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } + } + + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { onFocus(cm); } + } + } + + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { onBlur(cm); } + } }, 100); + } + + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); + } + + // Read the actual heights of the rendered lines, and update their + // stored heights to match. + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); + var oldHeight = display.lineDiv.getBoundingClientRect().top; + var mustScroll = 0; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], wrapping = cm.options.lineWrapping; + var height = (void 0), width = 0; + if (cur.hidden) { continue } + oldHeight += cur.line.height; + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) + { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } + } + var diff = cur.line.height - height; + if (diff > .005 || diff < -.005) { + if (oldHeight < viewTop) { mustScroll -= diff; } + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; } + } + + // Read and store the height of line widgets associated with the + // given line. + function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i], parent = w.node.parentNode; + if (parent) { w.height = parent.offsetHeight; } + } } + } + + // Compute the lines that are visible in a given viewport (defaults + // the the current scroll position). viewport may contain top, + // height, and ensure (see op.scrollToPos) properties. + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} + } + + // SCROLLING THINGS INTO VIEW + + // If an editor sits on the top or bottom of the window, partially + // scrolled out of view, this ensures that the cursor is visible. + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + + // Scroll a given position into view (immediately), verifying that + // it actually became visible (as line heights are accurately + // measured, the position of something may 'drift' during drawing). + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect + } + + // Scroll a given set of coordinates into view (immediately). + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } + } + + // Calculate a new scroll position needed to scroll the given + // rectangle into view. Returns an object with scrollTop and + // scrollLeft properties. When these are undefined, the + // vertical/horizontal position does not need to be adjusted. + function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result + } + + // Store a relative adjustment to the scroll position in the current + // operation (to be applied when the operation finishes). + function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + + // Make sure that at the end of the operation the current cursor is + // shown. + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; + } + + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } + } + + function scrollToRange(cm, range) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range; + } + + // When an operation has its scrollToPos property set, and another + // scroll action is applied before the end of the operation, this + // 'simulates' scrolling that position into view in a cheap way, so + // that the effect of intermediate scroll commands is not ignored. + function resolveScrollToPos(cm) { + var range = cm.curOp.scrollToPos; + if (range) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); + scrollToCoordsRange(cm, from, to, range.margin); + } + } + + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + + // Sync the scrollable area and scrollbars, ensure the viewport + // covers the visible area. + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); + } + + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } + } + + // Sync scroller and scrollbar, ensure the gutter elements are + // aligned. + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); + } + + // SCROLLBARS + + // Prepare DOM reads needed to update the scrollbars. Done in one + // shot to minimize update/measure roundtrips. + function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } + } + + var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } + }; + + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.scrollTop = 0; + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} + }; + + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } + }; + + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } + }; + + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; + }; + + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt != bar) { bar.style.pointerEvents = "none"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); + }; + + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + + var NullScrollbars = function () {}; + + NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + + function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } + } + + // Re-synchronize the fake scrollbars with the actual size of the + // content. + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } + } + + var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + // Operations are used to wrap a series of changes to the editor + // state in such a way that each change won't have to update the + // cursor and display (which would be awkward, slow, and + // error-prone). Instead, display updates are batched and then all + // combined and executed at once. + + var nextOpId = 0; + // Start a new operation. + function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: 0, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId, // Unique ID + markArrays: null // Used by addMarkedSpan + }; + pushOperation(cm.curOp); + } + + // Finish an operation, updating the display and signalling delayed events + function endOperation(cm) { + var op = cm.curOp; + if (op) { finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); } + } + + // The DOM updates done when an operation finishes are batched so + // that the minimum number of relayouts are required. + function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } + } + + function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); + } + + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + + function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(); } + } + + function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt(); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } + } + + function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } + } + + // Run the given function in an operation + function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } + } + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } + } + // Used to add methods to editor and doc instances, wrapping them in + // operations. + function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } + } + function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } + } + + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } + } + + // DISPLAY DRAWING + + var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } + }; + DisplayUpdate.prototype.finish = function () { + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this.events[i]); } + }; + + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + + function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result + } + + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && + snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), range = document.createRange(); + range.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range.collapse(false); + sel.removeAllRanges(); + sel.addRange(range); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + + // Does the actual updating of the line display. Bails out + // (returning false) when there is nothing to be done and forced is + // false. + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true + } + + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } + } + + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + + // Sync the actual display DOM structure with display.view, removing + // nodes for lines that are no longer in view, and creating the ones + // that are not there yet, and updating the ones that are out of + // date. + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } + } + + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + // Send an event to consumers responding to changes in gutter width. + signalLater(display, "gutterChanged", display); + } + + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; + } + + // Re-align line numbers and gutter marks to compensate for + // horizontal scrolling. + function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } + } + + // Used to ensure that the line number gutter is still the right + // size for the current document size. Returns true when an update + // is needed. + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true + } + return false + } + + function getGutters(gutters, lineNumbers) { + var result = [], sawLineNumbers = false; + for (var i = 0; i < gutters.length; i++) { + var name = gutters[i], style = null; + if (typeof name != "string") { style = name.style; name = name.className; } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { continue } + else { sawLineNumbers = true; } + } + result.push({className: name, style: style}); + } + if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } + return result + } + + // Rebuild the gutter elements, ensure the margin to the left of the + // code matches their width. + function renderGutters(display) { + var gutters = display.gutters, specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i = 0; i < specs.length; ++i) { + var ref = specs[i]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { gElt.style.cssText = style; } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + + // The display handles the DOM integration, both for input reading + // and content drawing. It holds references to DOM nodes and + // display-related state. + + function Display(place, doc, input, options) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + + // This attribute is respected by automatic translation systems such as Google Translate, + // and may also be respected by tools used by human translators. + d.wrapper.setAttribute('translate', 'no'); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + + input.init(d); + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) { wheelPixelsPerUnit = -.53; } + else if (gecko) { wheelPixelsPerUnit = 15; } + else if (chrome) { wheelPixelsPerUnit = -.7; } + else if (safari) { wheelPixelsPerUnit = -1/3; } + + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta + } + + function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + var pixelsPerUnit = wheelPixelsPerUnit; + if (e.deltaMode === 0) { + dx = e.deltaX; + dy = e.deltaY; + pixelsPerUnit = 1; + } + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && pixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && pixelsPerUnit != null) { + var pixels = dy * pixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20 && e.deltaMode !== 0) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + // Selection objects are immutable. A new one is created every time + // the selection changes. A selection is one or more non-overlapping + // (and non-touching) ranges, sorted, and an integer that indicates + // which one is the primary selection (the one that's scrolled into + // view, that getCursor returns, etc). + var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + + Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + + Selection.prototype.equals = function (other) { + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true + }; + + Selection.prototype.deepCopy = function () { + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); } + return new Selection(out, this.primIndex) + }; + + Selection.prototype.somethingSelected = function () { + for (var i = 0; i < this.ranges.length; i++) + { if (!this.ranges[i].empty()) { return true } } + return false + }; + + Selection.prototype.contains = function (pos, end) { + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 + }; + + var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; + }; + + Range.prototype.from = function () { return minPos(this.anchor, this.head) }; + Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; + Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + + // Take an unsorted, potentially overlapping set of ranges, and + // build a selection out of it. 'Consumes' ranges array (modifying + // it). + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) + } + + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) + } + + // Compute the position of the end of a change (its 'to' property + // refers to the pre-change end). + function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) + } + + // Adjust a position to refer to the post-change position of the + // same text, or the end of the change if the change covers it. + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) + } + + function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex) + } + + function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } + } + + // Used by replaceSelections to allow moving the selection to the + // start or around the replaced test. Hint may be "start" or "around". + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) + } + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } + } + + // DOCUMENT DATA STRUCTURE + + // By default, updates that start and end at the beginning of a line + // are treated specially, in order to make the association of line + // widgets and marker elements with the text behave more intuitive. + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) + } + + // Perform a change on the document data structure. + function updateDoc(doc, change, markedSpans, estimateHeight) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); + } + + // Call f for all linked documents. + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); + } + + // Attach a document to an editor. + function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + cm.options.direction = doc.direction; + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); + } + + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + + function History(prev) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = prev ? prev.undoDepth : Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; + } + + // Create a history change event from an updateDoc-style change + // object. + function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange + } + + // Pop all selection events off the end of a history array. Stop at + // a change event. + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } + } + + // Find the top change event in the history. Pop off selection + // events that are in the way. + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } + } + + // Register a change in the history. Merges changes that are within + // a single operation, or are close together with an origin that + // allows merging (starting with "+") into a single event. + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } + } + + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) + } + + // Called whenever the selection changes, sets the new selection as + // the pending selection in the history, and pushes the old pending + // selection into the 'done' array when it was significantly + // different (in number of selected ranges, emptiness, or time). + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } + } + + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } + } + + // Used to store marked span information in the history. + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); + } + + // When un/re-doing restores text containing marked spans, those + // that have been explicitly cleared should not be restored. + function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null + } + + // Retrieve and filter the old marked spans stored in a change event. + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw + } + + // Used for un/re-doing changes from the history. Combines the + // result of computing the existing spans with the set of spans that + // existed in the history (so that deleting around a span and then + // undoing brings back the span). + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy + } + + // The 'scroll' parameter given to many of these indicated whether + // the new cursor position should be scrolled into view after + // modifying the selection. + + // If shift is held or the extend flag is set, extends a range to + // include a given position (and optionally a second position). + // Otherwise, simply returns the range between the given positions. + // Used for cursor motion and such. + function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } + } + + // Extend the primary selection range, discard the rest. + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + + // Extend all selections (pos is an array of selections with length + // equal the number of selections) + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + + // Updates a single range in the selection. + function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + + // Reset the selection to a single range. + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + + // Give beforeSelectionChange handlers a change to influence a + // selection update. + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } + else { return sel } + } + + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + + // Set a new selection. + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor") + { ensureCursorVisible(doc.cm); } + } + + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + + // Verify that the selection does not partially select any atomic + // marked ranges. + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + + // Return a selection that does not partially select any atomic + // ranges. + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel + } + + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + + // Determine if we should prevent the cursor being placed to the left/right of an atomic marker + // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it + // is with selectLeft/Right + var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; + + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? preventCursorRight : preventCursorLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos + } + + // Ensure a given position is not inside an atomic range. + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found + } + + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } + } + + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + + // UPDATING + + // Allow "beforeChange" event handlers to influence a change + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { + if (doc.cm) { doc.cm.curOp.updateInput = 2; } + return null + } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} + } + + // Apply a change to a document, and add it to the document's + // history, and propagating it to all linked documents. + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } + } else { + makeChangeInner(doc, change); + } + } + + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + // Revert a change stored in a document's history. + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } else if (suppress) { + source.push(event); + return + } else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } + } + + // Sub-views need their line numbers shifted when text is added + // above or below them in the parent document. + function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } + } + + // More lower-level change function, handling only a single document + // (not linked ones). + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) + { doc.cantEdit = false; } + } + + // Handle the interaction of a change to a document with the editor + // that this document is part of. + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; + } + + function replaceRange(doc, code, from, to, origin) { + var assign; + + if (!to) { to = from; } + if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } + } + + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // Utility for applying a change to a line by handle or number, + // returning the number and optionally registering the line as + // changed. + function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line + } + + // The document is represented as a BTree consisting of leaves, with + // chunk of lines in them, and branches, with up to ten leaves or + // other branch nodes below them. The top node is always a branch + // node, and is the document object itself (meaning it has + // additional methods and properties). + // + // All nodes have parent links. The tree is used both to go from + // line numbers to line objects, and to go from objects to numbers. + // It also indexes by height, and is used to convert between height + // and line object, and to find the total height of the document. + // + // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function(at, n) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; } + }, + + // Used to iterate over a part of the tree. + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + { if (op(this.lines[at])) { return true } } + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size }, + + removeInner: function(at, n) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function(lines) { + for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); } + }, + + insertInner: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function(at, n, op) { + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } + }; + + // Line widgets are block elements displayed above or below a line. + + var LineWidget = function(doc, node, options) { + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; + }; + + LineWidget.prototype.clear = function () { + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + + LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } + } + + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } + return widget + } + + // TEXTMARKERS + + // Created with markText and setBookmark methods. A TextMarker is a + // handle that can be used to clear or find a marked position in the + // document. Line objects hold arrays (markedSpans) containing + // {from, to, marker} object pointing to such marker objects, and + // indicating that such a marker is present on that line. Multiple + // lines may point to the same marker when it spans across lines. + // The spans will have null for their from/to properties when the + // marker continues beyond the start/end of the line. Markers have + // links back to the lines they currently touch. + + // Collapsed markers have unique ids, in order to be able to order + // them, which is needed for uniquely determining an outer marker + // when they overlap (they may nest, but not partially overlap). + var nextMarkerId = 0; + + var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + + // Clear the marker. + TextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } + }; + + // Find the position of the marker in the document. Returns a {from, + // to} object by default. Side can be passed to get a specific side + // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the + // Pos objects returned contain a line object, rather than a line + // number (used to prevent looking up the same line twice). + TextMarker.prototype.find = function (side, lineObj) { + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} + }; + + // Signals that the marker's widget changed, and surrounding layout + // should be recomputed. + TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); + }; + + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); + }; + + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp + ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + + // Create a marker, wire it up to the right lines, and + function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.startStyle || marker.endStyle || marker.css || + marker.attributes || marker.title) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker + } + + // SHARED TEXTMARKERS + + // A shared marker spans multiple linked documents. It is + // implemented as a meta-marker-object controlling multiple normal + // markers. + var SharedTextMarker = function(markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this; } + }; + + SharedTextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this.markers[i].clear(); } + signalLater(this, "clear"); + }; + + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) + }; + eventMixin(SharedTextMarker); + + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) + } + + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) + } + + function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + + function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); + } + + var nextDocId = 0; + var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + if (lineSep === '') { return lines.join('') } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range.head; } + else if (start == "anchor") { pos = range.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range.to(); } + else { pos = range.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this, ranges[i].anchor), + clipPos(this, ranges[i].head || ranges[i].anchor)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() { + var this$1 = this; + + this.history = new History(this.history); + linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true); + }, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo == from.line && from.ch >= span.to || + span.from == null && lineNo != from.line || + span.from != null && lineNo == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo; + }); + return clipPos(this, Pos(lineNo, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + if (other instanceof CodeMirror) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this.linked[i]; + if (link.doc != other) { continue } + this.linked.splice(i, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) + }); + + // Public alias. + Doc.prototype.eachLine = Doc.prototype.iter; + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function () { + if (++read == n) { + operation(cm, function () { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines( + text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + var reader = new FileReader; + reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); }; + reader.onload = function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + text[i] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e$1){} + } + } + + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } + } + + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + + // These must be handled carefully, because naively registering a + // handler for each editor will cause the editors to never be + // garbage collected. + + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"), editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { editors.push(cm); } + } + if (editors.length) { editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { f(editors[i]); } + }); } + } + + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); + } + // Called when the window resizes + function onResize(cm) { + var d = cm.display; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + + var keyNames = { + 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" + }; + + // Number keys + for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } + // Alphabetic keys + for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } + // Function keys + for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + + var keyMap = {}; + + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + // Note that the save and find-related commands aren't defined by + // default. User code or addons can define them. Unknown commands + // are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + // Very basic readline/emacs-style bindings, which are standard on Mac. + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", + "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", + "Ctrl-T": "transposeChars", "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + + // KEYMAP DISPATCH + + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name + } + + // This is a kludge to keep keymaps mostly working as raw objects + // (backwards compatibility) while at the same time support features + // like normalization and multi-stroke key bindings. It compiles a + // new normalized keymap, and then updates the old object to reflect + // this. + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap + } + + function lookupKey(key, map, handle, context) { + map = getKeyMap(map); + var found = map.call ? map.call(key, context) : map[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map.fallthrough) { + if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") + { return lookupKey(key, map.fallthrough, handle, context) } + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle, context); + if (result) { return result } + } + } + } + + // Modifier key presses don't count as 'real' key presses for the + // purpose of keymap fallthrough. + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" + } + + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name + } + + // Look up the name of a key as indicated by an event object. + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { name = event.code; } + return addModifierNames(name, event, noShift) + } + + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val + } + + // Helper for deleting text near the selection(s), used to implement + // backspace, delete, and similar functionality. + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); + } + + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target + } + + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") + } + + function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { dir = -dir; } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") + } + + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null + } + + // Commands are parameter-less actions that can be performed on an + // editor, mostly used for keybindings. + var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } + }; + + + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start + } + + // Run a handler that was bound to a key. + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done + } + + function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) + } + + // Note that, despite the name, this function is also used to check + // for bound mouse clicks. + + var stopSeq = new Delayed; + + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + if (/\'$/.test(name)) + { cm.state.keySeq = null; } + else + { stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } + } + return dispatchKeyInner(cm, name, e, handle) + } + + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + return !!result + } + + // Handle a key from the keydown event. + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } + } + + // Handle a key from the keypress event + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) + { document.execCommand("cut"); } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } + } + + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + + function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); + } + + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); + } + + var DOUBLECLICK_DELAY = 400; + + var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button + }; + + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } + } + + // A mouse down can be a single click, double click, triple click, + // start of selection drag, start of text drag, new cursor + // (ctrl-click), rectangle drag (alt-drag), or xwin + // middle-click-paste. Or it might be a click on something we should + // not interfere with, such as a scrollbar or widget. + function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { cm.display.input.onContextMenu(e); } + else { delayBlurEvent(cm); } + } + } + + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) + } + + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value + } + + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } + } + + // Start a text drag. When it ends, see if any dragging actually + // happen, and treat as a click if it didn't. + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; } + else { delayBlurEvent(cm); } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if ((webkit && !safari) || ie && ie_version == 9) + { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + cm.state.delayingBlurEvent = true; + setTimeout(function () { return display.input.focus(); }, 20); + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + } + + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) + } + + // Normal selection, as opposed to text dragging. + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { delayBlurEvent(cm); } + var display = cm.display, doc = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); } + else + { ourRange = range; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } + } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range.anchor, anchor) > 0) { + head = range.head; + anchor = minPos(oldRange.from(), range.anchor); + } else { + head = range.anchor; + anchor = maxPos(oldRange.to(), range.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } + } + } + + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + // If e is null or undefined we interpret this as someone trying + // to explicitly cancel the selection rather than the user + // letting go of the mouse button. + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range) { + var anchor = range.anchor; + var head = range.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range } + var order = getOrder(anchorLine); + if (!order) { return range } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { return range } + var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { return range } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) + { leftSide = dir < 0; } + else + { leftSide = dir > 0; } + } + + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head) + } + + + // Determines whether an event happened in the gutter, and fires the + // handlers for the corresponding event. + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { mX = e.clientX; mY = e.clientY; } + catch(e$1) { return false } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } + + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e) + } + } + } + + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) + } + + // CONTEXT MENU HANDLING + + // To make the context menu work, we need to briefly unhide the + // textarea (making it as unobtrusive as possible) to let the + // right-click take effect on it. + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + if (!captureRightClick) { cm.display.input.onContextMenu(e); } + } + + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + var Init = {toString: function(){return "CodeMirror.Init"}}; + + var defaults = {}; + var optionHandlers = {}; + + function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); + option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + + option("screenReaderLabel", null, function (cm, val) { + val = (val === '') ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); + option("phrases", null); + } + + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); + } + + // A CodeMirror instance represents an editor. This is the object + // that user code is usually dealing with. + + function CodeMirror(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + else if (options.mode) { doc.modeOption = options.mode; } + this.doc = doc; + + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(function () { + if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); } + }, 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } + } + + // The default configuration options. + CodeMirror.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.optionHandlers = optionHandlers; + + // Attach the necessary event handlers when initializing the editor + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); + on(d.input.getField(), "contextmenu", function (e) { + if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); } + }); + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); + } + + var initHooks = []; + CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; + + // Indent the given line. The how parameter can be "smart", + // "add"/null, "subtract", or "prev". When aggressive is false + // (typically set to true for forced single-line indents), empty + // lines are not indented, and places where the mode returns Pass + // are left alone. + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } + } + } + + // This will be set to a {lineWise: bool, text: [string]} object, so + // that, when pasting, we know what kind of selections the copied + // text was made out of. + var lastCopied = null; + + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var recent = +new Date - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasting N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); + } + } + + var updateInput = cm.curOp.updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range = sel.ranges[i$1]; + var from = range.from(), to = range.to(); + if (range.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) + { from = to = Pos(from.line, 0); } + } + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } + } + + function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range = sel.ranges[i]; + if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue } + var mode = cm.getModeAt(range.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) + { indented = indentLine(cm, range.head.line, "smart"); } + } + if (indented) { signalLater(cm, "electricInput", cm, range.head.line); } + } + } + + function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} + } + + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + disableBrowserMagic(te); + return div + } + + // The publicly visible API. Note that methodOp(f) means + // 'wrap f in an operation, performed on its `this` parameter'. + + // This is not the complete set of editor methods. Most of the + // methods defined on the Doc type are also injected into + // CodeMirror.prototype, for backwards compatibility and + // convenience. + + function addEditorMethods(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){window.focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); + }, + removeKeyMap: function(map) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map || maps[i].name == map) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this.state.modeGen++; + regChange(this); + return + } + } + }), + + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (!range.empty()) { + var from = range.from(), to = range.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this, j, how); } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range.head.line > end) { + indentLine(this, range.head.line, how, true); + end = range.head.line; + if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range = this.doc.sel.primary(); + if (start == null) { pos = range.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range.from() : range.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range) { + if (this$1.display.shift || this$1.doc.extend || range.empty()) + { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range.from() : range.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range) { + var other = findPosH(doc, range.head, dir, unit, false); + return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range) { + if (collapse) + { return dir < 0 ? range.from() : range.to() } + var headPos = cursorCoords(this$1, range.head, "div"); + if (range.goalColumn != null) { headPos.left = range.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, + + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt() }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range, margin) { + if (range == null) { + range = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range == "number") { + range = {from: Pos(range, 0), to: null}; + } else if (range.from == null) { + range = {from: range, to: null}; + } + if (!range.to) { range.to = range.from; } + range.margin = margin || 0; + + if (range.from.line != null) { + scrollToRange(this, range); + } else { + scrollToCoordsRange(this, range.from, range.to, range.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo = this.display.viewFrom; + this.doc.iter(lineNo, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } } + ++lineNo; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + startOperation: function(){return startOperation(this)}, + endOperation: function(){return endOperation(this)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + // Cancel the current text selection if any (#5821) + if (this.state.selectingText) { this.state.selectingText(); } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText + }, + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; + } + + // Used for horizontal relative motion. Dir is -1 or 1 (left or + // right), unit can be "codepoint", "char", "column" (like char, but + // doesn't cross line boundaries), "word" (across next word), or + // "group" (to the start of next group of word or + // non-word-non-whitespace chars). The visually param controls + // whether, in right-to-left text, direction 1 means to move towards + // the next index in the string, or towards the character to the right + // of the current position. The resulting position will have a + // hitSide=true property if it reached the end of the document. + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + var lineDir = visually && doc.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); + if (isNaN(ch)) { + next = null; + } else { + var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF; + next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); + } + } else if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); } + else + { return false } + } else { + pos = next; + } + return true + } + + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } + + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result + } + + // For relative vertical movement. Dir may be -1 or 1. Unit can be + // "page" or "line". The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target + } + + // CONTENTEDITABLE INPUT STYLE + + var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + + ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + div.contentEditable = true; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { return true } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break } + } + return false + } + + on(div, "paste", function (e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); + + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); + + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); + + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = activeElt(); + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + + ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.div.setAttribute('aria-label', label); + } else { + this.div.removeAttribute('aria-label'); + } + }; + + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = activeElt() == this.div; + return result + }; + + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); + }; + + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection() + }; + + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } + + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } + + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; + } + + if (!start || !end) { + sel.removeAllRanges(); + return + } + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); + }; + + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); + }; + + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; + }; + + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) + }; + + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || activeElt() != this.div) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function () { this.div.blur(); }; + ContentEditableInput.prototype.getField = function () { return this.div }; + + ContentEditableInput.prototype.supportsTouch = function () { return true }; + + ContentEditableInput.prototype.receivedFocus = function () { + var this$1 = this; + + var input = this; + if (this.selectionInEditor()) + { setTimeout(function () { return this$1.pollSelection(); }, 20); } + else + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset + }; + + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = this.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } + }; + + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } + }; + + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } + } + this$1.updateFromDOM(); + }, 80); + }; + + ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } + }; + + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; + + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } + }; + + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; + + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; + + ContentEditableInput.prototype.needsContentAttribute = true; + + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result + } + + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false + } + + function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } + + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { text += lineSep; } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return + } + var markerID = node.getAttribute("cm-marker"), range; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range = found[0].find(0))) + { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } + + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + + if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + extraLinebreak = false; + } + return text + } + + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } + } + + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) + } + } + + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map.length; j += 3) { + var curNode = map[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } + } + + // TEXTAREA INPUT STYLE + + var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; + }; + + TextareaInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = this.cm; + this.createField(display); + var te = this.textarea; + + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } + + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); + + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + + cm.state.pasteIncoming = +new Date; + input.fastPoll(); + }); + + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = +new Date; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +new Date; + input.focus(); + return + } + + // Pass the `paste` event to the textarea so it's handled by its event listener. + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + + TextareaInput.prototype.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + }; + + TextareaInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.textarea.setAttribute('aria-label', label); + } else { + this.textarea.removeAttribute('aria-label'); + } + }; + + TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } + + return result + }; + + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + + // Reset the input to correspond to the selection (or to be empty, + // when not typing and nothing is selected) + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { return } + var cm = this.cm; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + }; + + TextareaInput.prototype.getField = function () { return this.textarea }; + + TextareaInput.prototype.supportsTouch = function () { return false }; + + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } + }; + + TextareaInput.prototype.blur = function () { this.textarea.blur(); }; + + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + + TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; + + // Poll for input changes, using the normal rate of polling. This + // runs as long as the editor is focused. + TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); + }; + + // When an event has just come in that is likely to add or change + // something in the input textarea, we poll faster, to ensure that + // the change appears on the screen quickly. + TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); + }; + + // Read input from the textarea, and update the document to match. + // When something is selected, it is present in the textarea, and + // selected (unless it is huge, in which case a placeholder is + // used). When nothing is selected, the cursor sits after previously + // seen text (can be empty), which is stored in prevInput (we must + // not reset the textarea when typing, because that breaks IME). + TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true + }; + + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } + }; + + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); + }; + + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + if (input.contextMenuPending) { input.contextMenuPending(); } + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { window.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { return } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; + + TextareaInput.prototype.setUneditable = function () {}; + + TextareaInput.prototype.needsContentAttribute = false; + + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm + } + + function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; + } + + // EDITOR CONSTRUCTOR + + defineOptions(CodeMirror); + + addEditorMethods(CodeMirror); + + // Set up methods on CodeMirror's prototype to redirect to the editor's document. + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + + eventMixin(Doc); + CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + CodeMirror.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } + defineMode.apply(this, arguments); + }; + + CodeMirror.defineMIME = defineMIME; + + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); + + // EXTENSIONS + + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + + CodeMirror.fromTextArea = fromTextArea; + + addLegacyProps(CodeMirror); + + CodeMirror.version = "5.65.3"; + + return CodeMirror; + +}))); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/apl/apl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/apl/apl.js new file mode 100644 index 0000000000..b1955f6c94 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/apl/apl.js @@ -0,0 +1,174 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("apl", function() { + var builtInOps = { + ".": "innerProduct", + "\\": "scan", + "/": "reduce", + "⌿": "reduce1Axis", + "⍀": "scan1Axis", + "¨": "each", + "⍣": "power" + }; + var builtInFuncs = { + "+": ["conjugate", "add"], + "−": ["negate", "subtract"], + "×": ["signOf", "multiply"], + "÷": ["reciprocal", "divide"], + "⌈": ["ceiling", "greaterOf"], + "⌊": ["floor", "lesserOf"], + "∣": ["absolute", "residue"], + "⍳": ["indexGenerate", "indexOf"], + "?": ["roll", "deal"], + "⋆": ["exponentiate", "toThePowerOf"], + "⍟": ["naturalLog", "logToTheBase"], + "○": ["piTimes", "circularFuncs"], + "!": ["factorial", "binomial"], + "⌹": ["matrixInverse", "matrixDivide"], + "<": [null, "lessThan"], + "≤": [null, "lessThanOrEqual"], + "=": [null, "equals"], + ">": [null, "greaterThan"], + "≥": [null, "greaterThanOrEqual"], + "≠": [null, "notEqual"], + "≡": ["depth", "match"], + "≢": [null, "notMatch"], + "∈": ["enlist", "membership"], + "⍷": [null, "find"], + "∪": ["unique", "union"], + "∩": [null, "intersection"], + "∼": ["not", "without"], + "∨": [null, "or"], + "∧": [null, "and"], + "⍱": [null, "nor"], + "⍲": [null, "nand"], + "⍴": ["shapeOf", "reshape"], + ",": ["ravel", "catenate"], + "⍪": [null, "firstAxisCatenate"], + "⌽": ["reverse", "rotate"], + "⊖": ["axis1Reverse", "axis1Rotate"], + "⍉": ["transpose", null], + "↑": ["first", "take"], + "↓": [null, "drop"], + "⊂": ["enclose", "partitionWithAxis"], + "⊃": ["diclose", "pick"], + "⌷": [null, "index"], + "⍋": ["gradeUp", null], + "⍒": ["gradeDown", null], + "⊤": ["encode", null], + "⊥": ["decode", null], + "⍕": ["format", "formatByExample"], + "⍎": ["execute", null], + "⊣": ["stop", "left"], + "⊢": ["pass", "right"] + }; + + var isOperator = /[\.\/⌿⍀¨⍣]/; + var isNiladic = /⍬/; + var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/; + var isArrow = /←/; + var isComment = /[⍝#].*$/; + + var stringEater = function(type) { + var prev; + prev = false; + return function(c) { + prev = c; + if (c === type) { + return prev === "\\"; + } + return true; + }; + }; + return { + startState: function() { + return { + prev: false, + func: false, + op: false, + string: false, + escape: false + }; + }, + token: function(stream, state) { + var ch, funcName; + if (stream.eatSpace()) { + return null; + } + ch = stream.next(); + if (ch === '"' || ch === "'") { + stream.eatWhile(stringEater(ch)); + stream.next(); + state.prev = true; + return "string"; + } + if (/[\[{\(]/.test(ch)) { + state.prev = false; + return null; + } + if (/[\]}\)]/.test(ch)) { + state.prev = true; + return null; + } + if (isNiladic.test(ch)) { + state.prev = false; + return "niladic"; + } + if (/[¯\d]/.test(ch)) { + if (state.func) { + state.func = false; + state.prev = false; + } else { + state.prev = true; + } + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperator.test(ch)) { + return "operator apl-" + builtInOps[ch]; + } + if (isArrow.test(ch)) { + return "apl-arrow"; + } + if (isFunction.test(ch)) { + funcName = "apl-"; + if (builtInFuncs[ch] != null) { + if (state.prev) { + funcName += builtInFuncs[ch][1]; + } else { + funcName += builtInFuncs[ch][0]; + } + } + state.func = true; + state.prev = false; + return "function " + funcName; + } + if (isComment.test(ch)) { + stream.skipToEnd(); + return "comment"; + } + if (ch === "∘" && stream.peek() === ".") { + stream.next(); + return "function jot-dot"; + } + stream.eatWhile(/[\w\$_]/); + state.prev = true; + return "keyword"; + } + }; +}); + +CodeMirror.defineMIME("text/apl", "apl"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asciiarmor/asciiarmor.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asciiarmor/asciiarmor.js new file mode 100644 index 0000000000..f560f42423 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asciiarmor/asciiarmor.js @@ -0,0 +1,74 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function errorIfNotEmpty(stream) { + var nonWS = stream.match(/^\s*\S/); + stream.skipToEnd(); + return nonWS ? "error" : null; + } + + CodeMirror.defineMode("asciiarmor", function() { + return { + token: function(stream, state) { + var m; + if (state.state == "top") { + if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) { + state.state = "headers"; + state.type = m[1]; + return "tag"; + } + return errorIfNotEmpty(stream); + } else if (state.state == "headers") { + if (stream.sol() && stream.match(/^\w+:/)) { + state.state = "header"; + return "atom"; + } else { + var result = errorIfNotEmpty(stream); + if (result) state.state = "body"; + return result; + } + } else if (state.state == "header") { + stream.skipToEnd(); + state.state = "headers"; + return "string"; + } else if (state.state == "body") { + if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) { + if (m[1] != state.type) return "error"; + state.state = "end"; + return "tag"; + } else { + if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) { + return null; + } else { + stream.next(); + return "error"; + } + } + } else if (state.state == "end") { + return errorIfNotEmpty(stream); + } + }, + blankLine: function(state) { + if (state.state == "headers") state.state = "body"; + }, + startState: function() { + return {state: "top", type: null}; + } + }; + }); + + CodeMirror.defineMIME("application/pgp", "asciiarmor"); + CodeMirror.defineMIME("application/pgp-encrypted", "asciiarmor"); + CodeMirror.defineMIME("application/pgp-keys", "asciiarmor"); + CodeMirror.defineMIME("application/pgp-signature", "asciiarmor"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asn.1/asn.1.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asn.1/asn.1.js new file mode 100644 index 0000000000..df1330b686 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asn.1/asn.1.js @@ -0,0 +1,204 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("asn.1", function(config, parserConfig) { + var indentUnit = config.indentUnit, + keywords = parserConfig.keywords || {}, + cmipVerbs = parserConfig.cmipVerbs || {}, + compareTypes = parserConfig.compareTypes || {}, + status = parserConfig.status || {}, + tags = parserConfig.tags || {}, + storage = parserConfig.storage || {}, + modifier = parserConfig.modifier || {}, + accessTypes = parserConfig.accessTypes|| {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false; + var isOperatorChar = /[\|\^]/; + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]\(\){}:=,;]/.test(ch)) { + curPunc = ch; + return "punctuation"; + } + if (ch == "-"){ + if (stream.eat("-")) { + stream.skipToEnd(); + return "comment"; + } + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + + stream.eatWhile(/[\w\-]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (cmipVerbs.propertyIsEnumerable(cur)) return "variable cmipVerbs"; + if (compareTypes.propertyIsEnumerable(cur)) return "atom compareTypes"; + if (status.propertyIsEnumerable(cur)) return "comment status"; + if (tags.propertyIsEnumerable(cur)) return "variable-3 tags"; + if (storage.propertyIsEnumerable(cur)) return "builtin storage"; + if (modifier.propertyIsEnumerable(cur)) return "string-2 modifier"; + if (accessTypes.propertyIsEnumerable(cur)) return "atom accessTypes"; + + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped){ + var afterNext = stream.peek(); + //look if the character if the quote is like the B in '10100010'B + if (afterNext){ + afterNext = afterNext.toLowerCase(); + if(afterNext == "b" || afterNext == "h" || afterNext == "o") + stream.next(); + } + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + //Interface + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") + && ctx.type == "statement"){ + popContext(state); + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") + && curPunc != ';') || (ctx.type == "statement" + && curPunc == "newstatement"))) + pushContext(state, stream.column(), "statement"); + + state.startOfLine = false; + return style; + }, + + electricChars: "{}", + lineComment: "--", + fold: "brace" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + CodeMirror.defineMIME("text/x-ttcn-asn", { + name: "asn.1", + keywords: words("DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION" + + " REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED" + + " WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN" + + " IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS" + + " MINACCESS MAXACCESS REVISION STATUS DESCRIPTION" + + " SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName" + + " ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY" + + " IMPLIED EXPORTS"), + cmipVerbs: words("ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE"), + compareTypes: words("OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY" + + " MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY" + + " OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL" + + " SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL" + + " TEXTUAL-CONVENTION"), + status: words("current deprecated mandatory obsolete"), + tags: words("APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS" + + " UNIVERSAL"), + storage: words("BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING" + + " UTCTime InterfaceIndex IANAifType CMIP-Attribute" + + " REAL PACKAGE PACKAGES IpAddress PhysAddress" + + " NetworkAddress BITS BMPString TimeStamp TimeTicks" + + " TruthValue RowStatus DisplayString GeneralString" + + " GraphicString IA5String NumericString" + + " PrintableString SnmpAdminString TeletexString" + + " UTF8String VideotexString VisibleString StringStore" + + " ISO646String T61String UniversalString Unsigned32" + + " Integer32 Gauge Gauge32 Counter Counter32 Counter64"), + modifier: words("ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS" + + " GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS" + + " DEFINED"), + accessTypes: words("not-accessible accessible-for-notify read-only" + + " read-create read-write"), + multiLineStrings: true + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asterisk/asterisk.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asterisk/asterisk.js new file mode 100644 index 0000000000..49a727019a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/asterisk/asterisk.js @@ -0,0 +1,220 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + * ===================================================================================== + * + * Filename: mode/asterisk/asterisk.js + * + * Description: CodeMirror mode for Asterisk dialplan + * + * Created: 05/17/2012 09:20:25 PM + * Revision: 08/05/2019 AstLinux Project: Support block-comments + * + * Author: Stas Kobzar (stas@modulis.ca), + * Company: Modulis.ca Inc. + * + * ===================================================================================== + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("asterisk", function() { + var atoms = ["exten", "same", "include","ignorepat","switch"], + dpcmd = ["#include","#exec"], + apps = [ + "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi", + "alarmreceiver","amd","answer","authenticate","background","backgrounddetect", + "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent", + "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge", + "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge", + "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility", + "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa", + "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy", + "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif", + "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete", + "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus", + "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme", + "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete", + "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode", + "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish", + "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce", + "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones", + "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten", + "readfile","receivefax","receivefax","receivefax","record","removequeuemember", + "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun", + "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax", + "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags", + "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel", + "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground", + "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound", + "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor", + "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec", + "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate", + "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring", + "waitforsilence","waitmusiconhold","waituntil","while","zapateller" + ]; + + function basicToken(stream,state){ + var cur = ''; + var ch = stream.next(); + // comment + if (state.blockComment) { + if (ch == "-" && stream.match("-;", true)) { + state.blockComment = false; + } else if (stream.skipTo("--;")) { + stream.next(); + stream.next(); + stream.next(); + state.blockComment = false; + } else { + stream.skipToEnd(); + } + return "comment"; + } + if(ch == ";") { + if (stream.match("--", true)) { + if (!stream.match("-", false)) { // Except ;--- is not a block comment + state.blockComment = true; + return "comment"; + } + } + stream.skipToEnd(); + return "comment"; + } + // context + if(ch == '[') { + stream.skipTo(']'); + stream.eat(']'); + return "header"; + } + // string + if(ch == '"') { + stream.skipTo('"'); + return "string"; + } + if(ch == "'") { + stream.skipTo("'"); + return "string-2"; + } + // dialplan commands + if(ch == '#') { + stream.eatWhile(/\w/); + cur = stream.current(); + if(dpcmd.indexOf(cur) !== -1) { + stream.skipToEnd(); + return "strong"; + } + } + // application args + if(ch == '$'){ + var ch1 = stream.peek(); + if(ch1 == '{'){ + stream.skipTo('}'); + stream.eat('}'); + return "variable-3"; + } + } + // extension + stream.eatWhile(/\w/); + cur = stream.current(); + if(atoms.indexOf(cur) !== -1) { + state.extenStart = true; + switch(cur) { + case 'same': state.extenSame = true; break; + case 'include': + case 'switch': + case 'ignorepat': + state.extenInclude = true;break; + default:break; + } + return "atom"; + } + } + + return { + startState: function() { + return { + blockComment: false, + extenStart: false, + extenSame: false, + extenInclude: false, + extenExten: false, + extenPriority: false, + extenApplication: false + }; + }, + token: function(stream, state) { + + var cur = ''; + if(stream.eatSpace()) return null; + // extension started + if(state.extenStart){ + stream.eatWhile(/[^\s]/); + cur = stream.current(); + if(/^=>?$/.test(cur)){ + state.extenExten = true; + state.extenStart = false; + return "strong"; + } else { + state.extenStart = false; + stream.skipToEnd(); + return "error"; + } + } else if(state.extenExten) { + // set exten and priority + state.extenExten = false; + state.extenPriority = true; + stream.eatWhile(/[^,]/); + if(state.extenInclude) { + stream.skipToEnd(); + state.extenPriority = false; + state.extenInclude = false; + } + if(state.extenSame) { + state.extenPriority = false; + state.extenSame = false; + state.extenApplication = true; + } + return "tag"; + } else if(state.extenPriority) { + state.extenPriority = false; + state.extenApplication = true; + stream.next(); // get comma + if(state.extenSame) return null; + stream.eatWhile(/[^,]/); + return "number"; + } else if(state.extenApplication) { + stream.eatWhile(/,/); + cur = stream.current(); + if(cur === ',') return null; + stream.eatWhile(/\w/); + cur = stream.current().toLowerCase(); + state.extenApplication = false; + if(apps.indexOf(cur) !== -1){ + return "def strong"; + } + } else{ + return basicToken(stream,state); + } + + return null; + }, + + blockCommentStart: ";--", + blockCommentEnd: "--;", + lineComment: ";" + }; +}); + +CodeMirror.defineMIME("text/x-asterisk", "asterisk"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/brainfuck/brainfuck.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/brainfuck/brainfuck.js new file mode 100644 index 0000000000..af6d889aee --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/brainfuck/brainfuck.js @@ -0,0 +1,85 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11 + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod) + else + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + var reserve = "><+-.,[]".split(""); + /* + comments can be either: + placed behind lines + + +++ this is a comment + + where reserved characters cannot be used + or in a loop + [ + this is ok to use [ ] and stuff + ] + or preceded by # + */ + CodeMirror.defineMode("brainfuck", function() { + return { + startState: function() { + return { + commentLine: false, + left: 0, + right: 0, + commentLoop: false + } + }, + token: function(stream, state) { + if (stream.eatSpace()) return null + if(stream.sol()){ + state.commentLine = false; + } + var ch = stream.next().toString(); + if(reserve.indexOf(ch) !== -1){ + if(state.commentLine === true){ + if(stream.eol()){ + state.commentLine = false; + } + return "comment"; + } + if(ch === "]" || ch === "["){ + if(ch === "["){ + state.left++; + } + else{ + state.right++; + } + return "bracket"; + } + else if(ch === "+" || ch === "-"){ + return "keyword"; + } + else if(ch === "<" || ch === ">"){ + return "atom"; + } + else if(ch === "." || ch === ","){ + return "def"; + } + } + else{ + state.commentLine = true; + if(stream.eol()){ + state.commentLine = false; + } + return "comment"; + } + if(stream.eol()){ + state.commentLine = false; + } + } + }; + }); +CodeMirror.defineMIME("text/x-brainfuck","brainfuck") +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clike/clike.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clike/clike.js new file mode 100644 index 0000000000..afb7b3be88 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clike/clike.js @@ -0,0 +1,940 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function Context(indented, column, type, info, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.info = info; + this.align = align; + this.prev = prev; +} +function pushContext(state, col, type, info) { + var indent = state.indented; + if (state.context && state.context.type == "statement" && type != "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, info, null, state.context); +} +function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; +} + +function typeBefore(stream, state, pos) { + if (state.prevToken == "variable" || state.prevToken == "type") return true; + if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true; + if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true; +} + +function isTopScope(context) { + for (;;) { + if (!context || context.type == "top") return true; + if (context.type == "}" && context.prev.info != "namespace") return false; + context = context.prev; + } +} + +CodeMirror.defineMode("clike", function(config, parserConfig) { + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + dontAlignCalls = parserConfig.dontAlignCalls, + keywords = parserConfig.keywords || {}, + types = parserConfig.types || {}, + builtin = parserConfig.builtin || {}, + blockKeywords = parserConfig.blockKeywords || {}, + defKeywords = parserConfig.defKeywords || {}, + atoms = parserConfig.atoms || {}, + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false, + indentSwitch = parserConfig.indentSwitch !== false, + namespaceSeparator = parserConfig.namespaceSeparator, + isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/, + numberStart = parserConfig.numberStart || /[\d\.]/, + number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i, + isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/, + isIdentifierChar = parserConfig.isIdentifierChar || /[\w\$_\xa1-\uffff]/, + // An optional function that takes a {string} token and returns true if it + // should be treated as a builtin. + isReservedIdentifier = parserConfig.isReservedIdentifier || false; + + var curPunc, isDefKeyword; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (numberStart.test(ch)) { + stream.backUp(1) + if (stream.match(number)) return "number" + stream.next() + } + if (isPunctuationChar.test(ch)) { + curPunc = ch; + return null; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {} + return "operator"; + } + stream.eatWhile(isIdentifierChar); + if (namespaceSeparator) while (stream.match(namespaceSeparator)) + stream.eatWhile(isIdentifierChar); + + var cur = stream.current(); + if (contains(keywords, cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + if (contains(defKeywords, cur)) isDefKeyword = true; + return "keyword"; + } + if (contains(types, cur)) return "type"; + if (contains(builtin, cur) + || (isReservedIdentifier && isReservedIdentifier(cur))) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + return "builtin"; + } + if (contains(atoms, cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function maybeEOL(stream, state) { + if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context)) + state.typeAtEndOfLine = typeBefore(stream, state, stream.pos) + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false), + indented: 0, + startOfLine: true, + prevToken: null + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) { maybeEOL(stream, state); return null; } + curPunc = isDefKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if (curPunc == ";" || curPunc == ":" || (curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false))) + while (state.context.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && + (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") || + (ctx.type == "statement" && curPunc == "newstatement"))) { + pushContext(state, stream.column(), "statement", stream.current()); + } + + if (style == "variable" && + ((state.prevToken == "def" || + (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) && + isTopScope(state.context) && stream.match(/^\s*\(/, false))))) + style = "def"; + + if (hooks.token) { + var result = hooks.token(stream, state, style); + if (result !== undefined) style = result; + } + + if (style == "def" && parserConfig.styleDefs === false) style = "variable"; + + state.startOfLine = false; + state.prevToken = isDefKeyword ? "def" : style || curPunc; + maybeEOL(stream, state); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + var closing = firstChar == ctx.type; + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + if (parserConfig.dontIndentStatements) + while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info)) + ctx = ctx.prev + if (hooks.indent) { + var hook = hooks.indent(state, ctx, textAfter, indentUnit); + if (typeof hook == "number") return hook + } + var switchBlock = ctx.prev && ctx.prev.info == "switch"; + if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) { + while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev + return ctx.indented + } + if (ctx.type == "statement") + return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + if (ctx.align && (!dontAlignCalls || ctx.type != ")")) + return ctx.column + (closing ? 0 : 1); + if (ctx.type == ")" && !closing) + return ctx.indented + statementIndentUnit; + + return ctx.indented + (closing ? 0 : indentUnit) + + (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0); + }, + + electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/, + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: "//", + fold: "brace" + }; +}); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + function contains(words, word) { + if (typeof words === "function") { + return words(word); + } else { + return words.propertyIsEnumerable(word); + } + } + var cKeywords = "auto if break case register continue return default do sizeof " + + "static else struct switch extern typedef union for goto while enum const " + + "volatile inline restrict asm fortran"; + + // Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20. + var cppKeywords = "alignas alignof and and_eq audit axiom bitand bitor catch " + + "class compl concept constexpr const_cast decltype delete dynamic_cast " + + "explicit export final friend import module mutable namespace new noexcept " + + "not not_eq operator or or_eq override private protected public " + + "reinterpret_cast requires static_assert static_cast template this " + + "thread_local throw try typeid typename using virtual xor xor_eq"; + + var objCKeywords = "bycopy byref in inout oneway out self super atomic nonatomic retain copy " + + "readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd " + + "@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class " + + "@public @package @private @protected @required @optional @try @catch @finally @import " + + "@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available"; + + var objCBuiltins = "FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION " + + " NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER " + + "NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION " + + "NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT" + + // Do not use this. Use the cTypes function below. This is global just to avoid + // excessive calls when cTypes is being called multiple times during a parse. + var basicCTypes = words("int long char short double float unsigned signed " + + "void bool"); + + // Do not use this. Use the objCTypes function below. This is global just to avoid + // excessive calls when objCTypes is being called multiple times during a parse. + var basicObjCTypes = words("SEL instancetype id Class Protocol BOOL"); + + // Returns true if identifier is a "C" type. + // C type is defined as those that are reserved by the compiler (basicTypes), + // and those that end in _t (Reserved by POSIX for types) + // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html + function cTypes(identifier) { + return contains(basicCTypes, identifier) || /.+_t$/.test(identifier); + } + + // Returns true if identifier is a "Objective C" type. + function objCTypes(identifier) { + return cTypes(identifier) || contains(basicObjCTypes, identifier); + } + + var cBlockKeywords = "case do else for if switch while struct enum union"; + var cDefKeywords = "struct enum union"; + + function cppHook(stream, state) { + if (!state.startOfLine) return false + for (var ch, next = null; ch = stream.peek();) { + if (ch == "\\" && stream.match(/^.$/)) { + next = cppHook + break + } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) { + break + } + stream.next() + } + state.tokenize = next + return "meta" + } + + function pointerHook(_stream, state) { + if (state.prevToken == "type") return "type"; + return false; + } + + // For C and C++ (and ObjC): identifiers starting with __ + // or _ followed by a capital letter are reserved for the compiler. + function cIsReservedIdentifier(token) { + if (!token || token.length < 2) return false; + if (token[0] != '_') return false; + return (token[1] == '_') || (token[1] !== token[1].toLowerCase()); + } + + function cpp14Literal(stream) { + stream.eatWhile(/[\w\.']/); + return "number"; + } + + function cpp11StringHook(stream, state) { + stream.backUp(1); + // Raw strings. + if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) { + var match = stream.match(/^"([^\s\\()]{0,16})\(/); + if (!match) { + return false; + } + state.cpp11RawStringDelim = match[1]; + state.tokenize = tokenRawString; + return tokenRawString(stream, state); + } + // Unicode strings/chars. + if (stream.match(/^(?:u8|u|U|L)/)) { + if (stream.match(/^["']/, /* eat */ false)) { + return "string"; + } + return false; + } + // Ignore this hook. + stream.next(); + return false; + } + + function cppLooksLikeConstructor(word) { + var lastTwo = /(\w+)::~?(\w+)$/.exec(word); + return lastTwo && lastTwo[1] == lastTwo[2]; + } + + // C#-style strings where "" escapes a quote. + function tokenAtString(stream, state) { + var next; + while ((next = stream.next()) != null) { + if (next == '"' && !stream.eat('"')) { + state.tokenize = null; + break; + } + } + return "string"; + } + + // C++11 raw string literal is "( anything )", where + // can be a string up to 16 characters long. + function tokenRawString(stream, state) { + // Escape characters that have special regex meanings. + var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); + var match = stream.match(new RegExp(".*?\\)" + delim + '"')); + if (match) + state.tokenize = null; + else + stream.skipToEnd(); + return "string"; + } + + function def(mimes, mode) { + if (typeof mimes == "string") mimes = [mimes]; + var words = []; + function add(obj) { + if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) + words.push(prop); + } + add(mode.keywords); + add(mode.types); + add(mode.builtin); + add(mode.atoms); + if (words.length) { + mode.helperType = mimes[0]; + CodeMirror.registerHelper("hintWords", mimes[0], words); + } + + for (var i = 0; i < mimes.length; ++i) + CodeMirror.defineMIME(mimes[i], mode); + } + + def(["text/x-csrc", "text/x-c", "text/x-chdr"], { + name: "clike", + keywords: words(cKeywords), + types: cTypes, + blockKeywords: words(cBlockKeywords), + defKeywords: words(cDefKeywords), + typeFirstDefinitions: true, + atoms: words("NULL true false"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + }, + modeProps: {fold: ["brace", "include"]} + }); + + def(["text/x-c++src", "text/x-c++hdr"], { + name: "clike", + keywords: words(cKeywords + " " + cppKeywords), + types: cTypes, + blockKeywords: words(cBlockKeywords + " class try catch"), + defKeywords: words(cDefKeywords + " class namespace"), + typeFirstDefinitions: true, + atoms: words("true false NULL nullptr"), + dontIndentStatements: /^template$/, + isIdentifierChar: /[\w\$_~\xa1-\uffff]/, + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && + (state.prevToken == ";" || state.prevToken == null || + state.prevToken == "}") && + cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-java", { + name: "clike", + keywords: words("abstract assert break case catch class const continue default " + + "do else enum extends final finally for goto if implements import " + + "instanceof interface native new package private protected public " + + "return static strictfp super switch synchronized this throw throws transient " + + "try volatile while @interface"), + types: words("var byte short int long float double boolean char void Boolean Byte Character Double Float " + + "Integer Long Number Object Short String StringBuffer StringBuilder Void"), + blockKeywords: words("catch class do else finally for if switch try while"), + defKeywords: words("class interface enum @interface"), + typeFirstDefinitions: true, + atoms: words("true false null"), + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + hooks: { + "@": function(stream) { + // Don't match the @interface keyword. + if (stream.match('interface', false)) return false; + + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match(/""$/)) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + } + }, + modeProps: {fold: ["brace", "import"]} + }); + + def("text/x-csharp", { + name: "clike", + keywords: words("abstract as async await base break case catch checked class const continue" + + " default delegate do else enum event explicit extern finally fixed for" + + " foreach goto if implicit in interface internal is lock namespace new" + + " operator out override params private protected public readonly ref return sealed" + + " sizeof stackalloc static struct switch this throw try typeof unchecked" + + " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + + " global group into join let orderby partial remove select set value var yield"), + types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" + + " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" + + " UInt64 bool byte char decimal double short int long object" + + " sbyte float string ushort uint ulong"), + blockKeywords: words("catch class do else finally for foreach if struct switch try while"), + defKeywords: words("class interface namespace struct var"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: { + "@": function(stream, state) { + if (stream.eat('"')) { + state.tokenize = tokenAtString; + return tokenAtString(stream, state); + } + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + } + }); + + function tokenTripleString(stream, state) { + var escaped = false; + while (!stream.eol()) { + if (!escaped && stream.match('"""')) { + state.tokenize = null; + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + function tokenNestedComment(depth) { + return function (stream, state) { + var ch + while (ch = stream.next()) { + if (ch == "*" && stream.eat("/")) { + if (depth == 1) { + state.tokenize = null + break + } else { + state.tokenize = tokenNestedComment(depth - 1) + return state.tokenize(stream, state) + } + } else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenNestedComment(depth + 1) + return state.tokenize(stream, state) + } + } + return "comment" + } + } + + def("text/x-scala", { + name: "clike", + keywords: words( + /* scala */ + "abstract case catch class def do else extends final finally for forSome if " + + "implicit import lazy match new null object override package private protected return " + + "sealed super this throw trait try type val var while with yield _ " + + + /* package scala */ + "assert assume require print println printf readLine readBoolean readByte readShort " + + "readChar readInt readLong readFloat readDouble" + ), + types: words( + "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + + "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " + + "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + + "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + + "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " + + + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" + ), + multiLineStrings: true, + blockKeywords: words("catch class enum do else finally for forSome if match switch try while"), + defKeywords: words("class enum def object package trait type val var"), + atoms: words("true false null"), + indentStatements: false, + indentSwitch: false, + isOperatorChar: /[+\-*&%=<>!?|\/#:@]/, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match('""')) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + "=": function(stream, state) { + var cx = state.context + if (cx.type == "}" && cx.align && stream.eat(">")) { + state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev) + return "operator" + } else { + return false + } + }, + + "/": function(stream, state) { + if (!stream.eat("*")) return false + state.tokenize = tokenNestedComment(1) + return state.tokenize(stream, state) + } + }, + modeProps: {closeBrackets: {pairs: '()[]{}""', triples: '"'}} + }); + + function tokenKotlinString(tripleString){ + return function (stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!tripleString && !escaped && stream.match('"') ) {end = true; break;} + if (tripleString && stream.match('"""')) {end = true; break;} + next = stream.next(); + if(!escaped && next == "$" && stream.match('{')) + stream.skipTo("}"); + escaped = !escaped && next == "\\" && !tripleString; + } + if (end || !tripleString) + state.tokenize = null; + return "string"; + } + } + + def("text/x-kotlin", { + name: "clike", + keywords: words( + /*keywords*/ + "package as typealias class interface this super val operator " + + "var fun for is in This throw return annotation " + + "break continue object if else while do try when !in !is as? " + + + /*soft keywords*/ + "file import where by get set abstract enum open inner override private public internal " + + "protected catch finally out final vararg reified dynamic companion constructor init " + + "sealed field property receiver param sparam lateinit data inline noinline tailrec " + + "external annotation crossinline const operator infix suspend actual expect setparam value" + ), + types: words( + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray " + + "ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy " + + "LazyThreadSafetyMode LongArray Nothing ShortArray Unit" + ), + intendSwitch: false, + indentStatements: false, + multiLineStrings: true, + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+(\.\d+)?|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + blockKeywords: words("catch class do else finally for if where try while enum"), + defKeywords: words("class val var object interface fun"), + atoms: words("true false null this"), + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '*': function(_stream, state) { + return state.prevToken == '.' ? 'variable' : 'operator'; + }, + '"': function(stream, state) { + state.tokenize = tokenKotlinString(stream.match('""')); + return state.tokenize(stream, state); + }, + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenNestedComment(1); + return state.tokenize(stream, state) + }, + indent: function(state, ctx, textAfter, indentUnit) { + var firstChar = textAfter && textAfter.charAt(0); + if ((state.prevToken == "}" || state.prevToken == ")") && textAfter == "") + return state.indented; + if ((state.prevToken == "operator" && textAfter != "}" && state.context.type != "}") || + state.prevToken == "variable" && firstChar == "." || + (state.prevToken == "}" || state.prevToken == ")") && firstChar == ".") + return indentUnit * 2 + ctx.indented; + if (ctx.align && ctx.type == "}") + return ctx.indented + (state.context.type == (textAfter || "").charAt(0) ? 0 : indentUnit); + } + }, + modeProps: {closeBrackets: {triples: '"'}} + }); + + def(["x-shader/x-vertex", "x-shader/x-fragment"], { + name: "clike", + keywords: words("sampler1D sampler2D sampler3D samplerCube " + + "sampler1DShadow sampler2DShadow " + + "const attribute uniform varying " + + "break continue discard return " + + "for while do if else struct " + + "in out inout"), + types: words("float int bool void " + + "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + + "mat2 mat3 mat4"), + blockKeywords: words("for while do if else struct"), + builtin: words("radians degrees sin cos tan asin acos atan " + + "pow exp log exp2 sqrt inversesqrt " + + "abs sign floor ceil fract mod min max clamp mix step smoothstep " + + "length distance dot cross normalize ftransform faceforward " + + "reflect refract matrixCompMult " + + "lessThan lessThanEqual greaterThan greaterThanEqual " + + "equal notEqual any all not " + + "texture1D texture1DProj texture1DLod texture1DProjLod " + + "texture2D texture2DProj texture2DLod texture2DProjLod " + + "texture3D texture3DProj texture3DLod texture3DProjLod " + + "textureCube textureCubeLod " + + "shadow1D shadow2D shadow1DProj shadow2DProj " + + "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + + "dFdx dFdy fwidth " + + "noise1 noise2 noise3 noise4"), + atoms: words("true false " + + "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + + "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + + "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + + "gl_FogCoord gl_PointCoord " + + "gl_Position gl_PointSize gl_ClipVertex " + + "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + + "gl_TexCoord gl_FogFragCoord " + + "gl_FragCoord gl_FrontFacing " + + "gl_FragData gl_FragDepth " + + "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + + "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + + "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + + "gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + + "gl_ProjectionMatrixInverseTranspose " + + "gl_ModelViewProjectionMatrixInverseTranspose " + + "gl_TextureMatrixInverseTranspose " + + "gl_NormalScale gl_DepthRange gl_ClipPlane " + + "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + + "gl_FrontLightModelProduct gl_BackLightModelProduct " + + "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + + "gl_FogParameters " + + "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + + "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + + "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + + "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + + "gl_MaxDrawBuffers"), + indentSwitch: false, + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-nesc", { + name: "clike", + keywords: words(cKeywords + " as atomic async call command component components configuration event generic " + + "implementation includes interface module new norace nx_struct nx_union post provides " + + "signal task uses abstract extends"), + types: cTypes, + blockKeywords: words(cBlockKeywords), + atoms: words("null true false"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-objectivec", { + name: "clike", + keywords: words(cKeywords + " " + objCKeywords), + types: objCTypes, + builtin: words(objCBuiltins), + blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized"), + defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class"), + dontIndentStatements: /^@.*$/, + typeFirstDefinitions: true, + atoms: words("YES NO NULL Nil nil true false nullptr"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + }, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-objectivec++", { + name: "clike", + keywords: words(cKeywords + " " + objCKeywords + " " + cppKeywords), + types: objCTypes, + builtin: words(objCBuiltins), + blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"), + defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class class namespace"), + dontIndentStatements: /^@.*$|^template$/, + typeFirstDefinitions: true, + atoms: words("YES NO NULL Nil nil true false nullptr"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && + (state.prevToken == ";" || state.prevToken == null || + state.prevToken == "}") && + cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-squirrel", { + name: "clike", + keywords: words("base break clone continue const default delete enum extends function in class" + + " foreach local resume return this throw typeof yield constructor instanceof static"), + types: cTypes, + blockKeywords: words("case catch class else for foreach if switch try while"), + defKeywords: words("function local class"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + // Ceylon Strings need to deal with interpolation + var stringTokenizer = null; + function tokenCeylonString(type) { + return function(stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!escaped && stream.match('"') && + (type == "single" || stream.match('""'))) { + end = true; + break; + } + if (!escaped && stream.match('``')) { + stringTokenizer = tokenCeylonString(type); + end = true; + break; + } + next = stream.next(); + escaped = type == "single" && !escaped && next == "\\"; + } + if (end) + state.tokenize = null; + return "string"; + } + } + + def("text/x-ceylon", { + name: "clike", + keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" + + " exists extends finally for function given if import in interface is let module new" + + " nonempty object of out outer package return satisfies super switch then this throw" + + " try value void while"), + types: function(word) { + // In Ceylon all identifiers that start with an uppercase are types + var first = word.charAt(0); + return (first === first.toUpperCase() && first !== first.toLowerCase()); + }, + blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"), + defKeywords: words("class dynamic function interface module object package value"), + builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" + + " native optional sealed see serializable shared suppressWarnings tagged throws variable"), + isPunctuationChar: /[\[\]{}\(\),;\:\.`]/, + isOperatorChar: /[+\-*&%=<>!?|^~:\/]/, + numberStart: /[\d#$]/, + number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i, + multiLineStrings: true, + typeFirstDefinitions: true, + atoms: words("true false null larger smaller equal empty finished"), + indentSwitch: false, + styleDefs: false, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single"); + return state.tokenize(stream, state); + }, + '`': function(stream, state) { + if (!stringTokenizer || !stream.match('`')) return false; + state.tokenize = stringTokenizer; + stringTokenizer = null; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + token: function(_stream, state, style) { + if ((style == "variable" || style == "type") && + state.prevToken == ".") { + return "variable-2"; + } + } + }, + modeProps: { + fold: ["brace", "import"], + closeBrackets: {triples: '"'} + } + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clojure/clojure.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clojure/clojure.js new file mode 100644 index 0000000000..0b9d6acc3e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/clojure/clojure.js @@ -0,0 +1,292 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports === "object" && typeof module === "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define === "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("clojure", function (options) { + var atoms = ["false", "nil", "true"]; + var specialForms = [".", "catch", "def", "do", "if", "monitor-enter", + "monitor-exit", "new", "quote", "recur", "set!", "throw", "try", "var"]; + var coreSymbols = ["*", "*'", "*1", "*2", "*3", "*agent*", + "*allow-unresolved-vars*", "*assert*", "*clojure-version*", + "*command-line-args*", "*compile-files*", "*compile-path*", + "*compiler-options*", "*data-readers*", "*default-data-reader-fn*", "*e", + "*err*", "*file*", "*flush-on-newline*", "*fn-loader*", "*in*", + "*math-context*", "*ns*", "*out*", "*print-dup*", "*print-length*", + "*print-level*", "*print-meta*", "*print-namespace-maps*", + "*print-readably*", "*read-eval*", "*reader-resolver*", "*source-path*", + "*suppress-read*", "*unchecked-math*", "*use-context-classloader*", + "*verbose-defrecords*", "*warn-on-reflection*", "+", "+'", "-", "-'", + "->", "->>", "->ArrayChunk", "->Eduction", "->Vec", "->VecNode", + "->VecSeq", "-cache-protocol-fn", "-reset-methods", "..", "/", "<", "<=", + "=", "==", ">", ">=", "EMPTY-NODE", "Inst", "StackTraceElement->vec", + "Throwable->map", "accessor", "aclone", "add-classpath", "add-watch", + "agent", "agent-error", "agent-errors", "aget", "alength", "alias", + "all-ns", "alter", "alter-meta!", "alter-var-root", "amap", "ancestors", + "and", "any?", "apply", "areduce", "array-map", "as->", "aset", + "aset-boolean", "aset-byte", "aset-char", "aset-double", "aset-float", + "aset-int", "aset-long", "aset-short", "assert", "assoc", "assoc!", + "assoc-in", "associative?", "atom", "await", "await-for", "await1", + "bases", "bean", "bigdec", "bigint", "biginteger", "binding", "bit-and", + "bit-and-not", "bit-clear", "bit-flip", "bit-not", "bit-or", "bit-set", + "bit-shift-left", "bit-shift-right", "bit-test", "bit-xor", "boolean", + "boolean-array", "boolean?", "booleans", "bound-fn", "bound-fn*", + "bound?", "bounded-count", "butlast", "byte", "byte-array", "bytes", + "bytes?", "case", "cast", "cat", "char", "char-array", + "char-escape-string", "char-name-string", "char?", "chars", "chunk", + "chunk-append", "chunk-buffer", "chunk-cons", "chunk-first", "chunk-next", + "chunk-rest", "chunked-seq?", "class", "class?", "clear-agent-errors", + "clojure-version", "coll?", "comment", "commute", "comp", "comparator", + "compare", "compare-and-set!", "compile", "complement", "completing", + "concat", "cond", "cond->", "cond->>", "condp", "conj", "conj!", "cons", + "constantly", "construct-proxy", "contains?", "count", "counted?", + "create-ns", "create-struct", "cycle", "dec", "dec'", "decimal?", + "declare", "dedupe", "default-data-readers", "definline", "definterface", + "defmacro", "defmethod", "defmulti", "defn", "defn-", "defonce", + "defprotocol", "defrecord", "defstruct", "deftype", "delay", "delay?", + "deliver", "denominator", "deref", "derive", "descendants", "destructure", + "disj", "disj!", "dissoc", "dissoc!", "distinct", "distinct?", "doall", + "dorun", "doseq", "dosync", "dotimes", "doto", "double", "double-array", + "double?", "doubles", "drop", "drop-last", "drop-while", "eduction", + "empty", "empty?", "ensure", "ensure-reduced", "enumeration-seq", + "error-handler", "error-mode", "eval", "even?", "every-pred", "every?", + "ex-data", "ex-info", "extend", "extend-protocol", "extend-type", + "extenders", "extends?", "false?", "ffirst", "file-seq", "filter", + "filterv", "find", "find-keyword", "find-ns", "find-protocol-impl", + "find-protocol-method", "find-var", "first", "flatten", "float", + "float-array", "float?", "floats", "flush", "fn", "fn?", "fnext", "fnil", + "for", "force", "format", "frequencies", "future", "future-call", + "future-cancel", "future-cancelled?", "future-done?", "future?", + "gen-class", "gen-interface", "gensym", "get", "get-in", "get-method", + "get-proxy-class", "get-thread-bindings", "get-validator", "group-by", + "halt-when", "hash", "hash-combine", "hash-map", "hash-ordered-coll", + "hash-set", "hash-unordered-coll", "ident?", "identical?", "identity", + "if-let", "if-not", "if-some", "ifn?", "import", "in-ns", "inc", "inc'", + "indexed?", "init-proxy", "inst-ms", "inst-ms*", "inst?", "instance?", + "int", "int-array", "int?", "integer?", "interleave", "intern", + "interpose", "into", "into-array", "ints", "io!", "isa?", "iterate", + "iterator-seq", "juxt", "keep", "keep-indexed", "key", "keys", "keyword", + "keyword?", "last", "lazy-cat", "lazy-seq", "let", "letfn", "line-seq", + "list", "list*", "list?", "load", "load-file", "load-reader", + "load-string", "loaded-libs", "locking", "long", "long-array", "longs", + "loop", "macroexpand", "macroexpand-1", "make-array", "make-hierarchy", + "map", "map-entry?", "map-indexed", "map?", "mapcat", "mapv", "max", + "max-key", "memfn", "memoize", "merge", "merge-with", "meta", + "method-sig", "methods", "min", "min-key", "mix-collection-hash", "mod", + "munge", "name", "namespace", "namespace-munge", "nat-int?", "neg-int?", + "neg?", "newline", "next", "nfirst", "nil?", "nnext", "not", "not-any?", + "not-empty", "not-every?", "not=", "ns", "ns-aliases", "ns-imports", + "ns-interns", "ns-map", "ns-name", "ns-publics", "ns-refers", + "ns-resolve", "ns-unalias", "ns-unmap", "nth", "nthnext", "nthrest", + "num", "number?", "numerator", "object-array", "odd?", "or", "parents", + "partial", "partition", "partition-all", "partition-by", "pcalls", "peek", + "persistent!", "pmap", "pop", "pop!", "pop-thread-bindings", "pos-int?", + "pos?", "pr", "pr-str", "prefer-method", "prefers", + "primitives-classnames", "print", "print-ctor", "print-dup", + "print-method", "print-simple", "print-str", "printf", "println", + "println-str", "prn", "prn-str", "promise", "proxy", + "proxy-call-with-super", "proxy-mappings", "proxy-name", "proxy-super", + "push-thread-bindings", "pvalues", "qualified-ident?", + "qualified-keyword?", "qualified-symbol?", "quot", "rand", "rand-int", + "rand-nth", "random-sample", "range", "ratio?", "rational?", + "rationalize", "re-find", "re-groups", "re-matcher", "re-matches", + "re-pattern", "re-seq", "read", "read-line", "read-string", + "reader-conditional", "reader-conditional?", "realized?", "record?", + "reduce", "reduce-kv", "reduced", "reduced?", "reductions", "ref", + "ref-history-count", "ref-max-history", "ref-min-history", "ref-set", + "refer", "refer-clojure", "reify", "release-pending-sends", "rem", + "remove", "remove-all-methods", "remove-method", "remove-ns", + "remove-watch", "repeat", "repeatedly", "replace", "replicate", "require", + "reset!", "reset-meta!", "reset-vals!", "resolve", "rest", + "restart-agent", "resultset-seq", "reverse", "reversible?", "rseq", + "rsubseq", "run!", "satisfies?", "second", "select-keys", "send", + "send-off", "send-via", "seq", "seq?", "seqable?", "seque", "sequence", + "sequential?", "set", "set-agent-send-executor!", + "set-agent-send-off-executor!", "set-error-handler!", "set-error-mode!", + "set-validator!", "set?", "short", "short-array", "shorts", "shuffle", + "shutdown-agents", "simple-ident?", "simple-keyword?", "simple-symbol?", + "slurp", "some", "some->", "some->>", "some-fn", "some?", "sort", + "sort-by", "sorted-map", "sorted-map-by", "sorted-set", "sorted-set-by", + "sorted?", "special-symbol?", "spit", "split-at", "split-with", "str", + "string?", "struct", "struct-map", "subs", "subseq", "subvec", "supers", + "swap!", "swap-vals!", "symbol", "symbol?", "sync", "tagged-literal", + "tagged-literal?", "take", "take-last", "take-nth", "take-while", "test", + "the-ns", "thread-bound?", "time", "to-array", "to-array-2d", + "trampoline", "transduce", "transient", "tree-seq", "true?", "type", + "unchecked-add", "unchecked-add-int", "unchecked-byte", "unchecked-char", + "unchecked-dec", "unchecked-dec-int", "unchecked-divide-int", + "unchecked-double", "unchecked-float", "unchecked-inc", + "unchecked-inc-int", "unchecked-int", "unchecked-long", + "unchecked-multiply", "unchecked-multiply-int", "unchecked-negate", + "unchecked-negate-int", "unchecked-remainder-int", "unchecked-short", + "unchecked-subtract", "unchecked-subtract-int", "underive", "unquote", + "unquote-splicing", "unreduced", "unsigned-bit-shift-right", "update", + "update-in", "update-proxy", "uri?", "use", "uuid?", "val", "vals", + "var-get", "var-set", "var?", "vary-meta", "vec", "vector", "vector-of", + "vector?", "volatile!", "volatile?", "vreset!", "vswap!", "when", + "when-first", "when-let", "when-not", "when-some", "while", + "with-bindings", "with-bindings*", "with-in-str", "with-loading-context", + "with-local-vars", "with-meta", "with-open", "with-out-str", + "with-precision", "with-redefs", "with-redefs-fn", "xml-seq", "zero?", + "zipmap"]; + var haveBodyParameter = [ + "->", "->>", "as->", "binding", "bound-fn", "case", "catch", "comment", + "cond", "cond->", "cond->>", "condp", "def", "definterface", "defmethod", + "defn", "defmacro", "defprotocol", "defrecord", "defstruct", "deftype", + "do", "doseq", "dotimes", "doto", "extend", "extend-protocol", + "extend-type", "fn", "for", "future", "if", "if-let", "if-not", "if-some", + "let", "letfn", "locking", "loop", "ns", "proxy", "reify", "struct-map", + "some->", "some->>", "try", "when", "when-first", "when-let", "when-not", + "when-some", "while", "with-bindings", "with-bindings*", "with-in-str", + "with-loading-context", "with-local-vars", "with-meta", "with-open", + "with-out-str", "with-precision", "with-redefs", "with-redefs-fn"]; + + CodeMirror.registerHelper("hintWords", "clojure", + [].concat(atoms, specialForms, coreSymbols)); + + var atom = createLookupMap(atoms); + var specialForm = createLookupMap(specialForms); + var coreSymbol = createLookupMap(coreSymbols); + var hasBodyParameter = createLookupMap(haveBodyParameter); + var delimiter = /^(?:[\\\[\]\s"(),;@^`{}~]|$)/; + var numberLiteral = /^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/; + var characterLiteral = /^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/; + + // simple-namespace := /^[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*/ + // simple-symbol := /^(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)/ + // qualified-symbol := ((<.>)*)? + var qualifiedSymbol = /^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~.][^\\\[\]\s"(),;@^`{}~.\/]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/; + + function base(stream, state) { + if (stream.eatSpace() || stream.eat(",")) return ["space", null]; + if (stream.match(numberLiteral)) return [null, "number"]; + if (stream.match(characterLiteral)) return [null, "string-2"]; + if (stream.eat(/^"/)) return (state.tokenize = inString)(stream, state); + if (stream.eat(/^[(\[{]/)) return ["open", "bracket"]; + if (stream.eat(/^[)\]}]/)) return ["close", "bracket"]; + if (stream.eat(/^;/)) {stream.skipToEnd(); return ["space", "comment"];} + if (stream.eat(/^[#'@^`~]/)) return [null, "meta"]; + + var matches = stream.match(qualifiedSymbol); + var symbol = matches && matches[0]; + + if (!symbol) { + // advance stream by at least one character so we don't get stuck. + stream.next(); + stream.eatWhile(function (c) {return !is(c, delimiter);}); + return [null, "error"]; + } + + if (symbol === "comment" && state.lastToken === "(") + return (state.tokenize = inComment)(stream, state); + if (is(symbol, atom) || symbol.charAt(0) === ":") return ["symbol", "atom"]; + if (is(symbol, specialForm) || is(symbol, coreSymbol)) return ["symbol", "keyword"]; + if (state.lastToken === "(") return ["symbol", "builtin"]; // other operator + + return ["symbol", "variable"]; + } + + function inString(stream, state) { + var escaped = false, next; + + while (next = stream.next()) { + if (next === "\"" && !escaped) {state.tokenize = base; break;} + escaped = !escaped && next === "\\"; + } + + return [null, "string"]; + } + + function inComment(stream, state) { + var parenthesisCount = 1; + var next; + + while (next = stream.next()) { + if (next === ")") parenthesisCount--; + if (next === "(") parenthesisCount++; + if (parenthesisCount === 0) { + stream.backUp(1); + state.tokenize = base; + break; + } + } + + return ["space", "comment"]; + } + + function createLookupMap(words) { + var obj = {}; + + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + + return obj; + } + + function is(value, test) { + if (test instanceof RegExp) return test.test(value); + if (test instanceof Object) return test.propertyIsEnumerable(value); + } + + return { + startState: function () { + return { + ctx: {prev: null, start: 0, indentTo: 0}, + lastToken: null, + tokenize: base + }; + }, + + token: function (stream, state) { + if (stream.sol() && (typeof state.ctx.indentTo !== "number")) + state.ctx.indentTo = state.ctx.start + 1; + + var typeStylePair = state.tokenize(stream, state); + var type = typeStylePair[0]; + var style = typeStylePair[1]; + var current = stream.current(); + + if (type !== "space") { + if (state.lastToken === "(" && state.ctx.indentTo === null) { + if (type === "symbol" && is(current, hasBodyParameter)) + state.ctx.indentTo = state.ctx.start + options.indentUnit; + else state.ctx.indentTo = "next"; + } else if (state.ctx.indentTo === "next") { + state.ctx.indentTo = stream.column(); + } + + state.lastToken = current; + } + + if (type === "open") + state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null}; + else if (type === "close") state.ctx = state.ctx.prev || state.ctx; + + return style; + }, + + indent: function (state) { + var i = state.ctx.indentTo; + + return (typeof i === "number") ? + i : + state.ctx.start + 1; + }, + + closeBrackets: {pairs: "()[]{}\"\""}, + lineComment: ";;" + }; +}); + +CodeMirror.defineMIME("text/x-clojure", "clojure"); +CodeMirror.defineMIME("text/x-clojurescript", "clojure"); +CodeMirror.defineMIME("application/edn", "clojure"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cmake/cmake.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cmake/cmake.js new file mode 100644 index 0000000000..496c71d1fd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cmake/cmake.js @@ -0,0 +1,97 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("cmake", function () { + var variable_regex = /({)?[a-zA-Z0-9_]+(})?/; + + function tokenString(stream, state) { + var current, prev, found_var = false; + while (!stream.eol() && (current = stream.next()) != state.pending) { + if (current === '$' && prev != '\\' && state.pending == '"') { + found_var = true; + break; + } + prev = current; + } + if (found_var) { + stream.backUp(1); + } + if (current == state.pending) { + state.continueString = false; + } else { + state.continueString = true; + } + return "string"; + } + + function tokenize(stream, state) { + var ch = stream.next(); + + // Have we found a variable? + if (ch === '$') { + if (stream.match(variable_regex)) { + return 'variable-2'; + } + return 'variable'; + } + // Should we still be looking for the end of a string? + if (state.continueString) { + // If so, go through the loop again + stream.backUp(1); + return tokenString(stream, state); + } + // Do we just have a function on our hands? + // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched + if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) { + stream.backUp(1); + return 'def'; + } + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + // Have we found a string? + if (ch == "'" || ch == '"') { + // Store the type (single or double) + state.pending = ch; + // Perform the looping function to find the end + return tokenString(stream, state); + } + if (ch == '(' || ch == ')') { + return 'bracket'; + } + if (ch.match(/[0-9]/)) { + return 'number'; + } + stream.eatWhile(/[\w-]/); + return null; + } + return { + startState: function () { + var state = {}; + state.inDefinition = false; + state.inInclude = false; + state.continueString = false; + state.pending = false; + return state; + }, + token: function (stream, state) { + if (stream.eatSpace()) return null; + return tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME("text/x-cmake", "cmake"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cobol/cobol.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cobol/cobol.js new file mode 100644 index 0000000000..a7aeafa03a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cobol/cobol.js @@ -0,0 +1,255 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Author: Gautam Mehta + * Branched from CodeMirror's Scheme mode + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("cobol", function () { + var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", + ATOM = "atom", NUMBER = "number", KEYWORD = "keyword", MODTAG = "header", + COBOLLINENUM = "def", PERIOD = "link"; + function makeKeywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var atoms = makeKeywords("TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES "); + var keywords = makeKeywords( + "ACCEPT ACCESS ACQUIRE ADD ADDRESS " + + "ADVANCING AFTER ALIAS ALL ALPHABET " + + "ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED " + + "ALSO ALTER ALTERNATE AND ANY " + + "ARE AREA AREAS ARITHMETIC ASCENDING " + + "ASSIGN AT ATTRIBUTE AUTHOR AUTO " + + "AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS " + + "B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP " + + "BEFORE BELL BINARY BIT BITS " + + "BLANK BLINK BLOCK BOOLEAN BOTTOM " + + "BY CALL CANCEL CD CF " + + "CH CHARACTER CHARACTERS CLASS CLOCK-UNITS " + + "CLOSE COBOL CODE CODE-SET COL " + + "COLLATING COLUMN COMMA COMMIT COMMITMENT " + + "COMMON COMMUNICATION COMP COMP-0 COMP-1 " + + "COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 " + + "COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 " + + "COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 " + + "COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE " + + "CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS " + + "CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS " + + "CONVERTING COPY CORR CORRESPONDING COUNT " + + "CRT CRT-UNDER CURRENCY CURRENT CURSOR " + + "DATA DATE DATE-COMPILED DATE-WRITTEN DAY " + + "DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION " + + "DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS " + + "DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE " + + "DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING " + + "DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED " + + "DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION " + + "DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 " + + "DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 " + + "DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION " + + "DOWN DROP DUPLICATE DUPLICATES DYNAMIC " + + "EBCDIC EGI EJECT ELSE EMI " + + "EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. " + + "END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY " + + "END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY " + + "END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN " + + "END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT " + + "END-UNSTRING END-WRITE END-XML ENTER ENTRY " + + "ENVIRONMENT EOP EQUAL EQUALS ERASE " + + "ERROR ESI EVALUATE EVERY EXCEEDS " + + "EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL " + + "EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL " + + "FILE-STREAM FILES FILLER FINAL FIND " + + "FINISH FIRST FOOTING FOR FOREGROUND-COLOR " + + "FOREGROUND-COLOUR FORMAT FREE FROM FULL " + + "FUNCTION GENERATE GET GIVING GLOBAL " + + "GO GOBACK GREATER GROUP HEADING " + + "HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL " + + "ID IDENTIFICATION IF IN INDEX " + + "INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 " + + "INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED " + + "INDIC INDICATE INDICATOR INDICATORS INITIAL " + + "INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT " + + "INSTALLATION INTO INVALID INVOKE IS " + + "JUST JUSTIFIED KANJI KEEP KEY " + + "LABEL LAST LD LEADING LEFT " + + "LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY " + + "LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER " + + "LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE " + + "LOCALE LOCALLY LOCK " + + "MEMBER MEMORY MERGE MESSAGE METACLASS " + + "MODE MODIFIED MODIFY MODULES MOVE " + + "MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE " + + "NEXT NO NO-ECHO NONE NOT " + + "NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER " + + "NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS " + + "OF OFF OMITTED ON ONLY " + + "OPEN OPTIONAL OR ORDER ORGANIZATION " + + "OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL " + + "PADDING PAGE PAGE-COUNTER PARSE PERFORM " + + "PF PH PIC PICTURE PLUS " + + "POINTER POSITION POSITIVE PREFIX PRESENT " + + "PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES " + + "PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID " + + "PROMPT PROTECTED PURGE QUEUE QUOTE " + + "QUOTES RANDOM RD READ READY " + + "REALM RECEIVE RECONNECT RECORD RECORD-NAME " + + "RECORDS RECURSIVE REDEFINES REEL REFERENCE " + + "REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE " + + "REMAINDER REMOVAL RENAMES REPEATED REPLACE " + + "REPLACING REPORT REPORTING REPORTS REPOSITORY " + + "REQUIRED RERUN RESERVE RESET RETAINING " + + "RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO " + + "REVERSED REWIND REWRITE RF RH " + + "RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED " + + "RUN SAME SCREEN SD SEARCH " + + "SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT " + + "SELECT SEND SENTENCE SEPARATE SEQUENCE " + + "SEQUENTIAL SET SHARED SIGN SIZE " + + "SKIP1 SKIP2 SKIP3 SORT SORT-MERGE " + + "SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL " + + "SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 " + + "START STARTING STATUS STOP STORE " + + "STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA " + + "SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS " + + "SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT " + + "TABLE TALLYING TAPE TENANT TERMINAL " + + "TERMINATE TEST TEXT THAN THEN " + + "THROUGH THRU TIME TIMES TITLE " + + "TO TOP TRAILING TRAILING-SIGN TRANSACTION " + + "TYPE TYPEDEF UNDERLINE UNEQUAL UNIT " + + "UNSTRING UNTIL UP UPDATE UPON " + + "USAGE USAGE-MODE USE USING VALID " + + "VALIDATE VALUE VALUES VARYING VLR " + + "WAIT WHEN WHEN-COMPILED WITH WITHIN " + + "WORDS WORKING-STORAGE WRITE XML XML-CODE " + + "XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL " ); + + var builtins = makeKeywords("- * ** / + < <= = > >= "); + var tests = { + digit: /\d/, + digit_or_colon: /[\d:]/, + hex: /[0-9a-f]/i, + sign: /[+-]/, + exponent: /e/i, + keyword_char: /[^\s\(\[\;\)\]]/, + symbol: /[\w*+\-]/ + }; + function isNumber(ch, stream){ + // hex + if ( ch === '0' && stream.eat(/x/i) ) { + stream.eatWhile(tests.hex); + return true; + } + // leading sign + if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { + stream.eat(tests.sign); + ch = stream.next(); + } + if ( tests.digit.test(ch) ) { + stream.eat(ch); + stream.eatWhile(tests.digit); + if ( '.' == stream.peek()) { + stream.eat('.'); + stream.eatWhile(tests.digit); + } + if ( stream.eat(tests.exponent) ) { + stream.eat(tests.sign); + stream.eatWhile(tests.digit); + } + return true; + } + return false; + } + return { + startState: function () { + return { + indentStack: null, + indentation: 0, + mode: false + }; + }, + token: function (stream, state) { + if (state.indentStack == null && stream.sol()) { + // update indentation, but only if indentStack is empty + state.indentation = 6 ; //stream.indentation(); + } + // skip spaces + if (stream.eatSpace()) { + return null; + } + var returnType = null; + switch(state.mode){ + case "string": // multi-line string parsing mode + var next = false; + while ((next = stream.next()) != null) { + if ((next == "\"" || next == "\'") && !stream.match(/['"]/, false)) { + state.mode = false; + break; + } + } + returnType = STRING; // continue on in string mode + break; + default: // default parsing mode + var ch = stream.next(); + var col = stream.column(); + if (col >= 0 && col <= 5) { + returnType = COBOLLINENUM; + } else if (col >= 72 && col <= 79) { + stream.skipToEnd(); + returnType = MODTAG; + } else if (ch == "*" && col == 6) { // comment + stream.skipToEnd(); // rest of the line is a comment + returnType = COMMENT; + } else if (ch == "\"" || ch == "\'") { + state.mode = "string"; + returnType = STRING; + } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { + returnType = ATOM; + } else if (ch == ".") { + returnType = PERIOD; + } else if (isNumber(ch,stream)){ + returnType = NUMBER; + } else { + if (stream.current().match(tests.symbol)) { + while (col < 71) { + if (stream.eat(tests.symbol) === undefined) { + break; + } else { + col++; + } + } + } + if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { + returnType = KEYWORD; + } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) { + returnType = BUILTIN; + } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) { + returnType = ATOM; + } else returnType = null; + } + } + return returnType; + }, + indent: function (state) { + if (state.indentStack == null) return state.indentation; + return state.indentStack.indent; + } + }; +}); + +CodeMirror.defineMIME("text/x-cobol", "cobol"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/coffeescript/coffeescript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/coffeescript/coffeescript.js new file mode 100644 index 0000000000..a54e9d5ed0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/coffeescript/coffeescript.js @@ -0,0 +1,359 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Link to the project's GitHub page: + * https://github.com/pickhardt/coffeescript-codemirror-mode + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("coffeescript", function(conf, parserConf) { + var ERRORCLASS = "error"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/; + var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/; + var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/; + var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/; + + var wordOperators = wordRegexp(["and", "or", "not", + "is", "isnt", "in", + "instanceof", "typeof"]); + var indentKeywords = ["for", "while", "loop", "if", "unless", "else", + "switch", "try", "catch", "finally", "class"]; + var commonKeywords = ["break", "by", "continue", "debugger", "delete", + "do", "in", "of", "new", "return", "then", + "this", "@", "throw", "when", "until", "extends"]; + + var keywords = wordRegexp(indentKeywords.concat(commonKeywords)); + + indentKeywords = wordRegexp(indentKeywords); + + + var stringPrefixes = /^('{3}|\"{3}|['\"])/; + var regexPrefixes = /^(\/{3}|\/)/; + var commonConstants = ["Infinity", "NaN", "undefined", "null", "true", "false", "on", "off", "yes", "no"]; + var constants = wordRegexp(commonConstants); + + // Tokenizers + function tokenBase(stream, state) { + // Handle scope changes + if (stream.sol()) { + if (state.scope.align === null) state.scope.align = false; + var scopeOffset = state.scope.offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset && state.scope.type == "coffee") { + return "indent"; + } else if (lineOffset < scopeOffset) { + return "dedent"; + } + return null; + } else { + if (scopeOffset > 0) { + dedent(stream, state); + } + } + } + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle docco title comment (single line) + if (stream.match("####")) { + stream.skipToEnd(); + return "comment"; + } + + // Handle multi line comments + if (stream.match("###")) { + state.tokenize = longComment; + return state.tokenize(stream, state); + } + + // Single line comment + if (ch === "#") { + stream.skipToEnd(); + return "comment"; + } + + // Handle number literals + if (stream.match(/^-?[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)) { + floatLiteral = true; + } + if (stream.match(/^-?\d+\.\d*/)) { + floatLiteral = true; + } + if (stream.match(/^-?\.\d+/)) { + floatLiteral = true; + } + + if (floatLiteral) { + // prevent from getting extra . on 1.. + if (stream.peek() == "."){ + stream.backUp(1); + } + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^-?0x[0-9a-f]+/i)) { + intLiteral = true; + } + // Decimal + if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)) { + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^-?0(?![\dx])/i)) { + intLiteral = true; + } + if (intLiteral) { + return "number"; + } + } + + // Handle strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenFactory(stream.current(), false, "string"); + return state.tokenize(stream, state); + } + // Handle regex literals + if (stream.match(regexPrefixes)) { + if (stream.current() != "/" || stream.match(/^.*\//, false)) { // prevent highlight of division + state.tokenize = tokenFactory(stream.current(), true, "string-2"); + return state.tokenize(stream, state); + } else { + stream.backUp(1); + } + } + + + + // Handle operators and delimiters + if (stream.match(operators) || stream.match(wordOperators)) { + return "operator"; + } + if (stream.match(delimiters)) { + return "punctuation"; + } + + if (stream.match(constants)) { + return "atom"; + } + + if (stream.match(atProp) || state.prop && stream.match(identifiers)) { + return "property"; + } + + if (stream.match(keywords)) { + return "keyword"; + } + + if (stream.match(identifiers)) { + return "variable"; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenFactory(delimiter, singleline, outclass) { + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\/\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) { + return outclass; + } + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return outclass; + } else { + stream.eat(/['"\/]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + outclass = ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return outclass; + }; + } + + function longComment(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^#]/); + if (stream.match("###")) { + state.tokenize = tokenBase; + break; + } + stream.eatWhile("#"); + } + return "comment"; + } + + function indent(stream, state, type) { + type = type || "coffee"; + var offset = 0, align = false, alignOffset = null; + for (var scope = state.scope; scope; scope = scope.prev) { + if (scope.type === "coffee" || scope.type == "}") { + offset = scope.offset + conf.indentUnit; + break; + } + } + if (type !== "coffee") { + align = null; + alignOffset = stream.column() + stream.current().length; + } else if (state.scope.align) { + state.scope.align = false; + } + state.scope = { + offset: offset, + type: type, + prev: state.scope, + align: align, + alignOffset: alignOffset + }; + } + + function dedent(stream, state) { + if (!state.scope.prev) return; + if (state.scope.type === "coffee") { + var _indent = stream.indentation(); + var matched = false; + for (var scope = state.scope; scope; scope = scope.prev) { + if (_indent === scope.offset) { + matched = true; + break; + } + } + if (!matched) { + return true; + } + while (state.scope.prev && state.scope.offset !== _indent) { + state.scope = state.scope.prev; + } + return false; + } else { + state.scope = state.scope.prev; + return false; + } + } + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle scope changes. + if (current === "return") { + state.dedent = true; + } + if (((current === "->" || current === "=>") && stream.eol()) + || style === "indent") { + indent(stream, state); + } + var delimiter_index = "[({".indexOf(current); + if (delimiter_index !== -1) { + indent(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + } + if (indentKeywords.exec(current)){ + indent(stream, state); + } + if (current == "then"){ + dedent(stream, state); + } + + + if (style === "dedent") { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + delimiter_index = "])}".indexOf(current); + if (delimiter_index !== -1) { + while (state.scope.type == "coffee" && state.scope.prev) + state.scope = state.scope.prev; + if (state.scope.type == current) + state.scope = state.scope.prev; + } + if (state.dedent && stream.eol()) { + if (state.scope.type == "coffee" && state.scope.prev) + state.scope = state.scope.prev; + state.dedent = false; + } + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false}, + prop: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var fillAlign = state.scope.align === null && state.scope; + if (fillAlign && stream.sol()) fillAlign.align = false; + + var style = tokenLexer(stream, state); + if (style && style != "comment") { + if (fillAlign) fillAlign.align = true; + state.prop = style == "punctuation" && stream.current() == "." + } + + return style; + }, + + indent: function(state, text) { + if (state.tokenize != tokenBase) return 0; + var scope = state.scope; + var closer = text && "])}".indexOf(text.charAt(0)) > -1; + if (closer) while (scope.type == "coffee" && scope.prev) scope = scope.prev; + var closes = closer && scope.type === text.charAt(0); + if (scope.align) + return scope.alignOffset - (closes ? 1 : 0); + else + return (closes ? scope.prev : scope).offset; + }, + + lineComment: "#", + fold: "indent" + }; + return external; +}); + +// IANA registered media type +// https://www.iana.org/assignments/media-types/ +CodeMirror.defineMIME("application/vnd.coffeescript", "coffeescript"); + +CodeMirror.defineMIME("text/x-coffeescript", "coffeescript"); +CodeMirror.defineMIME("text/coffeescript", "coffeescript"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/commonlisp/commonlisp.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/commonlisp/commonlisp.js new file mode 100644 index 0000000000..e8528a9cf5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/commonlisp/commonlisp.js @@ -0,0 +1,125 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("commonlisp", function (config) { + var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/; + var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/; + var numLiteral = /^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/; + var symbol = /[^\s'`,@()\[\]";]/; + var type; + + function readSym(stream) { + var ch; + while (ch = stream.next()) { + if (ch == "\\") stream.next(); + else if (!symbol.test(ch)) { stream.backUp(1); break; } + } + return stream.current(); + } + + function base(stream, state) { + if (stream.eatSpace()) {type = "ws"; return null;} + if (stream.match(numLiteral)) return "number"; + var ch = stream.next(); + if (ch == "\\") ch = stream.next(); + + if (ch == '"') return (state.tokenize = inString)(stream, state); + else if (ch == "(") { type = "open"; return "bracket"; } + else if (ch == ")" || ch == "]") { type = "close"; return "bracket"; } + else if (ch == ";") { stream.skipToEnd(); type = "ws"; return "comment"; } + else if (/['`,@]/.test(ch)) return null; + else if (ch == "|") { + if (stream.skipTo("|")) { stream.next(); return "symbol"; } + else { stream.skipToEnd(); return "error"; } + } else if (ch == "#") { + var ch = stream.next(); + if (ch == "(") { type = "open"; return "bracket"; } + else if (/[+\-=\.']/.test(ch)) return null; + else if (/\d/.test(ch) && stream.match(/^\d*#/)) return null; + else if (ch == "|") return (state.tokenize = inComment)(stream, state); + else if (ch == ":") { readSym(stream); return "meta"; } + else if (ch == "\\") { stream.next(); readSym(stream); return "string-2" } + else return "error"; + } else { + var name = readSym(stream); + if (name == ".") return null; + type = "symbol"; + if (name == "nil" || name == "t" || name.charAt(0) == ":") return "atom"; + if (state.lastType == "open" && (specialForm.test(name) || assumeBody.test(name))) return "keyword"; + if (name.charAt(0) == "&") return "variable-2"; + return "variable"; + } + } + + function inString(stream, state) { + var escaped = false, next; + while (next = stream.next()) { + if (next == '"' && !escaped) { state.tokenize = base; break; } + escaped = !escaped && next == "\\"; + } + return "string"; + } + + function inComment(stream, state) { + var next, last; + while (next = stream.next()) { + if (next == "#" && last == "|") { state.tokenize = base; break; } + last = next; + } + type = "ws"; + return "comment"; + } + + return { + startState: function () { + return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base}; + }, + + token: function (stream, state) { + if (stream.sol() && typeof state.ctx.indentTo != "number") + state.ctx.indentTo = state.ctx.start + 1; + + type = null; + var style = state.tokenize(stream, state); + if (type != "ws") { + if (state.ctx.indentTo == null) { + if (type == "symbol" && assumeBody.test(stream.current())) + state.ctx.indentTo = state.ctx.start + config.indentUnit; + else + state.ctx.indentTo = "next"; + } else if (state.ctx.indentTo == "next") { + state.ctx.indentTo = stream.column(); + } + state.lastType = type; + } + if (type == "open") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null}; + else if (type == "close") state.ctx = state.ctx.prev || state.ctx; + return style; + }, + + indent: function (state, _textAfter) { + var i = state.ctx.indentTo; + return typeof i == "number" ? i : state.ctx.start + 1; + }, + + closeBrackets: {pairs: "()[]{}\"\""}, + lineComment: ";;", + fold: "brace-paren", + blockCommentStart: "#|", + blockCommentEnd: "|#" + }; +}); + +CodeMirror.defineMIME("text/x-common-lisp", "commonlisp"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/crystal/crystal.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/crystal/crystal.js new file mode 100644 index 0000000000..5dae5032b4 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/crystal/crystal.js @@ -0,0 +1,433 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("crystal", function(config) { + function wordRegExp(words, end) { + return new RegExp((end ? "" : "^") + "(?:" + words.join("|") + ")" + (end ? "$" : "\\b")); + } + + function chain(tokenize, stream, state) { + state.tokenize.push(tokenize); + return tokenize(stream, state); + } + + var operators = /^(?:[-+/%|&^]|\*\*?|[<>]{2})/; + var conditionalOperators = /^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/; + var indexingOperators = /^(?:\[\][?=]?)/; + var anotherOperators = /^(?:\.(?:\.{2})?|->|[?:])/; + var idents = /^[a-z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; + var types = /^[A-Z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; + var keywords = wordRegExp([ + "abstract", "alias", "as", "asm", "begin", "break", "case", "class", "def", "do", + "else", "elsif", "end", "ensure", "enum", "extend", "for", "fun", "if", + "include", "instance_sizeof", "lib", "macro", "module", "next", "of", "out", "pointerof", + "private", "protected", "rescue", "return", "require", "select", "sizeof", "struct", + "super", "then", "type", "typeof", "uninitialized", "union", "unless", "until", "when", "while", "with", + "yield", "__DIR__", "__END_LINE__", "__FILE__", "__LINE__" + ]); + var atomWords = wordRegExp(["true", "false", "nil", "self"]); + var indentKeywordsArray = [ + "def", "fun", "macro", + "class", "module", "struct", "lib", "enum", "union", + "do", "for" + ]; + var indentKeywords = wordRegExp(indentKeywordsArray); + var indentExpressionKeywordsArray = ["if", "unless", "case", "while", "until", "begin", "then"]; + var indentExpressionKeywords = wordRegExp(indentExpressionKeywordsArray); + var dedentKeywordsArray = ["end", "else", "elsif", "rescue", "ensure"]; + var dedentKeywords = wordRegExp(dedentKeywordsArray); + var dedentPunctualsArray = ["\\)", "\\}", "\\]"]; + var dedentPunctuals = new RegExp("^(?:" + dedentPunctualsArray.join("|") + ")$"); + var nextTokenizer = { + "def": tokenFollowIdent, "fun": tokenFollowIdent, "macro": tokenMacroDef, + "class": tokenFollowType, "module": tokenFollowType, "struct": tokenFollowType, + "lib": tokenFollowType, "enum": tokenFollowType, "union": tokenFollowType + }; + var matching = {"[": "]", "{": "}", "(": ")", "<": ">"}; + + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return null; + } + + // Macros + if (state.lastToken != "\\" && stream.match("{%", false)) { + return chain(tokenMacro("%", "%"), stream, state); + } + + if (state.lastToken != "\\" && stream.match("{{", false)) { + return chain(tokenMacro("{", "}"), stream, state); + } + + // Comments + if (stream.peek() == "#") { + stream.skipToEnd(); + return "comment"; + } + + // Variables and keywords + var matched; + if (stream.match(idents)) { + stream.eat(/[?!]/); + + matched = stream.current(); + if (stream.eat(":")) { + return "atom"; + } else if (state.lastToken == ".") { + return "property"; + } else if (keywords.test(matched)) { + if (indentKeywords.test(matched)) { + if (!(matched == "fun" && state.blocks.indexOf("lib") >= 0) && !(matched == "def" && state.lastToken == "abstract")) { + state.blocks.push(matched); + state.currentIndent += 1; + } + } else if ((state.lastStyle == "operator" || !state.lastStyle) && indentExpressionKeywords.test(matched)) { + state.blocks.push(matched); + state.currentIndent += 1; + } else if (matched == "end") { + state.blocks.pop(); + state.currentIndent -= 1; + } + + if (nextTokenizer.hasOwnProperty(matched)) { + state.tokenize.push(nextTokenizer[matched]); + } + + return "keyword"; + } else if (atomWords.test(matched)) { + return "atom"; + } + + return "variable"; + } + + // Class variables and instance variables + // or attributes + if (stream.eat("@")) { + if (stream.peek() == "[") { + return chain(tokenNest("[", "]", "meta"), stream, state); + } + + stream.eat("@"); + stream.match(idents) || stream.match(types); + return "variable-2"; + } + + // Constants and types + if (stream.match(types)) { + return "tag"; + } + + // Symbols or ':' operator + if (stream.eat(":")) { + if (stream.eat("\"")) { + return chain(tokenQuote("\"", "atom", false), stream, state); + } else if (stream.match(idents) || stream.match(types) || + stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators)) { + return "atom"; + } + stream.eat(":"); + return "operator"; + } + + // Strings + if (stream.eat("\"")) { + return chain(tokenQuote("\"", "string", true), stream, state); + } + + // Strings or regexps or macro variables or '%' operator + if (stream.peek() == "%") { + var style = "string"; + var embed = true; + var delim; + + if (stream.match("%r")) { + // Regexps + style = "string-2"; + delim = stream.next(); + } else if (stream.match("%w")) { + embed = false; + delim = stream.next(); + } else if (stream.match("%q")) { + embed = false; + delim = stream.next(); + } else { + if(delim = stream.match(/^%([^\w\s=])/)) { + delim = delim[1]; + } else if (stream.match(/^%[a-zA-Z_\u009F-\uFFFF][\w\u009F-\uFFFF]*/)) { + // Macro variables + return "meta"; + } else if (stream.eat('%')) { + // '%' operator + return "operator"; + } + } + + if (matching.hasOwnProperty(delim)) { + delim = matching[delim]; + } + return chain(tokenQuote(delim, style, embed), stream, state); + } + + // Here Docs + if (matched = stream.match(/^<<-('?)([A-Z]\w*)\1/)) { + return chain(tokenHereDoc(matched[2], !matched[1]), stream, state) + } + + // Characters + if (stream.eat("'")) { + stream.match(/^(?:[^']|\\(?:[befnrtv0'"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\{[0-9a-fA-F]{1,6}\})))/); + stream.eat("'"); + return "atom"; + } + + // Numbers + if (stream.eat("0")) { + if (stream.eat("x")) { + stream.match(/^[0-9a-fA-F_]+/); + } else if (stream.eat("o")) { + stream.match(/^[0-7_]+/); + } else if (stream.eat("b")) { + stream.match(/^[01_]+/); + } + return "number"; + } + + if (stream.eat(/^\d/)) { + stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?/); + return "number"; + } + + // Operators + if (stream.match(operators)) { + stream.eat("="); // Operators can follow assign symbol. + return "operator"; + } + + if (stream.match(conditionalOperators) || stream.match(anotherOperators)) { + return "operator"; + } + + // Parens and braces + if (matched = stream.match(/[({[]/, false)) { + matched = matched[0]; + return chain(tokenNest(matched, matching[matched], null), stream, state); + } + + // Escapes + if (stream.eat("\\")) { + stream.next(); + return "meta"; + } + + stream.next(); + return null; + } + + function tokenNest(begin, end, style, started) { + return function (stream, state) { + if (!started && stream.match(begin)) { + state.tokenize[state.tokenize.length - 1] = tokenNest(begin, end, style, true); + state.currentIndent += 1; + return style; + } + + var nextStyle = tokenBase(stream, state); + if (stream.current() === end) { + state.tokenize.pop(); + state.currentIndent -= 1; + nextStyle = style; + } + + return nextStyle; + }; + } + + function tokenMacro(begin, end, started) { + return function (stream, state) { + if (!started && stream.match("{" + begin)) { + state.currentIndent += 1; + state.tokenize[state.tokenize.length - 1] = tokenMacro(begin, end, true); + return "meta"; + } + + if (stream.match(end + "}")) { + state.currentIndent -= 1; + state.tokenize.pop(); + return "meta"; + } + + return tokenBase(stream, state); + }; + } + + function tokenMacroDef(stream, state) { + if (stream.eatSpace()) { + return null; + } + + var matched; + if (matched = stream.match(idents)) { + if (matched == "def") { + return "keyword"; + } + stream.eat(/[?!]/); + } + + state.tokenize.pop(); + return "def"; + } + + function tokenFollowIdent(stream, state) { + if (stream.eatSpace()) { + return null; + } + + if (stream.match(idents)) { + stream.eat(/[!?]/); + } else { + stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators); + } + state.tokenize.pop(); + return "def"; + } + + function tokenFollowType(stream, state) { + if (stream.eatSpace()) { + return null; + } + + stream.match(types); + state.tokenize.pop(); + return "def"; + } + + function tokenQuote(end, style, embed) { + return function (stream, state) { + var escaped = false; + + while (stream.peek()) { + if (!escaped) { + if (stream.match("{%", false)) { + state.tokenize.push(tokenMacro("%", "%")); + return style; + } + + if (stream.match("{{", false)) { + state.tokenize.push(tokenMacro("{", "}")); + return style; + } + + if (embed && stream.match("#{", false)) { + state.tokenize.push(tokenNest("#{", "}", "meta")); + return style; + } + + var ch = stream.next(); + + if (ch == end) { + state.tokenize.pop(); + return style; + } + + escaped = embed && ch == "\\"; + } else { + stream.next(); + escaped = false; + } + } + + return style; + }; + } + + function tokenHereDoc(phrase, embed) { + return function (stream, state) { + if (stream.sol()) { + stream.eatSpace() + if (stream.match(phrase)) { + state.tokenize.pop(); + return "string"; + } + } + + var escaped = false; + while (stream.peek()) { + if (!escaped) { + if (stream.match("{%", false)) { + state.tokenize.push(tokenMacro("%", "%")); + return "string"; + } + + if (stream.match("{{", false)) { + state.tokenize.push(tokenMacro("{", "}")); + return "string"; + } + + if (embed && stream.match("#{", false)) { + state.tokenize.push(tokenNest("#{", "}", "meta")); + return "string"; + } + + escaped = embed && stream.next() == "\\"; + } else { + stream.next(); + escaped = false; + } + } + + return "string"; + } + } + + return { + startState: function () { + return { + tokenize: [tokenBase], + currentIndent: 0, + lastToken: null, + lastStyle: null, + blocks: [] + }; + }, + + token: function (stream, state) { + var style = state.tokenize[state.tokenize.length - 1](stream, state); + var token = stream.current(); + + if (style && style != "comment") { + state.lastToken = token; + state.lastStyle = style; + } + + return style; + }, + + indent: function (state, textAfter) { + textAfter = textAfter.replace(/^\s*(?:\{%)?\s*|\s*(?:%\})?\s*$/g, ""); + + if (dedentKeywords.test(textAfter) || dedentPunctuals.test(textAfter)) { + return config.indentUnit * (state.currentIndent - 1); + } + + return config.indentUnit * state.currentIndent; + }, + + fold: "indent", + electricInput: wordRegExp(dedentPunctualsArray.concat(dedentKeywordsArray), true), + lineComment: '#' + }; + }); + + CodeMirror.defineMIME("text/x-crystal", "crystal"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/css/css.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/css/css.js new file mode 100644 index 0000000000..503c48c261 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/css/css.js @@ -0,0 +1,866 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("css", function(config, parserConfig) { + var inline = parserConfig.inline + if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); + + var indentUnit = config.indentUnit, + tokenHooks = parserConfig.tokenHooks, + documentTypes = parserConfig.documentTypes || {}, + mediaTypes = parserConfig.mediaTypes || {}, + mediaFeatures = parserConfig.mediaFeatures || {}, + mediaValueKeywords = parserConfig.mediaValueKeywords || {}, + propertyKeywords = parserConfig.propertyKeywords || {}, + nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, + fontProperties = parserConfig.fontProperties || {}, + counterDescriptors = parserConfig.counterDescriptors || {}, + colorKeywords = parserConfig.colorKeywords || {}, + valueKeywords = parserConfig.valueKeywords || {}, + allowNested = parserConfig.allowNested, + lineComment = parserConfig.lineComment, + supportsAtComponent = parserConfig.supportsAtComponent === true, + highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false; + + var type, override; + function ret(style, tp) { type = tp; return style; } + + // Tokenizers + + function tokenBase(stream, state) { + var ch = stream.next(); + if (tokenHooks[ch]) { + var result = tokenHooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == "@") { + stream.eatWhile(/[\w\\\-]/); + return ret("def", stream.current()); + } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { + return ret(null, "compare"); + } else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "#") { + stream.eatWhile(/[\w\\\-]/); + return ret("atom", "hash"); + } else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (ch === "-") { + if (/[\d.]/.test(stream.peek())) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (stream.match(/^-[\w\\\-]*/)) { + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ret("variable-2", "variable-definition"); + return ret("variable-2", "variable"); + } else if (stream.match(/^\w+-/)) { + return ret("meta", "meta"); + } + } else if (/[,+>*\/]/.test(ch)) { + return ret(null, "select-op"); + } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { + return ret("qualifier", "qualifier"); + } else if (/[:;{}\[\]\(\)]/.test(ch)) { + return ret(null, ch); + } else if (stream.match(/^[\w-.]+(?=\()/)) { + if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) { + state.tokenize = tokenParenthesized; + } + return ret("variable callee", "variable"); + } else if (/[\w\\\-]/.test(ch)) { + stream.eatWhile(/[\w\\\-]/); + return ret("property", "word"); + } else { + return ret(null, null); + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + if (quote == ")") stream.backUp(1); + break; + } + escaped = !escaped && ch == "\\"; + } + if (ch == quote || !escaped && quote != ")") state.tokenize = null; + return ret("string", "string"); + }; + } + + function tokenParenthesized(stream, state) { + stream.next(); // Must be '(' + if (!stream.match(/^\s*[\"\')]/, false)) + state.tokenize = tokenString(")"); + else + state.tokenize = null; + return ret(null, "("); + } + + // Context management + + function Context(type, indent, prev) { + this.type = type; + this.indent = indent; + this.prev = prev; + } + + function pushContext(state, stream, type, indent) { + state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); + return type; + } + + function popContext(state) { + if (state.context.prev) + state.context = state.context.prev; + return state.context.type; + } + + function pass(type, stream, state) { + return states[state.context.type](type, stream, state); + } + function popAndPass(type, stream, state, n) { + for (var i = n || 1; i > 0; i--) + state.context = state.context.prev; + return pass(type, stream, state); + } + + // Parser + + function wordAsValue(stream) { + var word = stream.current().toLowerCase(); + if (valueKeywords.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords.hasOwnProperty(word)) + override = "keyword"; + else + override = "variable"; + } + + var states = {}; + + states.top = function(type, stream, state) { + if (type == "{") { + return pushContext(state, stream, "block"); + } else if (type == "}" && state.context.prev) { + return popContext(state); + } else if (supportsAtComponent && /@component/i.test(type)) { + return pushContext(state, stream, "atComponentBlock"); + } else if (/^@(-moz-)?document$/i.test(type)) { + return pushContext(state, stream, "documentTypes"); + } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) { + return pushContext(state, stream, "atBlock"); + } else if (/^@(font-face|counter-style)/i.test(type)) { + state.stateArg = type; + return "restricted_atBlock_before"; + } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) { + return "keyframes"; + } else if (type && type.charAt(0) == "@") { + return pushContext(state, stream, "at"); + } else if (type == "hash") { + override = "builtin"; + } else if (type == "word") { + override = "tag"; + } else if (type == "variable-definition") { + return "maybeprop"; + } else if (type == "interpolation") { + return pushContext(state, stream, "interpolation"); + } else if (type == ":") { + return "pseudo"; + } else if (allowNested && type == "(") { + return pushContext(state, stream, "parens"); + } + return state.context.type; + }; + + states.block = function(type, stream, state) { + if (type == "word") { + var word = stream.current().toLowerCase(); + if (propertyKeywords.hasOwnProperty(word)) { + override = "property"; + return "maybeprop"; + } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) { + override = highlightNonStandardPropertyKeywords ? "string-2" : "property"; + return "maybeprop"; + } else if (allowNested) { + override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; + return "block"; + } else { + override += " error"; + return "maybeprop"; + } + } else if (type == "meta") { + return "block"; + } else if (!allowNested && (type == "hash" || type == "qualifier")) { + override = "error"; + return "block"; + } else { + return states.top(type, stream, state); + } + }; + + states.maybeprop = function(type, stream, state) { + if (type == ":") return pushContext(state, stream, "prop"); + return pass(type, stream, state); + }; + + states.prop = function(type, stream, state) { + if (type == ";") return popContext(state); + if (type == "{" && allowNested) return pushContext(state, stream, "propBlock"); + if (type == "}" || type == "{") return popAndPass(type, stream, state); + if (type == "(") return pushContext(state, stream, "parens"); + + if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) { + override += " error"; + } else if (type == "word") { + wordAsValue(stream); + } else if (type == "interpolation") { + return pushContext(state, stream, "interpolation"); + } + return "prop"; + }; + + states.propBlock = function(type, _stream, state) { + if (type == "}") return popContext(state); + if (type == "word") { override = "property"; return "maybeprop"; } + return state.context.type; + }; + + states.parens = function(type, stream, state) { + if (type == "{" || type == "}") return popAndPass(type, stream, state); + if (type == ")") return popContext(state); + if (type == "(") return pushContext(state, stream, "parens"); + if (type == "interpolation") return pushContext(state, stream, "interpolation"); + if (type == "word") wordAsValue(stream); + return "parens"; + }; + + states.pseudo = function(type, stream, state) { + if (type == "meta") return "pseudo"; + + if (type == "word") { + override = "variable-3"; + return state.context.type; + } + return pass(type, stream, state); + }; + + states.documentTypes = function(type, stream, state) { + if (type == "word" && documentTypes.hasOwnProperty(stream.current())) { + override = "tag"; + return state.context.type; + } else { + return states.atBlock(type, stream, state); + } + }; + + states.atBlock = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "atBlock_parens"); + if (type == "}" || type == ";") return popAndPass(type, stream, state); + if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); + + if (type == "interpolation") return pushContext(state, stream, "interpolation"); + + if (type == "word") { + var word = stream.current().toLowerCase(); + if (word == "only" || word == "not" || word == "and" || word == "or") + override = "keyword"; + else if (mediaTypes.hasOwnProperty(word)) + override = "attribute"; + else if (mediaFeatures.hasOwnProperty(word)) + override = "property"; + else if (mediaValueKeywords.hasOwnProperty(word)) + override = "keyword"; + else if (propertyKeywords.hasOwnProperty(word)) + override = "property"; + else if (nonStandardPropertyKeywords.hasOwnProperty(word)) + override = highlightNonStandardPropertyKeywords ? "string-2" : "property"; + else if (valueKeywords.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords.hasOwnProperty(word)) + override = "keyword"; + else + override = "error"; + } + return state.context.type; + }; + + states.atComponentBlock = function(type, stream, state) { + if (type == "}") + return popAndPass(type, stream, state); + if (type == "{") + return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); + if (type == "word") + override = "error"; + return state.context.type; + }; + + states.atBlock_parens = function(type, stream, state) { + if (type == ")") return popContext(state); + if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); + return states.atBlock(type, stream, state); + }; + + states.restricted_atBlock_before = function(type, stream, state) { + if (type == "{") + return pushContext(state, stream, "restricted_atBlock"); + if (type == "word" && state.stateArg == "@counter-style") { + override = "variable"; + return "restricted_atBlock_before"; + } + return pass(type, stream, state); + }; + + states.restricted_atBlock = function(type, stream, state) { + if (type == "}") { + state.stateArg = null; + return popContext(state); + } + if (type == "word") { + if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || + (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) + override = "error"; + else + override = "property"; + return "maybeprop"; + } + return "restricted_atBlock"; + }; + + states.keyframes = function(type, stream, state) { + if (type == "word") { override = "variable"; return "keyframes"; } + if (type == "{") return pushContext(state, stream, "top"); + return pass(type, stream, state); + }; + + states.at = function(type, stream, state) { + if (type == ";") return popContext(state); + if (type == "{" || type == "}") return popAndPass(type, stream, state); + if (type == "word") override = "tag"; + else if (type == "hash") override = "builtin"; + return "at"; + }; + + states.interpolation = function(type, stream, state) { + if (type == "}") return popContext(state); + if (type == "{" || type == ";") return popAndPass(type, stream, state); + if (type == "word") override = "variable"; + else if (type != "variable" && type != "(" && type != ")") override = "error"; + return "interpolation"; + }; + + return { + startState: function(base) { + return {tokenize: null, + state: inline ? "block" : "top", + stateArg: null, + context: new Context(inline ? "block" : "top", base || 0, null)}; + }, + + token: function(stream, state) { + if (!state.tokenize && stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style && typeof style == "object") { + type = style[1]; + style = style[0]; + } + override = style; + if (type != "comment") + state.state = states[state.state](type, stream, state); + return override; + }, + + indent: function(state, textAfter) { + var cx = state.context, ch = textAfter && textAfter.charAt(0); + var indent = cx.indent; + if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; + if (cx.prev) { + if (ch == "}" && (cx.type == "block" || cx.type == "top" || + cx.type == "interpolation" || cx.type == "restricted_atBlock")) { + // Resume indentation from parent context. + cx = cx.prev; + indent = cx.indent; + } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || + ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { + // Dedent relative to current context. + indent = Math.max(0, cx.indent - indentUnit); + } + } + return indent; + }, + + electricChars: "}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: lineComment, + fold: "brace" + }; +}); + + function keySet(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) { + keys[array[i].toLowerCase()] = true; + } + return keys; + } + + var documentTypes_ = [ + "domain", "regexp", "url", "url-prefix" + ], documentTypes = keySet(documentTypes_); + + var mediaTypes_ = [ + "all", "aural", "braille", "handheld", "print", "projection", "screen", + "tty", "tv", "embossed" + ], mediaTypes = keySet(mediaTypes_); + + var mediaFeatures_ = [ + "width", "min-width", "max-width", "height", "min-height", "max-height", + "device-width", "min-device-width", "max-device-width", "device-height", + "min-device-height", "max-device-height", "aspect-ratio", + "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", + "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", + "max-color", "color-index", "min-color-index", "max-color-index", + "monochrome", "min-monochrome", "max-monochrome", "resolution", + "min-resolution", "max-resolution", "scan", "grid", "orientation", + "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", + "pointer", "any-pointer", "hover", "any-hover", "prefers-color-scheme", + "dynamic-range", "video-dynamic-range" + ], mediaFeatures = keySet(mediaFeatures_); + + var mediaValueKeywords_ = [ + "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", + "interlace", "progressive", + "dark", "light", + "standard", "high" + ], mediaValueKeywords = keySet(mediaValueKeywords_); + + var propertyKeywords_ = [ + "align-content", "align-items", "align-self", "alignment-adjust", + "alignment-baseline", "all", "anchor-point", "animation", "animation-delay", + "animation-direction", "animation-duration", "animation-fill-mode", + "animation-iteration-count", "animation-name", "animation-play-state", + "animation-timing-function", "appearance", "azimuth", "backdrop-filter", + "backface-visibility", "background", "background-attachment", + "background-blend-mode", "background-clip", "background-color", + "background-image", "background-origin", "background-position", + "background-position-x", "background-position-y", "background-repeat", + "background-size", "baseline-shift", "binding", "bleed", "block-size", + "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", + "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", + "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", + "border-collapse", "border-color", "border-image", "border-image-outset", + "border-image-repeat", "border-image-slice", "border-image-source", + "border-image-width", "border-left", "border-left-color", "border-left-style", + "border-left-width", "border-radius", "border-right", "border-right-color", + "border-right-style", "border-right-width", "border-spacing", "border-style", + "border-top", "border-top-color", "border-top-left-radius", + "border-top-right-radius", "border-top-style", "border-top-width", + "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", + "break-after", "break-before", "break-inside", "caption-side", "caret-color", + "clear", "clip", "color", "color-profile", "column-count", "column-fill", + "column-gap", "column-rule", "column-rule-color", "column-rule-style", + "column-rule-width", "column-span", "column-width", "columns", "contain", + "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", + "cue-before", "cursor", "direction", "display", "dominant-baseline", + "drop-initial-after-adjust", "drop-initial-after-align", + "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", + "drop-initial-value", "elevation", "empty-cells", "fit", "fit-content", "fit-position", + "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", + "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", + "font", "font-family", "font-feature-settings", "font-kerning", + "font-language-override", "font-optical-sizing", "font-size", + "font-size-adjust", "font-stretch", "font-style", "font-synthesis", + "font-variant", "font-variant-alternates", "font-variant-caps", + "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", + "font-variant-position", "font-variation-settings", "font-weight", "gap", + "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", + "grid-column", "grid-column-end", "grid-column-gap", "grid-column-start", + "grid-gap", "grid-row", "grid-row-end", "grid-row-gap", "grid-row-start", + "grid-template", "grid-template-areas", "grid-template-columns", + "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", + "image-orientation", "image-rendering", "image-resolution", "inline-box-align", + "inset", "inset-block", "inset-block-end", "inset-block-start", "inset-inline", + "inset-inline-end", "inset-inline-start", "isolation", "justify-content", + "justify-items", "justify-self", "left", "letter-spacing", "line-break", + "line-height", "line-height-step", "line-stacking", "line-stacking-ruby", + "line-stacking-shift", "line-stacking-strategy", "list-style", + "list-style-image", "list-style-position", "list-style-type", "margin", + "margin-bottom", "margin-left", "margin-right", "margin-top", "marks", + "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", + "marquee-style", "mask-clip", "mask-composite", "mask-image", "mask-mode", + "mask-origin", "mask-position", "mask-repeat", "mask-size","mask-type", + "max-block-size", "max-height", "max-inline-size", + "max-width", "min-block-size", "min-height", "min-inline-size", "min-width", + "mix-blend-mode", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", + "nav-up", "object-fit", "object-position", "offset", "offset-anchor", + "offset-distance", "offset-path", "offset-position", "offset-rotate", + "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", + "outline-style", "outline-width", "overflow", "overflow-style", + "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", + "padding-left", "padding-right", "padding-top", "page", "page-break-after", + "page-break-before", "page-break-inside", "page-policy", "pause", + "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", + "pitch-range", "place-content", "place-items", "place-self", "play-during", + "position", "presentation-level", "punctuation-trim", "quotes", + "region-break-after", "region-break-before", "region-break-inside", + "region-fragment", "rendering-intent", "resize", "rest", "rest-after", + "rest-before", "richness", "right", "rotate", "rotation", "rotation-point", + "row-gap", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", + "scale", "scroll-behavior", "scroll-margin", "scroll-margin-block", + "scroll-margin-block-end", "scroll-margin-block-start", "scroll-margin-bottom", + "scroll-margin-inline", "scroll-margin-inline-end", + "scroll-margin-inline-start", "scroll-margin-left", "scroll-margin-right", + "scroll-margin-top", "scroll-padding", "scroll-padding-block", + "scroll-padding-block-end", "scroll-padding-block-start", + "scroll-padding-bottom", "scroll-padding-inline", "scroll-padding-inline-end", + "scroll-padding-inline-start", "scroll-padding-left", "scroll-padding-right", + "scroll-padding-top", "scroll-snap-align", "scroll-snap-type", + "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside", + "size", "speak", "speak-as", "speak-header", "speak-numeral", + "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", + "table-layout", "target", "target-name", "target-new", "target-position", + "text-align", "text-align-last", "text-combine-upright", "text-decoration", + "text-decoration-color", "text-decoration-line", "text-decoration-skip", + "text-decoration-skip-ink", "text-decoration-style", "text-emphasis", + "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", + "text-height", "text-indent", "text-justify", "text-orientation", + "text-outline", "text-overflow", "text-rendering", "text-shadow", + "text-size-adjust", "text-space-collapse", "text-transform", + "text-underline-position", "text-wrap", "top", "touch-action", "transform", "transform-origin", + "transform-style", "transition", "transition-delay", "transition-duration", + "transition-property", "transition-timing-function", "translate", + "unicode-bidi", "user-select", "vertical-align", "visibility", "voice-balance", + "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", + "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", + "will-change", "word-break", "word-spacing", "word-wrap", "writing-mode", "z-index", + // SVG-specific + "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", + "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", + "color-interpolation", "color-interpolation-filters", + "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", + "marker", "marker-end", "marker-mid", "marker-start", "paint-order", "shape-rendering", "stroke", + "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", + "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", + "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", + "glyph-orientation-vertical", "text-anchor", "writing-mode", + ], propertyKeywords = keySet(propertyKeywords_); + + var nonStandardPropertyKeywords_ = [ + "accent-color", "aspect-ratio", "border-block", "border-block-color", "border-block-end", + "border-block-end-color", "border-block-end-style", "border-block-end-width", + "border-block-start", "border-block-start-color", "border-block-start-style", + "border-block-start-width", "border-block-style", "border-block-width", + "border-inline", "border-inline-color", "border-inline-end", + "border-inline-end-color", "border-inline-end-style", + "border-inline-end-width", "border-inline-start", "border-inline-start-color", + "border-inline-start-style", "border-inline-start-width", + "border-inline-style", "border-inline-width", "content-visibility", "margin-block", + "margin-block-end", "margin-block-start", "margin-inline", "margin-inline-end", + "margin-inline-start", "overflow-anchor", "overscroll-behavior", "padding-block", "padding-block-end", + "padding-block-start", "padding-inline", "padding-inline-end", + "padding-inline-start", "scroll-snap-stop", "scrollbar-3d-light-color", + "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", + "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", + "scrollbar-track-color", "searchfield-cancel-button", "searchfield-decoration", + "searchfield-results-button", "searchfield-results-decoration", "shape-inside", "zoom" + ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); + + var fontProperties_ = [ + "font-display", "font-family", "src", "unicode-range", "font-variant", + "font-feature-settings", "font-stretch", "font-weight", "font-style" + ], fontProperties = keySet(fontProperties_); + + var counterDescriptors_ = [ + "additive-symbols", "fallback", "negative", "pad", "prefix", "range", + "speak-as", "suffix", "symbols", "system" + ], counterDescriptors = keySet(counterDescriptors_); + + var colorKeywords_ = [ + "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", + "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", + "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", + "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", + "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", + "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", + "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", + "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", + "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", + "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", + "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", + "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", + "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", + "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", + "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", + "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", + "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", + "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", + "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", + "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", + "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", + "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", + "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", + "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", + "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", + "whitesmoke", "yellow", "yellowgreen" + ], colorKeywords = keySet(colorKeywords_); + + var valueKeywords_ = [ + "above", "absolute", "activeborder", "additive", "activecaption", "afar", + "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", + "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", + "arabic-indic", "armenian", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", "avoid-page", + "avoid-region", "axis-pan", "background", "backwards", "baseline", "below", "bidi-override", "binary", + "bengali", "blink", "block", "block-axis", "blur", "bold", "bolder", "border", "border-box", + "both", "bottom", "break", "break-all", "break-word", "brightness", "bullets", "button", "button-bevel", + "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", + "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", + "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", + "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", + "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", + "compact", "condensed", "conic-gradient", "contain", "content", "contents", + "content-box", "context-menu", "continuous", "contrast", "copy", "counter", "counters", "cover", "crop", + "cross", "crosshair", "cubic-bezier", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", + "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", + "destination-in", "destination-out", "destination-over", "devanagari", "difference", + "disc", "discard", "disclosure-closed", "disclosure-open", "document", + "dot-dash", "dot-dot-dash", + "dotted", "double", "down", "drop-shadow", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", + "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", + "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", + "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", + "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", + "ethiopic-halehame-gez", "ethiopic-halehame-om-et", + "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", + "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", + "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed", + "extra-expanded", "fantasy", "fast", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", + "forwards", "from", "geometricPrecision", "georgian", "grayscale", "graytext", "grid", "groove", + "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew", + "help", "hidden", "hide", "higher", "highlight", "highlighttext", + "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "hue-rotate", "icon", "ignore", + "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", + "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", + "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert", + "italic", "japanese-formal", "japanese-informal", "justify", "kannada", + "katakana", "katakana-iroha", "keep-all", "khmer", + "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", + "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten", + "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", + "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", + "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", + "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "manipulation", "match", "matrix", "matrix3d", + "media-controls-background", "media-current-time-display", + "media-fullscreen-button", "media-mute-button", "media-play-button", + "media-return-to-realtime-button", "media-rewind-button", + "media-seek-back-button", "media-seek-forward-button", "media-slider", + "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", + "media-volume-slider-container", "media-volume-sliderthumb", "medium", + "menu", "menulist", "menulist-button", "menulist-text", + "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", + "mix", "mongolian", "monospace", "move", "multiple", "multiple_mask_images", "multiply", "myanmar", "n-resize", + "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", + "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", + "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "opacity", "open-quote", + "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", + "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", + "painted", "page", "paused", "persian", "perspective", "pinch-zoom", "plus-darker", "plus-lighter", + "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", + "progress", "push-button", "radial-gradient", "radio", "read-only", + "read-write", "read-write-plaintext-only", "rectangle", "region", + "relative", "repeat", "repeating-linear-gradient", "repeating-radial-gradient", + "repeating-conic-gradient", "repeat-x", "repeat-y", "reset", "reverse", + "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", + "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", + "s-resize", "sans-serif", "saturate", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", + "scroll", "scrollbar", "scroll-position", "se-resize", "searchfield", + "searchfield-cancel-button", "searchfield-decoration", + "searchfield-results-button", "searchfield-results-decoration", "self-start", "self-end", + "semi-condensed", "semi-expanded", "separate", "sepia", "serif", "show", "sidama", + "simp-chinese-formal", "simp-chinese-informal", "single", + "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", + "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", + "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali", + "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square", + "square-button", "start", "static", "status-bar", "stretch", "stroke", "stroke-box", "sub", + "subpixel-antialiased", "svg_masks", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table", + "table-caption", "table-cell", "table-column", "table-column-group", + "table-footer-group", "table-header-group", "table-row", "table-row-group", + "tamil", + "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", + "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", + "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", + "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", + "trad-chinese-formal", "trad-chinese-informal", "transform", + "translate", "translate3d", "translateX", "translateY", "translateZ", + "transparent", "ultra-condensed", "ultra-expanded", "underline", "unidirectional-pan", "unset", "up", + "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", + "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", + "var", "vertical", "vertical-text", "view-box", "visible", "visibleFill", "visiblePainted", + "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", + "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", + "xx-large", "xx-small" + ], valueKeywords = keySet(valueKeywords_); + + var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_) + .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_) + .concat(valueKeywords_); + CodeMirror.registerHelper("hintWords", "css", allWords); + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return ["comment", "comment"]; + } + + CodeMirror.defineMIME("text/css", { + documentTypes: documentTypes, + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css" + }); + + CodeMirror.defineMIME("text/x-scss", { + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + fontProperties: fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + ":": function(stream) { + if (stream.match(/^\s*\{/, false)) + return [null, null] + return false; + }, + "$": function(stream) { + stream.match(/^[\w-]+/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "#": function(stream) { + if (!stream.eat("{")) return false; + return [null, "interpolation"]; + } + }, + name: "css", + helperType: "scss" + }); + + CodeMirror.defineMIME("text/x-less", { + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + fontProperties: fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + "@": function(stream) { + if (stream.eat("{")) return [null, "interpolation"]; + if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i, false)) return false; + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "&": function() { + return ["atom", "atom"]; + } + }, + name: "css", + helperType: "less" + }); + + CodeMirror.defineMIME("text/x-gss", { + documentTypes: documentTypes, + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + supportsAtComponent: true, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css", + helperType: "gss" + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cypher/cypher.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cypher/cypher.js new file mode 100644 index 0000000000..6203d59984 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/cypher/cypher.js @@ -0,0 +1,152 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// By the Neo4j Team and contributors. +// https://github.com/neo4j-contrib/CodeMirror + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var wordRegexp = function(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + }; + + CodeMirror.defineMode("cypher", function(config) { + var tokenBase = function(stream/*, state*/) { + curPunc = null + var ch = stream.next(); + if (ch ==='"') { + stream.match(/^[^"]*"/); + return "string"; + } + if (ch === "'") { + stream.match(/^[^']*'/); + return "string"; + } + if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return "node"; + } else if (ch === "/" && stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return null; + } else { + stream.eatWhile(/[_\w\d]/); + if (stream.eat(":")) { + stream.eatWhile(/[\w\d_\-]/); + return "atom"; + } + var word = stream.current(); + if (funcs.test(word)) return "builtin"; + if (preds.test(word)) return "def"; + if (keywords.test(word) || systemKeywords.test(word)) return "keyword"; + return "variable"; + } + }; + var pushContext = function(state, type, col) { + return state.context = { + prev: state.context, + indent: state.indent, + col: col, + type: type + }; + }; + var popContext = function(state) { + state.indent = state.context.indent; + return state.context = state.context.prev; + }; + var indentUnit = config.indentUnit; + var curPunc; + var funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "keys", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "reverse", "right", "round", "rtrim", "shortestPath", "sign", "sin", "size", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "toString", "trim", "type", "upper"]); + var preds = wordRegexp(["all", "and", "any", "contains", "exists", "has", "in", "none", "not", "or", "single", "xor"]); + var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "detach", "distinct", "drop", "else", "end", "ends", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "join", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "starts", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with", "call", "yield"]); + var systemKeywords = wordRegexp(["access", "active", "assign", "all", "alter", "as", "catalog", "change", "copy", "create", "constraint", "constraints", "current", "database", "databases", "dbms", "default", "deny", "drop", "element", "elements", "exists", "from", "grant", "graph", "graphs", "if", "index", "indexes", "label", "labels", "management", "match", "name", "names", "new", "node", "nodes", "not", "of", "on", "or", "password", "populated", "privileges", "property", "read", "relationship", "relationships", "remove", "replace", "required", "revoke", "role", "roles", "set", "show", "start", "status", "stop", "suspended", "to", "traverse", "type", "types", "user", "users", "with", "write"]); + var operatorChars = /[*+\-<>=&|~%^]/; + + return { + startState: function(/*base*/) { + return { + tokenize: tokenBase, + context: null, + indent: 0, + col: 0 + }; + }, + token: function(stream, state) { + if (stream.sol()) { + if (state.context && (state.context.align == null)) { + state.context.align = false; + } + state.indent = stream.indentation(); + } + if (stream.eatSpace()) { + return null; + } + var style = state.tokenize(stream, state); + if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") { + state.context.align = true; + } + if (curPunc === "(") { + pushContext(state, ")", stream.column()); + } else if (curPunc === "[") { + pushContext(state, "]", stream.column()); + } else if (curPunc === "{") { + pushContext(state, "}", stream.column()); + } else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type === "pattern") { + popContext(state); + } + if (state.context && curPunc === state.context.type) { + popContext(state); + } + } else if (curPunc === "." && state.context && state.context.type === "pattern") { + popContext(state); + } else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) { + pushContext(state, "pattern", stream.column()); + } else if (state.context.type === "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + return style; + }, + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) { + while (context && context.type === "pattern") { + context = context.prev; + } + } + var closing = context && firstChar === context.type; + if (!context) return 0; + if (context.type === "keywords") return CodeMirror.commands.newlineAndIndent; + if (context.align) return context.col + (closing ? 0 : 1); + return context.indent + (closing ? 0 : indentUnit); + } + }; + }); + + CodeMirror.modeExtensions["cypher"] = { + autoFormatLineBreaks: function(text) { + var i, lines, reProcessedPortion; + var lines = text.split("\n"); + var reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g; + for (var i = 0; i < lines.length; i++) + lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim(); + return lines.join("\n"); + } + }; + + CodeMirror.defineMIME("application/x-cypher-query", "cypher"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/d/d.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/d/d.js new file mode 100644 index 0000000000..efab570633 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/d/d.js @@ -0,0 +1,223 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("d", function(config, parserConfig) { + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + keywords = parserConfig.keywords || {}, + builtin = parserConfig.builtin || {}, + blockKeywords = parserConfig.blockKeywords || {}, + atoms = parserConfig.atoms || {}, + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings; + var isOperatorChar = /[+\-*&%=<>!?|\/]/; + + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'" || ch == "`") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("+")) { + state.tokenize = tokenNestedComment; + return tokenNestedComment(stream, state); + } + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "keyword"; + } + if (builtin.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "builtin"; + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenNestedComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "+"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + var closing = firstChar == ctx.type; + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: "//", + fold: "brace" + }; +}); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var blockKeywords = "body catch class do else enum for foreach foreach_reverse if in interface mixin " + + "out scope struct switch try union unittest version while with"; + + CodeMirror.defineMIME("text/x-d", { + name: "d", + keywords: words("abstract alias align asm assert auto break case cast cdouble cent cfloat const continue " + + "debug default delegate delete deprecated export extern final finally function goto immutable " + + "import inout invariant is lazy macro module new nothrow override package pragma private " + + "protected public pure ref return shared short static super synchronized template this " + + "throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters " + + blockKeywords), + blockKeywords: words(blockKeywords), + builtin: words("bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte " + + "ucent uint ulong ushort wchar wstring void size_t sizediff_t"), + atoms: words("exit failure success true false null"), + hooks: { + "@": function(stream, _state) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + } + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dart/dart.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dart/dart.js new file mode 100644 index 0000000000..fe64517a5e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dart/dart.js @@ -0,0 +1,166 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../clike/clike")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../clike/clike"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var keywords = ("this super static final const abstract class extends external factory " + + "implements mixin get native set typedef with enum throw rethrow " + + "assert break case continue default in return new deferred async await covariant " + + "try catch finally do else for if switch while import library export " + + "part of show hide is as extension on yield late required").split(" "); + var blockKeywords = "try catch finally do else for if switch while".split(" "); + var atoms = "true false null".split(" "); + var builtins = "void bool num int double dynamic var String Null Never".split(" "); + + function set(words) { + var obj = {}; + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + function pushInterpolationStack(state) { + (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize); + } + + function popInterpolationStack(state) { + return (state.interpolationStack || (state.interpolationStack = [])).pop(); + } + + function sizeInterpolationStack(state) { + return state.interpolationStack ? state.interpolationStack.length : 0; + } + + CodeMirror.defineMIME("application/dart", { + name: "clike", + keywords: set(keywords), + blockKeywords: set(blockKeywords), + builtin: set(builtins), + atoms: set(atoms), + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_\.]/); + return "meta"; + }, + + // custom string handling to deal with triple-quoted strings and string interpolation + "'": function(stream, state) { + return tokenString("'", stream, state, false); + }, + "\"": function(stream, state) { + return tokenString("\"", stream, state, false); + }, + "r": function(stream, state) { + var peek = stream.peek(); + if (peek == "'" || peek == "\"") { + return tokenString(stream.next(), stream, state, true); + } + return false; + }, + + "}": function(_stream, state) { + // "}" is end of interpolation, if interpolation stack is non-empty + if (sizeInterpolationStack(state) > 0) { + state.tokenize = popInterpolationStack(state); + return null; + } + return false; + }, + + "/": function(stream, state) { + if (!stream.eat("*")) return false + state.tokenize = tokenNestedComment(1) + return state.tokenize(stream, state) + }, + token: function(stream, _, style) { + if (style == "variable") { + // Assume uppercase symbols are classes using variable-2 + var isUpper = RegExp('^[_$]*[A-Z][a-zA-Z0-9_$]*$','g'); + if (isUpper.test(stream.current())) { + return 'variable-2'; + } + } + } + } + }); + + function tokenString(quote, stream, state, raw) { + var tripleQuoted = false; + if (stream.eat(quote)) { + if (stream.eat(quote)) tripleQuoted = true; + else return "string"; //empty string + } + function tokenStringHelper(stream, state) { + var escaped = false; + while (!stream.eol()) { + if (!raw && !escaped && stream.peek() == "$") { + pushInterpolationStack(state); + state.tokenize = tokenInterpolation; + return "string"; + } + var next = stream.next(); + if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) { + state.tokenize = null; + break; + } + escaped = !raw && !escaped && next == "\\"; + } + return "string"; + } + state.tokenize = tokenStringHelper; + return tokenStringHelper(stream, state); + } + + function tokenInterpolation(stream, state) { + stream.eat("$"); + if (stream.eat("{")) { + // let clike handle the content of ${...}, + // we take over again when "}" appears (see hooks). + state.tokenize = null; + } else { + state.tokenize = tokenInterpolationIdentifier; + } + return null; + } + + function tokenInterpolationIdentifier(stream, state) { + stream.eatWhile(/[\w_]/); + state.tokenize = popInterpolationStack(state); + return "variable"; + } + + function tokenNestedComment(depth) { + return function (stream, state) { + var ch + while (ch = stream.next()) { + if (ch == "*" && stream.eat("/")) { + if (depth == 1) { + state.tokenize = null + break + } else { + state.tokenize = tokenNestedComment(depth - 1) + return state.tokenize(stream, state) + } + } else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenNestedComment(depth + 1) + return state.tokenize(stream, state) + } + } + return "comment" + } + } + + CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins)); + + // This is needed to make loading through meta.js work. + CodeMirror.defineMode("dart", function(conf) { + return CodeMirror.getMode(conf, "application/dart"); + }, "clike"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/diff/diff.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/diff/diff.js new file mode 100644 index 0000000000..a30fd37a50 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/diff/diff.js @@ -0,0 +1,47 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("diff", function() { + + var TOKEN_NAMES = { + '+': 'positive', + '-': 'negative', + '@': 'meta' + }; + + return { + token: function(stream) { + var tw_pos = stream.string.search(/[\t ]+?$/); + + if (!stream.sol() || tw_pos === 0) { + stream.skipToEnd(); + return ("error " + ( + TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, ''); + } + + var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd(); + + if (tw_pos === -1) { + stream.skipToEnd(); + } else { + stream.pos = tw_pos; + } + + return token_name; + } + }; +}); + +CodeMirror.defineMIME("text/x-diff", "diff"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/django/django.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/django/django.js new file mode 100644 index 0000000000..07be123986 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/django/django.js @@ -0,0 +1,356 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("django:inner", function() { + var keywords = ["block", "endblock", "for", "endfor", "true", "false", "filter", "endfilter", + "loop", "none", "self", "super", "if", "elif", "endif", "as", "else", "import", + "with", "endwith", "without", "context", "ifequal", "endifequal", "ifnotequal", + "endifnotequal", "extends", "include", "load", "comment", "endcomment", + "empty", "url", "static", "trans", "blocktrans", "endblocktrans", "now", + "regroup", "lorem", "ifchanged", "endifchanged", "firstof", "debug", "cycle", + "csrf_token", "autoescape", "endautoescape", "spaceless", "endspaceless", + "ssi", "templatetag", "verbatim", "endverbatim", "widthratio"], + filters = ["add", "addslashes", "capfirst", "center", "cut", "date", + "default", "default_if_none", "dictsort", + "dictsortreversed", "divisibleby", "escape", "escapejs", + "filesizeformat", "first", "floatformat", "force_escape", + "get_digit", "iriencode", "join", "last", "length", + "length_is", "linebreaks", "linebreaksbr", "linenumbers", + "ljust", "lower", "make_list", "phone2numeric", "pluralize", + "pprint", "random", "removetags", "rjust", "safe", + "safeseq", "slice", "slugify", "stringformat", "striptags", + "time", "timesince", "timeuntil", "title", "truncatechars", + "truncatechars_html", "truncatewords", "truncatewords_html", + "unordered_list", "upper", "urlencode", "urlize", + "urlizetrunc", "wordcount", "wordwrap", "yesno"], + operators = ["==", "!=", "<", ">", "<=", ">="], + wordOperators = ["in", "not", "or", "and"]; + + keywords = new RegExp("^\\b(" + keywords.join("|") + ")\\b"); + filters = new RegExp("^\\b(" + filters.join("|") + ")\\b"); + operators = new RegExp("^\\b(" + operators.join("|") + ")\\b"); + wordOperators = new RegExp("^\\b(" + wordOperators.join("|") + ")\\b"); + + // We have to return "null" instead of null, in order to avoid string + // styling as the default, when using Django templates inside HTML + // element attributes + function tokenBase (stream, state) { + // Attempt to identify a variable, template or comment tag respectively + if (stream.match("{{")) { + state.tokenize = inVariable; + return "tag"; + } else if (stream.match("{%")) { + state.tokenize = inTag; + return "tag"; + } else if (stream.match("{#")) { + state.tokenize = inComment; + return "comment"; + } + + // Ignore completely any stream series that do not match the + // Django template opening tags. + while (stream.next() != null && !stream.match(/\{[{%#]/, false)) {} + return null; + } + + // A string can be included in either single or double quotes (this is + // the delimiter). Mark everything as a string until the start delimiter + // occurs again. + function inString (delimiter, previousTokenizer) { + return function (stream, state) { + if (!state.escapeNext && stream.eat(delimiter)) { + state.tokenize = previousTokenizer; + } else { + if (state.escapeNext) { + state.escapeNext = false; + } + + var ch = stream.next(); + + // Take into account the backslash for escaping characters, such as + // the string delimiter. + if (ch == "\\") { + state.escapeNext = true; + } + } + + return "string"; + }; + } + + // Apply Django template variable syntax highlighting + function inVariable (stream, state) { + // Attempt to match a dot that precedes a property + if (state.waitDot) { + state.waitDot = false; + + if (stream.peek() != ".") { + return "null"; + } + + // Dot followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat(".")) { + state.waitProperty = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for property."); + } + } + + // Attempt to match a pipe that precedes a filter + if (state.waitPipe) { + state.waitPipe = false; + + if (stream.peek() != "|") { + return "null"; + } + + // Pipe followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat("|")) { + state.waitFilter = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for filter."); + } + } + + // Highlight properties + if (state.waitProperty) { + state.waitProperty = false; + if (stream.match(/\b(\w+)\b/)) { + state.waitDot = true; // A property can be followed by another property + state.waitPipe = true; // A property can be followed by a filter + return "property"; + } + } + + // Highlight filters + if (state.waitFilter) { + state.waitFilter = false; + if (stream.match(filters)) { + return "variable-2"; + } + } + + // Ignore all white spaces + if (stream.eatSpace()) { + state.waitProperty = false; + return "null"; + } + + // Identify numbers + if (stream.match(/\b\d+(\.\d+)?\b/)) { + return "number"; + } + + // Identify strings + if (stream.match("'")) { + state.tokenize = inString("'", state.tokenize); + return "string"; + } else if (stream.match('"')) { + state.tokenize = inString('"', state.tokenize); + return "string"; + } + + // Attempt to find the variable + if (stream.match(/\b(\w+)\b/) && !state.foundVariable) { + state.waitDot = true; + state.waitPipe = true; // A property can be followed by a filter + return "variable"; + } + + // If found closing tag reset + if (stream.match("}}")) { + state.waitProperty = null; + state.waitFilter = null; + state.waitDot = null; + state.waitPipe = null; + state.tokenize = tokenBase; + return "tag"; + } + + // If nothing was found, advance to the next character + stream.next(); + return "null"; + } + + function inTag (stream, state) { + // Attempt to match a dot that precedes a property + if (state.waitDot) { + state.waitDot = false; + + if (stream.peek() != ".") { + return "null"; + } + + // Dot followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat(".")) { + state.waitProperty = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for property."); + } + } + + // Attempt to match a pipe that precedes a filter + if (state.waitPipe) { + state.waitPipe = false; + + if (stream.peek() != "|") { + return "null"; + } + + // Pipe followed by a non-word character should be considered an error. + if (stream.match(/\.\W+/)) { + return "error"; + } else if (stream.eat("|")) { + state.waitFilter = true; + return "null"; + } else { + throw Error ("Unexpected error while waiting for filter."); + } + } + + // Highlight properties + if (state.waitProperty) { + state.waitProperty = false; + if (stream.match(/\b(\w+)\b/)) { + state.waitDot = true; // A property can be followed by another property + state.waitPipe = true; // A property can be followed by a filter + return "property"; + } + } + + // Highlight filters + if (state.waitFilter) { + state.waitFilter = false; + if (stream.match(filters)) { + return "variable-2"; + } + } + + // Ignore all white spaces + if (stream.eatSpace()) { + state.waitProperty = false; + return "null"; + } + + // Identify numbers + if (stream.match(/\b\d+(\.\d+)?\b/)) { + return "number"; + } + + // Identify strings + if (stream.match("'")) { + state.tokenize = inString("'", state.tokenize); + return "string"; + } else if (stream.match('"')) { + state.tokenize = inString('"', state.tokenize); + return "string"; + } + + // Attempt to match an operator + if (stream.match(operators)) { + return "operator"; + } + + // Attempt to match a word operator + if (stream.match(wordOperators)) { + return "keyword"; + } + + // Attempt to match a keyword + var keywordMatch = stream.match(keywords); + if (keywordMatch) { + if (keywordMatch[0] == "comment") { + state.blockCommentTag = true; + } + return "keyword"; + } + + // Attempt to match a variable + if (stream.match(/\b(\w+)\b/)) { + state.waitDot = true; + state.waitPipe = true; // A property can be followed by a filter + return "variable"; + } + + // If found closing tag reset + if (stream.match("%}")) { + state.waitProperty = null; + state.waitFilter = null; + state.waitDot = null; + state.waitPipe = null; + // If the tag that closes is a block comment tag, we want to mark the + // following code as comment, until the tag closes. + if (state.blockCommentTag) { + state.blockCommentTag = false; // Release the "lock" + state.tokenize = inBlockComment; + } else { + state.tokenize = tokenBase; + } + return "tag"; + } + + // If nothing was found, advance to the next character + stream.next(); + return "null"; + } + + // Mark everything as comment inside the tag and the tag itself. + function inComment (stream, state) { + if (stream.match(/^.*?#\}/)) state.tokenize = tokenBase + else stream.skipToEnd() + return "comment"; + } + + // Mark everything as a comment until the `blockcomment` tag closes. + function inBlockComment (stream, state) { + if (stream.match(/\{%\s*endcomment\s*%\}/, false)) { + state.tokenize = inTag; + stream.match("{%"); + return "tag"; + } else { + stream.next(); + return "comment"; + } + } + + return { + startState: function () { + return {tokenize: tokenBase}; + }, + token: function (stream, state) { + return state.tokenize(stream, state); + }, + blockCommentStart: "{% comment %}", + blockCommentEnd: "{% endcomment %}" + }; + }); + + CodeMirror.defineMode("django", function(config) { + var htmlBase = CodeMirror.getMode(config, "text/html"); + var djangoInner = CodeMirror.getMode(config, "django:inner"); + return CodeMirror.overlayMode(htmlBase, djangoInner); + }); + + CodeMirror.defineMIME("text/x-django", "django"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dockerfile/dockerfile.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dockerfile/dockerfile.js new file mode 100644 index 0000000000..983170f519 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dockerfile/dockerfile.js @@ -0,0 +1,211 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var from = "from"; + var fromRegex = new RegExp("^(\\s*)\\b(" + from + ")\\b", "i"); + + var shells = ["run", "cmd", "entrypoint", "shell"]; + var shellsAsArrayRegex = new RegExp("^(\\s*)(" + shells.join('|') + ")(\\s+\\[)", "i"); + + var expose = "expose"; + var exposeRegex = new RegExp("^(\\s*)(" + expose + ")(\\s+)", "i"); + + var others = [ + "arg", "from", "maintainer", "label", "env", + "add", "copy", "volume", "user", + "workdir", "onbuild", "stopsignal", "healthcheck", "shell" + ]; + + // Collect all Dockerfile directives + var instructions = [from, expose].concat(shells).concat(others), + instructionRegex = "(" + instructions.join('|') + ")", + instructionOnlyLine = new RegExp("^(\\s*)" + instructionRegex + "(\\s*)(#.*)?$", "i"), + instructionWithArguments = new RegExp("^(\\s*)" + instructionRegex + "(\\s+)", "i"); + + CodeMirror.defineSimpleMode("dockerfile", { + start: [ + // Block comment: This is a line starting with a comment + { + regex: /^\s*#.*$/, + sol: true, + token: "comment" + }, + { + regex: fromRegex, + token: [null, "keyword"], + sol: true, + next: "from" + }, + // Highlight an instruction without any arguments (for convenience) + { + regex: instructionOnlyLine, + token: [null, "keyword", null, "error"], + sol: true + }, + { + regex: shellsAsArrayRegex, + token: [null, "keyword", null], + sol: true, + next: "array" + }, + { + regex: exposeRegex, + token: [null, "keyword", null], + sol: true, + next: "expose" + }, + // Highlight an instruction followed by arguments + { + regex: instructionWithArguments, + token: [null, "keyword", null], + sol: true, + next: "arguments" + }, + { + regex: /./, + token: null + } + ], + from: [ + { + regex: /\s*$/, + token: null, + next: "start" + }, + { + // Line comment without instruction arguments is an error + regex: /(\s*)(#.*)$/, + token: [null, "error"], + next: "start" + }, + { + regex: /(\s*\S+\s+)(as)/i, + token: [null, "keyword"], + next: "start" + }, + // Fail safe return to start + { + token: null, + next: "start" + } + ], + single: [ + { + regex: /(?:[^\\']|\\.)/, + token: "string" + }, + { + regex: /'/, + token: "string", + pop: true + } + ], + double: [ + { + regex: /(?:[^\\"]|\\.)/, + token: "string" + }, + { + regex: /"/, + token: "string", + pop: true + } + ], + array: [ + { + regex: /\]/, + token: null, + next: "start" + }, + { + regex: /"(?:[^\\"]|\\.)*"?/, + token: "string" + } + ], + expose: [ + { + regex: /\d+$/, + token: "number", + next: "start" + }, + { + regex: /[^\d]+$/, + token: null, + next: "start" + }, + { + regex: /\d+/, + token: "number" + }, + { + regex: /[^\d]+/, + token: null + }, + // Fail safe return to start + { + token: null, + next: "start" + } + ], + arguments: [ + { + regex: /^\s*#.*$/, + sol: true, + token: "comment" + }, + { + regex: /"(?:[^\\"]|\\.)*"?$/, + token: "string", + next: "start" + }, + { + regex: /"/, + token: "string", + push: "double" + }, + { + regex: /'(?:[^\\']|\\.)*'?$/, + token: "string", + next: "start" + }, + { + regex: /'/, + token: "string", + push: "single" + }, + { + regex: /[^#"']+[\\`]$/, + token: null + }, + { + regex: /[^#"']+$/, + token: null, + next: "start" + }, + { + regex: /[^#"']+/, + token: null + }, + // Fail safe return to start + { + token: null, + next: "start" + } + ], + meta: { + lineComment: "#" + } + }); + + CodeMirror.defineMIME("text/x-dockerfile", "dockerfile"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dtd/dtd.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dtd/dtd.js new file mode 100644 index 0000000000..1bff91cbab --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dtd/dtd.js @@ -0,0 +1,142 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + DTD mode + Ported to CodeMirror by Peter Kroon + Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues + GitHub: @peterkroon +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("dtd", function(config) { + var indentUnit = config.indentUnit, type; + function ret(style, tp) {type = tp; return style;} + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch == "<" && stream.eat("!") ) { + if (stream.eatWhile(/[\-]/)) { + state.tokenize = tokenSGMLComment; + return tokenSGMLComment(stream, state); + } else if (stream.eatWhile(/[\w]/)) return ret("keyword", "doindent"); + } else if (ch == "<" && stream.eat("?")) { //xml declaration + state.tokenize = inBlock("meta", "?>"); + return ret("meta", ch); + } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag"); + else if (ch == "|") return ret("keyword", "separator"); + else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else + else if (ch.match(/[\[\]]/)) return ret("rule", ch); + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (stream.eatWhile(/[a-zA-Z\?\+\d]/)) { + var sc = stream.current(); + if( sc.substr(sc.length-1,sc.length).match(/\?|\+/) !== null )stream.backUp(1); + return ret("tag", "tag"); + } else if (ch == "%" || ch == "*" ) return ret("number", "number"); + else { + stream.eatWhile(/[\w\\\-_%.{,]/); + return ret(null, null); + } + } + + function tokenSGMLComment(stream, state) { + var dashes = 0, ch; + while ((ch = stream.next()) != null) { + if (dashes >= 2 && ch == ">") { + state.tokenize = tokenBase; + break; + } + dashes = (ch == "-") ? dashes + 1 : 0; + } + return ret("comment", "comment"); + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return ret("string", "tag"); + }; + } + + function inBlock(style, terminator) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = tokenBase; + break; + } + stream.next(); + } + return style; + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + stack: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + var context = state.stack[state.stack.length-1]; + if (stream.current() == "[" || type === "doindent" || type == "[") state.stack.push("rule"); + else if (type === "endtag") state.stack[state.stack.length-1] = "endtag"; + else if (stream.current() == "]" || type == "]" || (type == ">" && context == "rule")) state.stack.pop(); + else if (type == "[") state.stack.push("["); + return style; + }, + + indent: function(state, textAfter) { + var n = state.stack.length; + + if( textAfter.charAt(0) === ']' )n--; + else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){ + if(textAfter.substr(0,1) === "<") {} + else if( type == "doindent" && textAfter.length > 1 ) {} + else if( type == "doindent")n--; + else if( type == ">" && textAfter.length > 1) {} + else if( type == "tag" && textAfter !== ">") {} + else if( type == "tag" && state.stack[state.stack.length-1] == "rule")n--; + else if( type == "tag")n++; + else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule" && type === ">")n--; + else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule") {} + else if( textAfter.substr(0,1) !== "<" && textAfter.substr(0,1) === ">" )n=n-1; + else if( textAfter === ">") {} + else n=n-1; + //over rule them all + if(type == null || type == "]")n--; + } + + return state.baseIndent + n * indentUnit; + }, + + electricChars: "]>" + }; +}); + +CodeMirror.defineMIME("application/xml-dtd", "dtd"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dylan/dylan.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dylan/dylan.js new file mode 100644 index 0000000000..6725edccc0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/dylan/dylan.js @@ -0,0 +1,352 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function forEach(arr, f) { + for (var i = 0; i < arr.length; i++) f(arr[i], i) +} +function some(arr, f) { + for (var i = 0; i < arr.length; i++) if (f(arr[i], i)) return true + return false +} + +CodeMirror.defineMode("dylan", function(_config) { + // Words + var words = { + // Words that introduce unnamed definitions like "define interface" + unnamedDefinition: ["interface"], + + // Words that introduce simple named definitions like "define library" + namedDefinition: ["module", "library", "macro", + "C-struct", "C-union", + "C-function", "C-callable-wrapper" + ], + + // Words that introduce type definitions like "define class". + // These are also parameterized like "define method" and are + // appended to otherParameterizedDefinitionWords + typeParameterizedDefinition: ["class", "C-subtype", "C-mapped-subtype"], + + // Words that introduce trickier definitions like "define method". + // These require special definitions to be added to startExpressions + otherParameterizedDefinition: ["method", "function", + "C-variable", "C-address" + ], + + // Words that introduce module constant definitions. + // These must also be simple definitions and are + // appended to otherSimpleDefinitionWords + constantSimpleDefinition: ["constant"], + + // Words that introduce module variable definitions. + // These must also be simple definitions and are + // appended to otherSimpleDefinitionWords + variableSimpleDefinition: ["variable"], + + // Other words that introduce simple definitions + // (without implicit bodies). + otherSimpleDefinition: ["generic", "domain", + "C-pointer-type", + "table" + ], + + // Words that begin statements with implicit bodies. + statement: ["if", "block", "begin", "method", "case", + "for", "select", "when", "unless", "until", + "while", "iterate", "profiling", "dynamic-bind" + ], + + // Patterns that act as separators in compound statements. + // This may include any general pattern that must be indented + // specially. + separator: ["finally", "exception", "cleanup", "else", + "elseif", "afterwards" + ], + + // Keywords that do not require special indentation handling, + // but which should be highlighted + other: ["above", "below", "by", "from", "handler", "in", + "instance", "let", "local", "otherwise", "slot", + "subclass", "then", "to", "keyed-by", "virtual" + ], + + // Condition signaling function calls + signalingCalls: ["signal", "error", "cerror", + "break", "check-type", "abort" + ] + }; + + words["otherDefinition"] = + words["unnamedDefinition"] + .concat(words["namedDefinition"]) + .concat(words["otherParameterizedDefinition"]); + + words["definition"] = + words["typeParameterizedDefinition"] + .concat(words["otherDefinition"]); + + words["parameterizedDefinition"] = + words["typeParameterizedDefinition"] + .concat(words["otherParameterizedDefinition"]); + + words["simpleDefinition"] = + words["constantSimpleDefinition"] + .concat(words["variableSimpleDefinition"]) + .concat(words["otherSimpleDefinition"]); + + words["keyword"] = + words["statement"] + .concat(words["separator"]) + .concat(words["other"]); + + // Patterns + var symbolPattern = "[-_a-zA-Z?!*@<>$%]+"; + var symbol = new RegExp("^" + symbolPattern); + var patterns = { + // Symbols with special syntax + symbolKeyword: symbolPattern + ":", + symbolClass: "<" + symbolPattern + ">", + symbolGlobal: "\\*" + symbolPattern + "\\*", + symbolConstant: "\\$" + symbolPattern + }; + var patternStyles = { + symbolKeyword: "atom", + symbolClass: "tag", + symbolGlobal: "variable-2", + symbolConstant: "variable-3" + }; + + // Compile all patterns to regular expressions + for (var patternName in patterns) + if (patterns.hasOwnProperty(patternName)) + patterns[patternName] = new RegExp("^" + patterns[patternName]); + + // Names beginning "with-" and "without-" are commonly + // used as statement macro + patterns["keyword"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/]; + + var styles = {}; + styles["keyword"] = "keyword"; + styles["definition"] = "def"; + styles["simpleDefinition"] = "def"; + styles["signalingCalls"] = "builtin"; + + // protected words lookup table + var wordLookup = {}; + var styleLookup = {}; + + forEach([ + "keyword", + "definition", + "simpleDefinition", + "signalingCalls" + ], function(type) { + forEach(words[type], function(word) { + wordLookup[word] = type; + styleLookup[word] = styles[type]; + }); + }); + + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function tokenBase(stream, state) { + // String + var ch = stream.peek(); + if (ch == "'" || ch == '"') { + stream.next(); + return chain(stream, state, tokenString(ch, "string")); + } + // Comment + else if (ch == "/") { + stream.next(); + if (stream.eat("*")) { + return chain(stream, state, tokenComment); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + stream.backUp(1); + } + // Decimal + else if (/[+\-\d\.]/.test(ch)) { + if (stream.match(/^[+-]?[0-9]*\.[0-9]*([esdx][+-]?[0-9]+)?/i) || + stream.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i) || + stream.match(/^[+-]?\d+/)) { + return "number"; + } + } + // Hash + else if (ch == "#") { + stream.next(); + // Symbol with string syntax + ch = stream.peek(); + if (ch == '"') { + stream.next(); + return chain(stream, state, tokenString('"', "string")); + } + // Binary number + else if (ch == "b") { + stream.next(); + stream.eatWhile(/[01]/); + return "number"; + } + // Hex number + else if (ch == "x") { + stream.next(); + stream.eatWhile(/[\da-f]/i); + return "number"; + } + // Octal number + else if (ch == "o") { + stream.next(); + stream.eatWhile(/[0-7]/); + return "number"; + } + // Token concatenation in macros + else if (ch == '#') { + stream.next(); + return "punctuation"; + } + // Sequence literals + else if ((ch == '[') || (ch == '(')) { + stream.next(); + return "bracket"; + // Hash symbol + } else if (stream.match(/f|t|all-keys|include|key|next|rest/i)) { + return "atom"; + } else { + stream.eatWhile(/[-a-zA-Z]/); + return "error"; + } + } else if (ch == "~") { + stream.next(); + ch = stream.peek(); + if (ch == "=") { + stream.next(); + ch = stream.peek(); + if (ch == "=") { + stream.next(); + return "operator"; + } + return "operator"; + } + return "operator"; + } else if (ch == ":") { + stream.next(); + ch = stream.peek(); + if (ch == "=") { + stream.next(); + return "operator"; + } else if (ch == ":") { + stream.next(); + return "punctuation"; + } + } else if ("[](){}".indexOf(ch) != -1) { + stream.next(); + return "bracket"; + } else if (".,".indexOf(ch) != -1) { + stream.next(); + return "punctuation"; + } else if (stream.match("end")) { + return "keyword"; + } + for (var name in patterns) { + if (patterns.hasOwnProperty(name)) { + var pattern = patterns[name]; + if ((pattern instanceof Array && some(pattern, function(p) { + return stream.match(p); + })) || stream.match(pattern)) + return patternStyles[name]; + } + } + if (/[+\-*\/^=<>&|]/.test(ch)) { + stream.next(); + return "operator"; + } + if (stream.match("define")) { + return "def"; + } else { + stream.eatWhile(/[\w\-]/); + // Keyword + if (wordLookup.hasOwnProperty(stream.current())) { + return styleLookup[stream.current()]; + } else if (stream.current().match(symbol)) { + return "variable"; + } else { + stream.next(); + return "variable-2"; + } + } + } + + function tokenComment(stream, state) { + var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; + while ((ch = stream.next())) { + if (ch == "/" && maybeEnd) { + if (nestedCount > 0) { + nestedCount--; + } else { + state.tokenize = tokenBase; + break; + } + } else if (ch == "*" && maybeNested) { + nestedCount++; + } + maybeEnd = (ch == "*"); + maybeNested = (ch == "/"); + } + return "comment"; + } + + function tokenString(quote, style) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !escaped) { + state.tokenize = tokenBase; + } + return style; + }; + } + + // Interface + return { + startState: function() { + return { + tokenize: tokenBase, + currentIndent: 0 + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) + return null; + var style = state.tokenize(stream, state); + return style; + }, + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; +}); + +CodeMirror.defineMIME("text/x-dylan", "dylan"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ebnf/ebnf.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ebnf/ebnf.js new file mode 100644 index 0000000000..d8fb3f3a2f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ebnf/ebnf.js @@ -0,0 +1,195 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("ebnf", function (config) { + var commentType = {slash: 0, parenthesis: 1}; + var stateType = {comment: 0, _string: 1, characterClass: 2}; + var bracesMode = null; + + if (config.bracesMode) + bracesMode = CodeMirror.getMode(config, config.bracesMode); + + return { + startState: function () { + return { + stringType: null, + commentType: null, + braced: 0, + lhs: true, + localState: null, + stack: [], + inDefinition: false + }; + }, + token: function (stream, state) { + if (!stream) return; + + //check for state changes + if (state.stack.length === 0) { + //strings + if ((stream.peek() == '"') || (stream.peek() == "'")) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.stack.unshift(stateType._string); + } else if (stream.match('/*')) { //comments starting with /* + state.stack.unshift(stateType.comment); + state.commentType = commentType.slash; + } else if (stream.match('(*')) { //comments starting with (* + state.stack.unshift(stateType.comment); + state.commentType = commentType.parenthesis; + } + } + + //return state + //stack has + switch (state.stack[0]) { + case stateType._string: + while (state.stack[0] === stateType._string && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.stack.shift(); // Clear flag + } else if (stream.peek() === "\\") { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + + case stateType.comment: + while (state.stack[0] === stateType.comment && !stream.eol()) { + if (state.commentType === commentType.slash && stream.match('*/')) { + state.stack.shift(); // Clear flag + state.commentType = null; + } else if (state.commentType === commentType.parenthesis && stream.match('*)')) { + state.stack.shift(); // Clear flag + state.commentType = null; + } else { + stream.match(/^.[^\*]*/); + } + } + return "comment"; + + case stateType.characterClass: + while (state.stack[0] === stateType.characterClass && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match('.'))) { + state.stack.shift(); + } + } + return "operator"; + } + + var peek = stream.peek(); + + if (bracesMode !== null && (state.braced || peek === "{")) { + if (state.localState === null) + state.localState = CodeMirror.startState(bracesMode); + + var token = bracesMode.token(stream, state.localState), + text = stream.current(); + + if (!token) { + for (var i = 0; i < text.length; i++) { + if (text[i] === "{") { + if (state.braced === 0) { + token = "matchingbracket"; + } + state.braced++; + } else if (text[i] === "}") { + state.braced--; + if (state.braced === 0) { + token = "matchingbracket"; + } + } + } + } + return token; + } + + //no stack + switch (peek) { + case "[": + stream.next(); + state.stack.unshift(stateType.characterClass); + return "bracket"; + case ":": + case "|": + case ";": + stream.next(); + return "operator"; + case "%": + if (stream.match("%%")) { + return "header"; + } else if (stream.match(/[%][A-Za-z]+/)) { + return "keyword"; + } else if (stream.match(/[%][}]/)) { + return "matchingbracket"; + } + break; + case "/": + if (stream.match(/[\/][A-Za-z]+/)) { + return "keyword"; + } + case "\\": + if (stream.match(/[\][a-z]+/)) { + return "string-2"; + } + case ".": + if (stream.match(".")) { + return "atom"; + } + case "*": + case "-": + case "+": + case "^": + if (stream.match(peek)) { + return "atom"; + } + case "$": + if (stream.match("$$")) { + return "builtin"; + } else if (stream.match(/[$][0-9]+/)) { + return "variable-3"; + } + case "<": + if (stream.match(/<<[a-zA-Z_]+>>/)) { + return "builtin"; + } + } + + if (stream.match('//')) { + stream.skipToEnd(); + return "comment"; + } else if (stream.match('return')) { + return "operator"; + } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) { + if (stream.match(/(?=[\(.])/)) { + return "variable"; + } else if (stream.match(/(?=[\s\n]*[:=])/)) { + return "def"; + } + return "variable-2"; + } else if (["[", "]", "(", ")"].indexOf(stream.peek()) != -1) { + stream.next(); + return "bracket"; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; + }); + + CodeMirror.defineMIME("text/x-ebnf", "ebnf"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ecl/ecl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ecl/ecl.js new file mode 100644 index 0000000000..9af8aee180 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ecl/ecl.js @@ -0,0 +1,206 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("ecl", function(config) { + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + function metaHook(stream, state) { + if (!state.startOfLine) return false; + stream.skipToEnd(); + return "meta"; + } + + var indentUnit = config.indentUnit; + var keyword = words("abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode"); + var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait"); + var variable_2 = words("__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath"); + var variable_3 = words("ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode"); + var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when"); + var blockKeywords = words("catch class do else finally for if switch try while"); + var atoms = words("true false null"); + var hooks = {"#": metaHook}; + var isOperatorChar = /[+\-*&%=<>!?|\/]/; + + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + var cur = stream.current().toLowerCase(); + if (keyword.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "keyword"; + } else if (variable.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "variable"; + } else if (variable_2.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "variable-2"; + } else if (variable_3.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "variable-3"; + } else if (builtin.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + return "builtin"; + } else { //Data types are of from KEYWORD## + var i = cur.length - 1; + while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_')) + --i; + + if (i > 0) { + var cur2 = cur.substr(0, i + 1); + if (variable_3.propertyIsEnumerable(cur2)) { + if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement"; + return "variable-3"; + } + } + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return null; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !escaped) + state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return 0; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + var closing = firstChar == ctx.type; + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}" + }; +}); + +CodeMirror.defineMIME("text/x-ecl", "ecl"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/eiffel/eiffel.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/eiffel/eiffel.js new file mode 100644 index 0000000000..f6f3f458b6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/eiffel/eiffel.js @@ -0,0 +1,160 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("eiffel", function() { + function wordObj(words) { + var o = {}; + for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; + return o; + } + var keywords = wordObj([ + 'note', + 'across', + 'when', + 'variant', + 'until', + 'unique', + 'undefine', + 'then', + 'strip', + 'select', + 'retry', + 'rescue', + 'require', + 'rename', + 'reference', + 'redefine', + 'prefix', + 'once', + 'old', + 'obsolete', + 'loop', + 'local', + 'like', + 'is', + 'inspect', + 'infix', + 'include', + 'if', + 'frozen', + 'from', + 'external', + 'export', + 'ensure', + 'end', + 'elseif', + 'else', + 'do', + 'creation', + 'create', + 'check', + 'alias', + 'agent', + 'separate', + 'invariant', + 'inherit', + 'indexing', + 'feature', + 'expanded', + 'deferred', + 'class', + 'Void', + 'True', + 'Result', + 'Precursor', + 'False', + 'Current', + 'create', + 'attached', + 'detachable', + 'as', + 'and', + 'implies', + 'not', + 'or' + ]); + var operators = wordObj([":=", "and then","and", "or","<<",">>"]); + + function chain(newtok, stream, state) { + state.tokenize.push(newtok); + return newtok(stream, state); + } + + function tokenBase(stream, state) { + if (stream.eatSpace()) return null; + var ch = stream.next(); + if (ch == '"'||ch == "'") { + return chain(readQuoted(ch, "string"), stream, state); + } else if (ch == "-"&&stream.eat("-")) { + stream.skipToEnd(); + return "comment"; + } else if (ch == ":"&&stream.eat("=")) { + return "operator"; + } else if (/[0-9]/.test(ch)) { + stream.eatWhile(/[xXbBCc0-9\.]/); + stream.eat(/[\?\!]/); + return "ident"; + } else if (/[a-zA-Z_0-9]/.test(ch)) { + stream.eatWhile(/[a-zA-Z_0-9]/); + stream.eat(/[\?\!]/); + return "ident"; + } else if (/[=+\-\/*^%<>~]/.test(ch)) { + stream.eatWhile(/[=+\-\/*^%<>~]/); + return "operator"; + } else { + return null; + } + } + + function readQuoted(quote, style, unescaped) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && (unescaped || !escaped)) { + state.tokenize.pop(); + break; + } + escaped = !escaped && ch == "%"; + } + return style; + }; + } + + return { + startState: function() { + return {tokenize: [tokenBase]}; + }, + + token: function(stream, state) { + var style = state.tokenize[state.tokenize.length-1](stream, state); + if (style == "ident") { + var word = stream.current(); + style = keywords.propertyIsEnumerable(stream.current()) ? "keyword" + : operators.propertyIsEnumerable(stream.current()) ? "operator" + : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag" + : /^0[bB][0-1]+$/g.test(word) ? "number" + : /^0[cC][0-7]+$/g.test(word) ? "number" + : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number" + : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number" + : /^[0-9]+$/g.test(word) ? "number" + : "variable"; + } + return style; + }, + lineComment: "--" + }; +}); + +CodeMirror.defineMIME("text/x-eiffel", "eiffel"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/elm/elm.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/elm/elm.js new file mode 100644 index 0000000000..6ce940fe82 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/elm/elm.js @@ -0,0 +1,243 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("elm", function() { + + function switchState(source, setState, f) + { + setState(f); + return f(source, setState); + } + + var lowerRE = /[a-z]/; + var upperRE = /[A-Z]/; + var innerRE = /[a-zA-Z0-9_]/; + + var digitRE = /[0-9]/; + var hexRE = /[0-9A-Fa-f]/; + var symbolRE = /[-&*+.\\/<>=?^|:]/; + var specialRE = /[(),[\]{}]/; + var spacesRE = /[ \v\f]/; // newlines are handled in tokenizer + + function normal() + { + return function(source, setState) + { + if (source.eatWhile(spacesRE)) + { + return null; + } + + var char = source.next(); + + if (specialRE.test(char)) + { + return (char === '{' && source.eat('-')) + ? switchState(source, setState, chompMultiComment(1)) + : (char === '[' && source.match('glsl|')) + ? switchState(source, setState, chompGlsl) + : 'builtin'; + } + + if (char === '\'') + { + return switchState(source, setState, chompChar); + } + + if (char === '"') + { + return source.eat('"') + ? source.eat('"') + ? switchState(source, setState, chompMultiString) + : 'string' + : switchState(source, setState, chompSingleString); + } + + if (upperRE.test(char)) + { + source.eatWhile(innerRE); + return 'variable-2'; + } + + if (lowerRE.test(char)) + { + var isDef = source.pos === 1; + source.eatWhile(innerRE); + return isDef ? "def" : "variable"; + } + + if (digitRE.test(char)) + { + if (char === '0') + { + if (source.eat(/[xX]/)) + { + source.eatWhile(hexRE); // should require at least 1 + return "number"; + } + } + else + { + source.eatWhile(digitRE); + } + if (source.eat('.')) + { + source.eatWhile(digitRE); // should require at least 1 + } + if (source.eat(/[eE]/)) + { + source.eat(/[-+]/); + source.eatWhile(digitRE); // should require at least 1 + } + return "number"; + } + + if (symbolRE.test(char)) + { + if (char === '-' && source.eat('-')) + { + source.skipToEnd(); + return "comment"; + } + source.eatWhile(symbolRE); + return "keyword"; + } + + if (char === '_') + { + return "keyword"; + } + + return "error"; + } + } + + function chompMultiComment(nest) + { + if (nest == 0) + { + return normal(); + } + return function(source, setState) + { + while (!source.eol()) + { + var char = source.next(); + if (char == '{' && source.eat('-')) + { + ++nest; + } + else if (char == '-' && source.eat('}')) + { + --nest; + if (nest === 0) + { + setState(normal()); + return 'comment'; + } + } + } + setState(chompMultiComment(nest)); + return 'comment'; + } + } + + function chompMultiString(source, setState) + { + while (!source.eol()) + { + var char = source.next(); + if (char === '"' && source.eat('"') && source.eat('"')) + { + setState(normal()); + return 'string'; + } + } + return 'string'; + } + + function chompSingleString(source, setState) + { + while (source.skipTo('\\"')) { source.next(); source.next(); } + if (source.skipTo('"')) + { + source.next(); + setState(normal()); + return 'string'; + } + source.skipToEnd(); + setState(normal()); + return 'error'; + } + + function chompChar(source, setState) + { + while (source.skipTo("\\'")) { source.next(); source.next(); } + if (source.skipTo("'")) + { + source.next(); + setState(normal()); + return 'string'; + } + source.skipToEnd(); + setState(normal()); + return 'error'; + } + + function chompGlsl(source, setState) + { + while (!source.eol()) + { + var char = source.next(); + if (char === '|' && source.eat(']')) + { + setState(normal()); + return 'string'; + } + } + return 'string'; + } + + var wellKnownWords = { + case: 1, + of: 1, + as: 1, + if: 1, + then: 1, + else: 1, + let: 1, + in: 1, + type: 1, + alias: 1, + module: 1, + where: 1, + import: 1, + exposing: 1, + port: 1 + }; + + return { + startState: function () { return { f: normal() }; }, + copyState: function (s) { return { f: s.f }; }, + + token: function(stream, state) { + var type = state.f(stream, function(s) { state.f = s; }); + var word = stream.current(); + return (wellKnownWords.hasOwnProperty(word)) ? 'keyword' : type; + } + }; + + }); + + CodeMirror.defineMIME("text/x-elm", "elm"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/erlang/erlang.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/erlang/erlang.js new file mode 100644 index 0000000000..d827296f3b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/erlang/erlang.js @@ -0,0 +1,619 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/*jshint unused:true, eqnull:true, curly:true, bitwise:true */ +/*jshint undef:true, latedef:true, trailing:true */ +/*global CodeMirror:true */ + +// erlang mode. +// tokenizer -> token types -> CodeMirror styles +// tokenizer maintains a parse stack +// indenter uses the parse stack + +// TODO indenter: +// bit syntax +// old guard/bif/conversion clashes (e.g. "float/1") +// type/spec/opaque + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMIME("text/x-erlang", "erlang"); + +CodeMirror.defineMode("erlang", function(cmCfg) { + "use strict"; + +///////////////////////////////////////////////////////////////////////////// +// constants + + var typeWords = [ + "-type", "-spec", "-export_type", "-opaque"]; + + var keywordWords = [ + "after","begin","catch","case","cond","end","fun","if", + "let","of","query","receive","try","when"]; + + var separatorRE = /[\->,;]/; + var separatorWords = [ + "->",";",","]; + + var operatorAtomWords = [ + "and","andalso","band","bnot","bor","bsl","bsr","bxor", + "div","not","or","orelse","rem","xor"]; + + var operatorSymbolRE = /[\+\-\*\/<>=\|:!]/; + var operatorSymbolWords = [ + "=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"]; + + var openParenRE = /[<\(\[\{]/; + var openParenWords = [ + "<<","(","[","{"]; + + var closeParenRE = /[>\)\]\}]/; + var closeParenWords = [ + "}","]",")",">>"]; + + var guardWords = [ + "is_atom","is_binary","is_bitstring","is_boolean","is_float", + "is_function","is_integer","is_list","is_number","is_pid", + "is_port","is_record","is_reference","is_tuple", + "atom","binary","bitstring","boolean","function","integer","list", + "number","pid","port","record","reference","tuple"]; + + var bifWords = [ + "abs","adler32","adler32_combine","alive","apply","atom_to_binary", + "atom_to_list","binary_to_atom","binary_to_existing_atom", + "binary_to_list","binary_to_term","bit_size","bitstring_to_list", + "byte_size","check_process_code","contact_binary","crc32", + "crc32_combine","date","decode_packet","delete_module", + "disconnect_node","element","erase","exit","float","float_to_list", + "garbage_collect","get","get_keys","group_leader","halt","hd", + "integer_to_list","internal_bif","iolist_size","iolist_to_binary", + "is_alive","is_atom","is_binary","is_bitstring","is_boolean", + "is_float","is_function","is_integer","is_list","is_number","is_pid", + "is_port","is_process_alive","is_record","is_reference","is_tuple", + "length","link","list_to_atom","list_to_binary","list_to_bitstring", + "list_to_existing_atom","list_to_float","list_to_integer", + "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded", + "monitor_node","node","node_link","node_unlink","nodes","notalive", + "now","open_port","pid_to_list","port_close","port_command", + "port_connect","port_control","pre_loaded","process_flag", + "process_info","processes","purge_module","put","register", + "registered","round","self","setelement","size","spawn","spawn_link", + "spawn_monitor","spawn_opt","split_binary","statistics", + "term_to_binary","time","throw","tl","trunc","tuple_size", + "tuple_to_list","unlink","unregister","whereis"]; + +// upper case: [A-Z] [Ø-Þ] [À-Ö] +// lower case: [a-z] [ß-ö] [ø-ÿ] + var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/; + var escapesRE = + /[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/; + +///////////////////////////////////////////////////////////////////////////// +// tokenizer + + function tokenizer(stream,state) { + // in multi-line string + if (state.in_string) { + state.in_string = (!doubleQuote(stream)); + return rval(state,stream,"string"); + } + + // in multi-line atom + if (state.in_atom) { + state.in_atom = (!singleQuote(stream)); + return rval(state,stream,"atom"); + } + + // whitespace + if (stream.eatSpace()) { + return rval(state,stream,"whitespace"); + } + + // attributes and type specs + if (!peekToken(state) && + stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) { + if (is_member(stream.current(),typeWords)) { + return rval(state,stream,"type"); + }else{ + return rval(state,stream,"attribute"); + } + } + + var ch = stream.next(); + + // comment + if (ch == '%') { + stream.skipToEnd(); + return rval(state,stream,"comment"); + } + + // colon + if (ch == ":") { + return rval(state,stream,"colon"); + } + + // macro + if (ch == '?') { + stream.eatSpace(); + stream.eatWhile(anumRE); + return rval(state,stream,"macro"); + } + + // record + if (ch == "#") { + stream.eatSpace(); + stream.eatWhile(anumRE); + return rval(state,stream,"record"); + } + + // dollar escape + if (ch == "$") { + if (stream.next() == "\\" && !stream.match(escapesRE)) { + return rval(state,stream,"error"); + } + return rval(state,stream,"number"); + } + + // dot + if (ch == ".") { + return rval(state,stream,"dot"); + } + + // quoted atom + if (ch == '\'') { + if (!(state.in_atom = (!singleQuote(stream)))) { + if (stream.match(/\s*\/\s*[0-9]/,false)) { + stream.match(/\s*\/\s*[0-9]/,true); + return rval(state,stream,"fun"); // 'f'/0 style fun + } + if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) { + return rval(state,stream,"function"); + } + } + return rval(state,stream,"atom"); + } + + // string + if (ch == '"') { + state.in_string = (!doubleQuote(stream)); + return rval(state,stream,"string"); + } + + // variable + if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) { + stream.eatWhile(anumRE); + return rval(state,stream,"variable"); + } + + // atom/keyword/BIF/function + if (/[a-z_ß-öø-ÿ]/.test(ch)) { + stream.eatWhile(anumRE); + + if (stream.match(/\s*\/\s*[0-9]/,false)) { + stream.match(/\s*\/\s*[0-9]/,true); + return rval(state,stream,"fun"); // f/0 style fun + } + + var w = stream.current(); + + if (is_member(w,keywordWords)) { + return rval(state,stream,"keyword"); + }else if (is_member(w,operatorAtomWords)) { + return rval(state,stream,"operator"); + }else if (stream.match(/\s*\(/,false)) { + // 'put' and 'erlang:put' are bifs, 'foo:put' is not + if (is_member(w,bifWords) && + ((peekToken(state).token != ":") || + (peekToken(state,2).token == "erlang"))) { + return rval(state,stream,"builtin"); + }else if (is_member(w,guardWords)) { + return rval(state,stream,"guard"); + }else{ + return rval(state,stream,"function"); + } + }else if (lookahead(stream) == ":") { + if (w == "erlang") { + return rval(state,stream,"builtin"); + } else { + return rval(state,stream,"function"); + } + }else if (is_member(w,["true","false"])) { + return rval(state,stream,"boolean"); + }else{ + return rval(state,stream,"atom"); + } + } + + // number + var digitRE = /[0-9]/; + var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int + if (digitRE.test(ch)) { + stream.eatWhile(digitRE); + if (stream.eat('#')) { // 36#aZ style integer + if (!stream.eatWhile(radixRE)) { + stream.backUp(1); //"36#" - syntax error + } + } else if (stream.eat('.')) { // float + if (!stream.eatWhile(digitRE)) { + stream.backUp(1); // "3." - probably end of function + } else { + if (stream.eat(/[eE]/)) { // float with exponent + if (stream.eat(/[-+]/)) { + if (!stream.eatWhile(digitRE)) { + stream.backUp(2); // "2e-" - syntax error + } + } else { + if (!stream.eatWhile(digitRE)) { + stream.backUp(1); // "2e" - syntax error + } + } + } + } + } + return rval(state,stream,"number"); // normal integer + } + + // open parens + if (nongreedy(stream,openParenRE,openParenWords)) { + return rval(state,stream,"open_paren"); + } + + // close parens + if (nongreedy(stream,closeParenRE,closeParenWords)) { + return rval(state,stream,"close_paren"); + } + + // separators + if (greedy(stream,separatorRE,separatorWords)) { + return rval(state,stream,"separator"); + } + + // operators + if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) { + return rval(state,stream,"operator"); + } + + return rval(state,stream,null); + } + +///////////////////////////////////////////////////////////////////////////// +// utilities + function nongreedy(stream,re,words) { + if (stream.current().length == 1 && re.test(stream.current())) { + stream.backUp(1); + while (re.test(stream.peek())) { + stream.next(); + if (is_member(stream.current(),words)) { + return true; + } + } + stream.backUp(stream.current().length-1); + } + return false; + } + + function greedy(stream,re,words) { + if (stream.current().length == 1 && re.test(stream.current())) { + while (re.test(stream.peek())) { + stream.next(); + } + while (0 < stream.current().length) { + if (is_member(stream.current(),words)) { + return true; + }else{ + stream.backUp(1); + } + } + stream.next(); + } + return false; + } + + function doubleQuote(stream) { + return quote(stream, '"', '\\'); + } + + function singleQuote(stream) { + return quote(stream,'\'','\\'); + } + + function quote(stream,quoteChar,escapeChar) { + while (!stream.eol()) { + var ch = stream.next(); + if (ch == quoteChar) { + return true; + }else if (ch == escapeChar) { + stream.next(); + } + } + return false; + } + + function lookahead(stream) { + var m = stream.match(/^\s*([^\s%])/, false) + return m ? m[1] : ""; + } + + function is_member(element,list) { + return (-1 < list.indexOf(element)); + } + + function rval(state,stream,type) { + + // parse stack + pushToken(state,realToken(type,stream)); + + // map erlang token type to CodeMirror style class + // erlang -> CodeMirror tag + switch (type) { + case "atom": return "atom"; + case "attribute": return "attribute"; + case "boolean": return "atom"; + case "builtin": return "builtin"; + case "close_paren": return null; + case "colon": return null; + case "comment": return "comment"; + case "dot": return null; + case "error": return "error"; + case "fun": return "meta"; + case "function": return "tag"; + case "guard": return "property"; + case "keyword": return "keyword"; + case "macro": return "variable-2"; + case "number": return "number"; + case "open_paren": return null; + case "operator": return "operator"; + case "record": return "bracket"; + case "separator": return null; + case "string": return "string"; + case "type": return "def"; + case "variable": return "variable"; + default: return null; + } + } + + function aToken(tok,col,ind,typ) { + return {token: tok, + column: col, + indent: ind, + type: typ}; + } + + function realToken(type,stream) { + return aToken(stream.current(), + stream.column(), + stream.indentation(), + type); + } + + function fakeToken(type) { + return aToken(type,0,0,type); + } + + function peekToken(state,depth) { + var len = state.tokenStack.length; + var dep = (depth ? depth : 1); + + if (len < dep) { + return false; + }else{ + return state.tokenStack[len-dep]; + } + } + + function pushToken(state,token) { + + if (!(token.type == "comment" || token.type == "whitespace")) { + state.tokenStack = maybe_drop_pre(state.tokenStack,token); + state.tokenStack = maybe_drop_post(state.tokenStack); + } + } + + function maybe_drop_pre(s,token) { + var last = s.length-1; + + if (0 < last && s[last].type === "record" && token.type === "dot") { + s.pop(); + }else if (0 < last && s[last].type === "group") { + s.pop(); + s.push(token); + }else{ + s.push(token); + } + return s; + } + + function maybe_drop_post(s) { + if (!s.length) return s + var last = s.length-1; + + if (s[last].type === "dot") { + return []; + } + if (last > 1 && s[last].type === "fun" && s[last-1].token === "fun") { + return s.slice(0,last-1); + } + switch (s[last].token) { + case "}": return d(s,{g:["{"]}); + case "]": return d(s,{i:["["]}); + case ")": return d(s,{i:["("]}); + case ">>": return d(s,{i:["<<"]}); + case "end": return d(s,{i:["begin","case","fun","if","receive","try"]}); + case ",": return d(s,{e:["begin","try","when","->", + ",","(","[","{","<<"]}); + case "->": return d(s,{r:["when"], + m:["try","if","case","receive"]}); + case ";": return d(s,{E:["case","fun","if","receive","try","when"]}); + case "catch":return d(s,{e:["try"]}); + case "of": return d(s,{e:["case"]}); + case "after":return d(s,{e:["receive","try"]}); + default: return s; + } + } + + function d(stack,tt) { + // stack is a stack of Token objects. + // tt is an object; {type:tokens} + // type is a char, tokens is a list of token strings. + // The function returns (possibly truncated) stack. + // It will descend the stack, looking for a Token such that Token.token + // is a member of tokens. If it does not find that, it will normally (but + // see "E" below) return stack. If it does find a match, it will remove + // all the Tokens between the top and the matched Token. + // If type is "m", that is all it does. + // If type is "i", it will also remove the matched Token and the top Token. + // If type is "g", like "i", but add a fake "group" token at the top. + // If type is "r", it will remove the matched Token, but not the top Token. + // If type is "e", it will keep the matched Token but not the top Token. + // If type is "E", it behaves as for type "e", except if there is no match, + // in which case it will return an empty stack. + + for (var type in tt) { + var len = stack.length-1; + var tokens = tt[type]; + for (var i = len-1; -1 < i ; i--) { + if (is_member(stack[i].token,tokens)) { + var ss = stack.slice(0,i); + switch (type) { + case "m": return ss.concat(stack[i]).concat(stack[len]); + case "r": return ss.concat(stack[len]); + case "i": return ss; + case "g": return ss.concat(fakeToken("group")); + case "E": return ss.concat(stack[i]); + case "e": return ss.concat(stack[i]); + } + } + } + } + return (type == "E" ? [] : stack); + } + +///////////////////////////////////////////////////////////////////////////// +// indenter + + function indenter(state,textAfter) { + var t; + var unit = cmCfg.indentUnit; + var wordAfter = wordafter(textAfter); + var currT = peekToken(state,1); + var prevT = peekToken(state,2); + + if (state.in_string || state.in_atom) { + return CodeMirror.Pass; + }else if (!prevT) { + return 0; + }else if (currT.token == "when") { + return currT.column+unit; + }else if (wordAfter === "when" && prevT.type === "function") { + return prevT.indent+unit; + }else if (wordAfter === "(" && currT.token === "fun") { + return currT.column+3; + }else if (wordAfter === "catch" && (t = getToken(state,["try"]))) { + return t.column; + }else if (is_member(wordAfter,["end","after","of"])) { + t = getToken(state,["begin","case","fun","if","receive","try"]); + return t ? t.column : CodeMirror.Pass; + }else if (is_member(wordAfter,closeParenWords)) { + t = getToken(state,openParenWords); + return t ? t.column : CodeMirror.Pass; + }else if (is_member(currT.token,[",","|","||"]) || + is_member(wordAfter,[",","|","||"])) { + t = postcommaToken(state); + return t ? t.column+t.token.length : unit; + }else if (currT.token == "->") { + if (is_member(prevT.token, ["receive","case","if","try"])) { + return prevT.column+unit+unit; + }else{ + return prevT.column+unit; + } + }else if (is_member(currT.token,openParenWords)) { + return currT.column+currT.token.length; + }else{ + t = defaultToken(state); + return truthy(t) ? t.column+unit : 0; + } + } + + function wordafter(str) { + var m = str.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/); + + return truthy(m) && (m.index === 0) ? m[0] : ""; + } + + function postcommaToken(state) { + var objs = state.tokenStack.slice(0,-1); + var i = getTokenIndex(objs,"type",["open_paren"]); + + return truthy(objs[i]) ? objs[i] : false; + } + + function defaultToken(state) { + var objs = state.tokenStack; + var stop = getTokenIndex(objs,"type",["open_paren","separator","keyword"]); + var oper = getTokenIndex(objs,"type",["operator"]); + + if (truthy(stop) && truthy(oper) && stop < oper) { + return objs[stop+1]; + } else if (truthy(stop)) { + return objs[stop]; + } else { + return false; + } + } + + function getToken(state,tokens) { + var objs = state.tokenStack; + var i = getTokenIndex(objs,"token",tokens); + + return truthy(objs[i]) ? objs[i] : false; + } + + function getTokenIndex(objs,propname,propvals) { + + for (var i = objs.length-1; -1 < i ; i--) { + if (is_member(objs[i][propname],propvals)) { + return i; + } + } + return false; + } + + function truthy(x) { + return (x !== false) && (x != null); + } + +///////////////////////////////////////////////////////////////////////////// +// this object defines the mode + + return { + startState: + function() { + return {tokenStack: [], + in_string: false, + in_atom: false}; + }, + + token: + function(stream, state) { + return tokenizer(stream, state); + }, + + indent: + function(state, textAfter) { + return indenter(state,textAfter); + }, + + lineComment: "%" + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/factor/factor.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/factor/factor.js new file mode 100644 index 0000000000..d3f7d499cb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/factor/factor.js @@ -0,0 +1,85 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Factor syntax highlight - simple mode +// +// by Dimage Sapelkin (https://github.com/kerabromsmu) + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineSimpleMode("factor", { + // The start state contains the rules that are initially used + start: [ + // comments + {regex: /#?!.*/, token: "comment"}, + // strings """, multiline --> state + {regex: /"""/, token: "string", next: "string3"}, + {regex: /(STRING:)(\s)/, token: ["keyword", null], next: "string2"}, + {regex: /\S*?"/, token: "string", next: "string"}, + // numbers: dec, hex, unicode, bin, fractional, complex + {regex: /(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\-?\d+.?\d*)(?=\s)/, token: "number"}, + //{regex: /[+-]?/} //fractional + // definition: defining word, defined word, etc + {regex: /((?:GENERIC)|\:?\:)(\s+)(\S+)(\s+)(\()/, token: ["keyword", null, "def", null, "bracket"], next: "stack"}, + // method definition: defining word, type, defined word, etc + {regex: /(M\:)(\s+)(\S+)(\s+)(\S+)/, token: ["keyword", null, "def", null, "tag"]}, + // vocabulary using --> state + {regex: /USING\:/, token: "keyword", next: "vocabulary"}, + // vocabulary definition/use + {regex: /(USE\:|IN\:)(\s+)(\S+)(?=\s|$)/, token: ["keyword", null, "tag"]}, + // definition: a defining word, defined word + {regex: /(\S+\:)(\s+)(\S+)(?=\s|$)/, token: ["keyword", null, "def"]}, + // "keywords", incl. ; t f . [ ] { } defining words + {regex: /(?:;|\\|t|f|if|loop|while|until|do|PRIVATE>| and the like + {regex: /\S+[\)>\.\*\?]+(?=\s|$)/, token: "builtin"}, + {regex: /[\)><]+\S+(?=\s|$)/, token: "builtin"}, + // operators + {regex: /(?:[\+\-\=\/\*<>])(?=\s|$)/, token: "keyword"}, + // any id (?) + {regex: /\S+/, token: "variable"}, + {regex: /\s+|./, token: null} + ], + vocabulary: [ + {regex: /;/, token: "keyword", next: "start"}, + {regex: /\S+/, token: "tag"}, + {regex: /\s+|./, token: null} + ], + string: [ + {regex: /(?:[^\\]|\\.)*?"/, token: "string", next: "start"}, + {regex: /.*/, token: "string"} + ], + string2: [ + {regex: /^;/, token: "keyword", next: "start"}, + {regex: /.*/, token: "string"} + ], + string3: [ + {regex: /(?:[^\\]|\\.)*?"""/, token: "string", next: "start"}, + {regex: /.*/, token: "string"} + ], + stack: [ + {regex: /\)/, token: "bracket", next: "start"}, + {regex: /--/, token: "bracket"}, + {regex: /\S+/, token: "meta"}, + {regex: /\s+|./, token: null} + ], + // The meta property contains global information about the mode. It + // can contain properties like lineComment, which are supported by + // all modes, and also directives like dontIndentStates, which are + // specific to simple modes. + meta: { + dontIndentStates: ["start", "vocabulary", "string", "string3", "stack"], + lineComment: "!" + } + }); + + CodeMirror.defineMIME("text/x-factor", "factor"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fcl/fcl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fcl/fcl.js new file mode 100644 index 0000000000..2d3f2001d3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fcl/fcl.js @@ -0,0 +1,173 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("fcl", function(config) { + var indentUnit = config.indentUnit; + + var keywords = { + "term": true, + "method": true, "accu": true, + "rule": true, "then": true, "is": true, "and": true, "or": true, + "if": true, "default": true + }; + + var start_blocks = { + "var_input": true, + "var_output": true, + "fuzzify": true, + "defuzzify": true, + "function_block": true, + "ruleblock": true + }; + + var end_blocks = { + "end_ruleblock": true, + "end_defuzzify": true, + "end_function_block": true, + "end_fuzzify": true, + "end_var": true + }; + + var atoms = { + "true": true, "false": true, "nan": true, + "real": true, "min": true, "max": true, "cog": true, "cogs": true + }; + + var isOperatorChar = /[+\-*&^%:=<>!|\/]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (/[\d\.]/.test(ch)) { + if (ch == ".") { + stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); + } else if (ch == "0") { + stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); + } else { + stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); + } + return "number"; + } + + if (ch == "/" || ch == "(") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + + var cur = stream.current().toLowerCase(); + if (keywords.propertyIsEnumerable(cur) || + start_blocks.propertyIsEnumerable(cur) || + end_blocks.propertyIsEnumerable(cur)) { + return "keyword"; + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if ((ch == "/" || ch == ")") && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + + function popContext(state) { + if (!state.context.prev) return; + var t = state.context.type; + if (t == "end_block") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + var cur = stream.current().toLowerCase(); + + if (start_blocks.propertyIsEnumerable(cur)) pushContext(state, stream.column(), "end_block"); + else if (end_blocks.propertyIsEnumerable(cur)) popContext(state); + + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return 0; + var ctx = state.context; + + var closing = end_blocks.propertyIsEnumerable(textAfter); + if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "ryk", + fold: "brace", + blockCommentStart: "(*", + blockCommentEnd: "*)", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-fcl", "fcl"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/forth/forth.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/forth/forth.js new file mode 100644 index 0000000000..f2caa27af8 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/forth/forth.js @@ -0,0 +1,180 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Author: Aliaksei Chapyzhenka + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function toWordList(words) { + var ret = []; + words.split(' ').forEach(function(e){ + ret.push({name: e}); + }); + return ret; + } + + var coreWordList = toWordList( +'INVERT AND OR XOR\ + 2* 2/ LSHIFT RSHIFT\ + 0= = 0< < > U< MIN MAX\ + 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\ + >R R> R@\ + + - 1+ 1- ABS NEGATE\ + S>D * M* UM*\ + FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\ + HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\ + ALIGN ALIGNED +! ALLOT\ + CHAR [CHAR] [ ] BL\ + FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\ + ; DOES> >BODY\ + EVALUATE\ + SOURCE >IN\ + <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\ + FILL MOVE\ + . CR EMIT SPACE SPACES TYPE U. .R U.R\ + ACCEPT\ + TRUE FALSE\ + <> U> 0<> 0>\ + NIP TUCK ROLL PICK\ + 2>R 2R@ 2R>\ + WITHIN UNUSED MARKER\ + I J\ + TO\ + COMPILE, [COMPILE]\ + SAVE-INPUT RESTORE-INPUT\ + PAD ERASE\ + 2LITERAL DNEGATE\ + D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\ + M+ M*/ D. D.R 2ROT DU<\ + CATCH THROW\ + FREE RESIZE ALLOCATE\ + CS-PICK CS-ROLL\ + GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\ + PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\ + -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL'); + + var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE'); + + CodeMirror.defineMode('forth', function() { + function searchWordList (wordList, word) { + var i; + for (i = wordList.length - 1; i >= 0; i--) { + if (wordList[i].name === word.toUpperCase()) { + return wordList[i]; + } + } + return undefined; + } + return { + startState: function() { + return { + state: '', + base: 10, + coreWordList: coreWordList, + immediateWordList: immediateWordList, + wordList: [] + }; + }, + token: function (stream, stt) { + var mat; + if (stream.eatSpace()) { + return null; + } + if (stt.state === '') { // interpretation + if (stream.match(/^(\]|:NONAME)(\s|$)/i)) { + stt.state = ' compilation'; + return 'builtin compilation'; + } + mat = stream.match(/^(\:)\s+(\S+)(\s|$)+/); + if (mat) { + stt.wordList.push({name: mat[2].toUpperCase()}); + stt.state = ' compilation'; + return 'def' + stt.state; + } + mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i); + if (mat) { + stt.wordList.push({name: mat[2].toUpperCase()}); + return 'def' + stt.state; + } + mat = stream.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/); + if (mat) { + return 'builtin' + stt.state; + } + } else { // compilation + // ; [ + if (stream.match(/^(\;|\[)(\s)/)) { + stt.state = ''; + stream.backUp(1); + return 'builtin compilation'; + } + if (stream.match(/^(\;|\[)($)/)) { + stt.state = ''; + return 'builtin compilation'; + } + if (stream.match(/^(POSTPONE)\s+\S+(\s|$)+/)) { + return 'builtin'; + } + } + + // dynamic wordlist + mat = stream.match(/^(\S+)(\s+|$)/); + if (mat) { + if (searchWordList(stt.wordList, mat[1]) !== undefined) { + return 'variable' + stt.state; + } + + // comments + if (mat[1] === '\\') { + stream.skipToEnd(); + return 'comment' + stt.state; + } + + // core words + if (searchWordList(stt.coreWordList, mat[1]) !== undefined) { + return 'builtin' + stt.state; + } + if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) { + return 'keyword' + stt.state; + } + + if (mat[1] === '(') { + stream.eatWhile(function (s) { return s !== ')'; }); + stream.eat(')'); + return 'comment' + stt.state; + } + + // // strings + if (mat[1] === '.(') { + stream.eatWhile(function (s) { return s !== ')'; }); + stream.eat(')'); + return 'string' + stt.state; + } + if (mat[1] === 'S"' || mat[1] === '."' || mat[1] === 'C"') { + stream.eatWhile(function (s) { return s !== '"'; }); + stream.eat('"'); + return 'string' + stt.state; + } + + // numbers + if (mat[1] - 0xfffffffff) { + return 'number' + stt.state; + } + // if (mat[1].match(/^[-+]?[0-9]+\.[0-9]*/)) { + // return 'number' + stt.state; + // } + + return 'atom' + stt.state; + } + } + }; + }); + CodeMirror.defineMIME("text/x-forth", "forth"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fortran/fortran.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fortran/fortran.js new file mode 100644 index 0000000000..c33cf63edd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/fortran/fortran.js @@ -0,0 +1,188 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("fortran", function() { + function words(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) { + keys[array[i]] = true; + } + return keys; + } + + var keywords = words([ + "abstract", "accept", "allocatable", "allocate", + "array", "assign", "asynchronous", "backspace", + "bind", "block", "byte", "call", "case", + "class", "close", "common", "contains", + "continue", "cycle", "data", "deallocate", + "decode", "deferred", "dimension", "do", + "elemental", "else", "encode", "end", + "endif", "entry", "enumerator", "equivalence", + "exit", "external", "extrinsic", "final", + "forall", "format", "function", "generic", + "go", "goto", "if", "implicit", "import", "include", + "inquire", "intent", "interface", "intrinsic", + "module", "namelist", "non_intrinsic", + "non_overridable", "none", "nopass", + "nullify", "open", "optional", "options", + "parameter", "pass", "pause", "pointer", + "print", "private", "program", "protected", + "public", "pure", "read", "recursive", "result", + "return", "rewind", "save", "select", "sequence", + "stop", "subroutine", "target", "then", "to", "type", + "use", "value", "volatile", "where", "while", + "write"]); + var builtins = words(["abort", "abs", "access", "achar", "acos", + "adjustl", "adjustr", "aimag", "aint", "alarm", + "all", "allocated", "alog", "amax", "amin", + "amod", "and", "anint", "any", "asin", + "associated", "atan", "besj", "besjn", "besy", + "besyn", "bit_size", "btest", "cabs", "ccos", + "ceiling", "cexp", "char", "chdir", "chmod", + "clog", "cmplx", "command_argument_count", + "complex", "conjg", "cos", "cosh", "count", + "cpu_time", "cshift", "csin", "csqrt", "ctime", + "c_funloc", "c_loc", "c_associated", "c_null_ptr", + "c_null_funptr", "c_f_pointer", "c_null_char", + "c_alert", "c_backspace", "c_form_feed", + "c_new_line", "c_carriage_return", + "c_horizontal_tab", "c_vertical_tab", "dabs", + "dacos", "dasin", "datan", "date_and_time", + "dbesj", "dbesj", "dbesjn", "dbesy", "dbesy", + "dbesyn", "dble", "dcos", "dcosh", "ddim", "derf", + "derfc", "dexp", "digits", "dim", "dint", "dlog", + "dlog", "dmax", "dmin", "dmod", "dnint", + "dot_product", "dprod", "dsign", "dsinh", + "dsin", "dsqrt", "dtanh", "dtan", "dtime", + "eoshift", "epsilon", "erf", "erfc", "etime", + "exit", "exp", "exponent", "extends_type_of", + "fdate", "fget", "fgetc", "float", "floor", + "flush", "fnum", "fputc", "fput", "fraction", + "fseek", "fstat", "ftell", "gerror", "getarg", + "get_command", "get_command_argument", + "get_environment_variable", "getcwd", + "getenv", "getgid", "getlog", "getpid", + "getuid", "gmtime", "hostnm", "huge", "iabs", + "iachar", "iand", "iargc", "ibclr", "ibits", + "ibset", "ichar", "idate", "idim", "idint", + "idnint", "ieor", "ierrno", "ifix", "imag", + "imagpart", "index", "int", "ior", "irand", + "isatty", "ishft", "ishftc", "isign", + "iso_c_binding", "is_iostat_end", "is_iostat_eor", + "itime", "kill", "kind", "lbound", "len", "len_trim", + "lge", "lgt", "link", "lle", "llt", "lnblnk", "loc", + "log", "logical", "long", "lshift", "lstat", "ltime", + "matmul", "max", "maxexponent", "maxloc", "maxval", + "mclock", "merge", "move_alloc", "min", "minexponent", + "minloc", "minval", "mod", "modulo", "mvbits", + "nearest", "new_line", "nint", "not", "or", "pack", + "perror", "precision", "present", "product", "radix", + "rand", "random_number", "random_seed", "range", + "real", "realpart", "rename", "repeat", "reshape", + "rrspacing", "rshift", "same_type_as", "scale", + "scan", "second", "selected_int_kind", + "selected_real_kind", "set_exponent", "shape", + "short", "sign", "signal", "sinh", "sin", "sleep", + "sngl", "spacing", "spread", "sqrt", "srand", "stat", + "sum", "symlnk", "system", "system_clock", "tan", + "tanh", "time", "tiny", "transfer", "transpose", + "trim", "ttynam", "ubound", "umask", "unlink", + "unpack", "verify", "xor", "zabs", "zcos", "zexp", + "zlog", "zsin", "zsqrt"]); + + var dataTypes = words(["c_bool", "c_char", "c_double", "c_double_complex", + "c_float", "c_float_complex", "c_funptr", "c_int", + "c_int16_t", "c_int32_t", "c_int64_t", "c_int8_t", + "c_int_fast16_t", "c_int_fast32_t", "c_int_fast64_t", + "c_int_fast8_t", "c_int_least16_t", "c_int_least32_t", + "c_int_least64_t", "c_int_least8_t", "c_intmax_t", + "c_intptr_t", "c_long", "c_long_double", + "c_long_double_complex", "c_long_long", "c_ptr", + "c_short", "c_signed_char", "c_size_t", "character", + "complex", "double", "integer", "logical", "real"]); + var isOperatorChar = /[+\-*&=<>\/\:]/; + var litOperator = /^\.(and|or|eq|lt|le|gt|ge|ne|not|eqv|neqv)\./i; + + function tokenBase(stream, state) { + + if (stream.match(litOperator)){ + return 'operator'; + } + + var ch = stream.next(); + if (ch == "!") { + stream.skipToEnd(); + return "comment"; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]\(\),]/.test(ch)) { + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + var word = stream.current().toLowerCase(); + + if (keywords.hasOwnProperty(word)){ + return 'keyword'; + } + if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) { + return 'builtin'; + } + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !escaped) state.tokenize = null; + return "string"; + }; + } + + // Interface + + return { + startState: function() { + return {tokenize: null}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + return style; + } + }; +}); + +CodeMirror.defineMIME("text/x-fortran", "fortran"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gas/gas.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gas/gas.js new file mode 100644 index 0000000000..016dc29d60 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gas/gas.js @@ -0,0 +1,353 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("gas", function(_config, parserConfig) { + 'use strict'; + + // If an architecture is specified, its initialization function may + // populate this array with custom parsing functions which will be + // tried in the event that the standard functions do not find a match. + var custom = []; + + // The symbol used to start a line comment changes based on the target + // architecture. + // If no architecture is pased in "parserConfig" then only multiline + // comments will have syntax support. + var lineCommentStartSymbol = ""; + + // These directives are architecture independent. + // Machine specific directives should go in their respective + // architecture initialization function. + // Reference: + // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops + var directives = { + ".abort" : "builtin", + ".align" : "builtin", + ".altmacro" : "builtin", + ".ascii" : "builtin", + ".asciz" : "builtin", + ".balign" : "builtin", + ".balignw" : "builtin", + ".balignl" : "builtin", + ".bundle_align_mode" : "builtin", + ".bundle_lock" : "builtin", + ".bundle_unlock" : "builtin", + ".byte" : "builtin", + ".cfi_startproc" : "builtin", + ".comm" : "builtin", + ".data" : "builtin", + ".def" : "builtin", + ".desc" : "builtin", + ".dim" : "builtin", + ".double" : "builtin", + ".eject" : "builtin", + ".else" : "builtin", + ".elseif" : "builtin", + ".end" : "builtin", + ".endef" : "builtin", + ".endfunc" : "builtin", + ".endif" : "builtin", + ".equ" : "builtin", + ".equiv" : "builtin", + ".eqv" : "builtin", + ".err" : "builtin", + ".error" : "builtin", + ".exitm" : "builtin", + ".extern" : "builtin", + ".fail" : "builtin", + ".file" : "builtin", + ".fill" : "builtin", + ".float" : "builtin", + ".func" : "builtin", + ".global" : "builtin", + ".gnu_attribute" : "builtin", + ".hidden" : "builtin", + ".hword" : "builtin", + ".ident" : "builtin", + ".if" : "builtin", + ".incbin" : "builtin", + ".include" : "builtin", + ".int" : "builtin", + ".internal" : "builtin", + ".irp" : "builtin", + ".irpc" : "builtin", + ".lcomm" : "builtin", + ".lflags" : "builtin", + ".line" : "builtin", + ".linkonce" : "builtin", + ".list" : "builtin", + ".ln" : "builtin", + ".loc" : "builtin", + ".loc_mark_labels" : "builtin", + ".local" : "builtin", + ".long" : "builtin", + ".macro" : "builtin", + ".mri" : "builtin", + ".noaltmacro" : "builtin", + ".nolist" : "builtin", + ".octa" : "builtin", + ".offset" : "builtin", + ".org" : "builtin", + ".p2align" : "builtin", + ".popsection" : "builtin", + ".previous" : "builtin", + ".print" : "builtin", + ".protected" : "builtin", + ".psize" : "builtin", + ".purgem" : "builtin", + ".pushsection" : "builtin", + ".quad" : "builtin", + ".reloc" : "builtin", + ".rept" : "builtin", + ".sbttl" : "builtin", + ".scl" : "builtin", + ".section" : "builtin", + ".set" : "builtin", + ".short" : "builtin", + ".single" : "builtin", + ".size" : "builtin", + ".skip" : "builtin", + ".sleb128" : "builtin", + ".space" : "builtin", + ".stab" : "builtin", + ".string" : "builtin", + ".struct" : "builtin", + ".subsection" : "builtin", + ".symver" : "builtin", + ".tag" : "builtin", + ".text" : "builtin", + ".title" : "builtin", + ".type" : "builtin", + ".uleb128" : "builtin", + ".val" : "builtin", + ".version" : "builtin", + ".vtable_entry" : "builtin", + ".vtable_inherit" : "builtin", + ".warning" : "builtin", + ".weak" : "builtin", + ".weakref" : "builtin", + ".word" : "builtin" + }; + + var registers = {}; + + function x86(_parserConfig) { + lineCommentStartSymbol = "#"; + + registers.al = "variable"; + registers.ah = "variable"; + registers.ax = "variable"; + registers.eax = "variable-2"; + registers.rax = "variable-3"; + + registers.bl = "variable"; + registers.bh = "variable"; + registers.bx = "variable"; + registers.ebx = "variable-2"; + registers.rbx = "variable-3"; + + registers.cl = "variable"; + registers.ch = "variable"; + registers.cx = "variable"; + registers.ecx = "variable-2"; + registers.rcx = "variable-3"; + + registers.dl = "variable"; + registers.dh = "variable"; + registers.dx = "variable"; + registers.edx = "variable-2"; + registers.rdx = "variable-3"; + + registers.si = "variable"; + registers.esi = "variable-2"; + registers.rsi = "variable-3"; + + registers.di = "variable"; + registers.edi = "variable-2"; + registers.rdi = "variable-3"; + + registers.sp = "variable"; + registers.esp = "variable-2"; + registers.rsp = "variable-3"; + + registers.bp = "variable"; + registers.ebp = "variable-2"; + registers.rbp = "variable-3"; + + registers.ip = "variable"; + registers.eip = "variable-2"; + registers.rip = "variable-3"; + + registers.cs = "keyword"; + registers.ds = "keyword"; + registers.ss = "keyword"; + registers.es = "keyword"; + registers.fs = "keyword"; + registers.gs = "keyword"; + } + + function armv6(_parserConfig) { + // Reference: + // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf + // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf + lineCommentStartSymbol = "@"; + directives.syntax = "builtin"; + + registers.r0 = "variable"; + registers.r1 = "variable"; + registers.r2 = "variable"; + registers.r3 = "variable"; + registers.r4 = "variable"; + registers.r5 = "variable"; + registers.r6 = "variable"; + registers.r7 = "variable"; + registers.r8 = "variable"; + registers.r9 = "variable"; + registers.r10 = "variable"; + registers.r11 = "variable"; + registers.r12 = "variable"; + + registers.sp = "variable-2"; + registers.lr = "variable-2"; + registers.pc = "variable-2"; + registers.r13 = registers.sp; + registers.r14 = registers.lr; + registers.r15 = registers.pc; + + custom.push(function(ch, stream) { + if (ch === '#') { + stream.eatWhile(/\w/); + return "number"; + } + }); + } + + var arch = (parserConfig.architecture || "x86").toLowerCase(); + if (arch === "x86") { + x86(parserConfig); + } else if (arch === "arm" || arch === "armv6") { + armv6(parserConfig); + } + + function nextUntilUnescaped(stream, end) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (next === end && !escaped) { + return false; + } + escaped = !escaped && next === "\\"; + } + return escaped; + } + + function clikeComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (ch === "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch === "*"); + } + return "comment"; + } + + return { + startState: function() { + return { + tokenize: null + }; + }, + + token: function(stream, state) { + if (state.tokenize) { + return state.tokenize(stream, state); + } + + if (stream.eatSpace()) { + return null; + } + + var style, cur, ch = stream.next(); + + if (ch === "/") { + if (stream.eat("*")) { + state.tokenize = clikeComment; + return clikeComment(stream, state); + } + } + + if (ch === lineCommentStartSymbol) { + stream.skipToEnd(); + return "comment"; + } + + if (ch === '"') { + nextUntilUnescaped(stream, '"'); + return "string"; + } + + if (ch === '.') { + stream.eatWhile(/\w/); + cur = stream.current().toLowerCase(); + style = directives[cur]; + return style || null; + } + + if (ch === '=') { + stream.eatWhile(/\w/); + return "tag"; + } + + if (ch === '{') { + return "bracket"; + } + + if (ch === '}') { + return "bracket"; + } + + if (/\d/.test(ch)) { + if (ch === "0" && stream.eat("x")) { + stream.eatWhile(/[0-9a-fA-F]/); + return "number"; + } + stream.eatWhile(/\d/); + return "number"; + } + + if (/\w/.test(ch)) { + stream.eatWhile(/\w/); + if (stream.eat(":")) { + return 'tag'; + } + cur = stream.current().toLowerCase(); + style = registers[cur]; + return style || null; + } + + for (var i = 0; i < custom.length; i++) { + style = custom[i](ch, stream, state); + if (style) { + return style; + } + } + }, + + lineComment: lineCommentStartSymbol, + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gfm/gfm.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gfm/gfm.js new file mode 100644 index 0000000000..492c9487a6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gfm/gfm.js @@ -0,0 +1,129 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +var urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i + +CodeMirror.defineMode("gfm", function(config, modeConfig) { + var codeDepth = 0; + function blankLine(state) { + state.code = false; + return null; + } + var gfmOverlay = { + startState: function() { + return { + code: false, + codeBlock: false, + ateSpace: false + }; + }, + copyState: function(s) { + return { + code: s.code, + codeBlock: s.codeBlock, + ateSpace: s.ateSpace + }; + }, + token: function(stream, state) { + state.combineTokens = null; + + // Hack to prevent formatting override inside code blocks (block and inline) + if (state.codeBlock) { + if (stream.match(/^```+/)) { + state.codeBlock = false; + return null; + } + stream.skipToEnd(); + return null; + } + if (stream.sol()) { + state.code = false; + } + if (stream.sol() && stream.match(/^```+/)) { + stream.skipToEnd(); + state.codeBlock = true; + return null; + } + // If this block is changed, it may need to be updated in Markdown mode + if (stream.peek() === '`') { + stream.next(); + var before = stream.pos; + stream.eatWhile('`'); + var difference = 1 + stream.pos - before; + if (!state.code) { + codeDepth = difference; + state.code = true; + } else { + if (difference === codeDepth) { // Must be exact + state.code = false; + } + } + return null; + } else if (state.code) { + stream.next(); + return null; + } + // Check if space. If so, links can be formatted later on + if (stream.eatSpace()) { + state.ateSpace = true; + return null; + } + if (stream.sol() || state.ateSpace) { + state.ateSpace = false; + if (modeConfig.gitHubSpice !== false) { + if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?=.{0,6}\d)(?:[a-f0-9]{7,40}\b)/)) { + // User/Project@SHA + // User@SHA + // SHA + state.combineTokens = true; + return "link"; + } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) { + // User/Project#Num + // User#Num + // #Num + state.combineTokens = true; + return "link"; + } + } + } + if (stream.match(urlRE) && + stream.string.slice(stream.start - 2, stream.start) != "](" && + (stream.start == 0 || /\W/.test(stream.string.charAt(stream.start - 1)))) { + // URLs + // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls + // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine + // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL + state.combineTokens = true; + return "link"; + } + stream.next(); + return null; + }, + blankLine: blankLine + }; + + var markdownConfig = { + taskLists: true, + strikethrough: true, + emoji: true + }; + for (var attr in modeConfig) { + markdownConfig[attr] = modeConfig[attr]; + } + markdownConfig.name = "markdown"; + return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay); + +}, "markdown"); + + CodeMirror.defineMIME("text/x-gfm", "gfm"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gherkin/gherkin.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gherkin/gherkin.js new file mode 100644 index 0000000000..1b438b9057 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/gherkin/gherkin.js @@ -0,0 +1,178 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* +Gherkin mode - http://www.cukes.info/ +Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues +*/ + +// Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js +//var Quotes = { +// SINGLE: 1, +// DOUBLE: 2 +//}; + +//var regex = { +// keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/ +//}; + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("gherkin", function () { + return { + startState: function () { + return { + lineNumber: 0, + tableHeaderLine: false, + allowFeature: true, + allowBackground: false, + allowScenario: false, + allowSteps: false, + allowPlaceholders: false, + allowMultilineArgument: false, + inMultilineString: false, + inMultilineTable: false, + inKeywordLine: false + }; + }, + token: function (stream, state) { + if (stream.sol()) { + state.lineNumber++; + state.inKeywordLine = false; + if (state.inMultilineTable) { + state.tableHeaderLine = false; + if (!stream.match(/\s*\|/, false)) { + state.allowMultilineArgument = false; + state.inMultilineTable = false; + } + } + } + + stream.eatSpace(); + + if (state.allowMultilineArgument) { + + // STRING + if (state.inMultilineString) { + if (stream.match('"""')) { + state.inMultilineString = false; + state.allowMultilineArgument = false; + } else { + stream.match(/.*/); + } + return "string"; + } + + // TABLE + if (state.inMultilineTable) { + if (stream.match(/\|\s*/)) { + return "bracket"; + } else { + stream.match(/[^\|]*/); + return state.tableHeaderLine ? "header" : "string"; + } + } + + // DETECT START + if (stream.match('"""')) { + // String + state.inMultilineString = true; + return "string"; + } else if (stream.match("|")) { + // Table + state.inMultilineTable = true; + state.tableHeaderLine = true; + return "bracket"; + } + + } + + // LINE COMMENT + if (stream.match(/#.*/)) { + return "comment"; + + // TAG + } else if (!state.inKeywordLine && stream.match(/@\S+/)) { + return "tag"; + + // FEATURE + } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) { + state.allowScenario = true; + state.allowBackground = true; + state.allowPlaceholders = false; + state.allowSteps = false; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // BACKGROUND + } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) { + state.allowPlaceholders = false; + state.allowSteps = true; + state.allowBackground = false; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // SCENARIO OUTLINE + } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) { + state.allowPlaceholders = true; + state.allowSteps = true; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // EXAMPLES + } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) { + state.allowPlaceholders = false; + state.allowSteps = true; + state.allowBackground = false; + state.allowMultilineArgument = true; + return "keyword"; + + // SCENARIO + } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) { + state.allowPlaceholders = false; + state.allowSteps = true; + state.allowBackground = false; + state.allowMultilineArgument = false; + state.inKeywordLine = true; + return "keyword"; + + // STEPS + } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/)) { + state.inStep = true; + state.allowPlaceholders = true; + state.allowMultilineArgument = true; + state.inKeywordLine = true; + return "keyword"; + + // INLINE STRING + } else if (stream.match(/"[^"]*"?/)) { + return "string"; + + // PLACEHOLDER + } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) { + return "variable"; + + // Fall through + } else { + stream.next(); + stream.eatWhile(/[^@"<#]/); + return null; + } + } + }; +}); + +CodeMirror.defineMIME("text/x-feature", "gherkin"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/go/go.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/go/go.js new file mode 100644 index 0000000000..c005e42ddc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/go/go.js @@ -0,0 +1,187 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("go", function(config) { + var indentUnit = config.indentUnit; + + var keywords = { + "break":true, "case":true, "chan":true, "const":true, "continue":true, + "default":true, "defer":true, "else":true, "fallthrough":true, "for":true, + "func":true, "go":true, "goto":true, "if":true, "import":true, + "interface":true, "map":true, "package":true, "range":true, "return":true, + "select":true, "struct":true, "switch":true, "type":true, "var":true, + "bool":true, "byte":true, "complex64":true, "complex128":true, + "float32":true, "float64":true, "int8":true, "int16":true, "int32":true, + "int64":true, "string":true, "uint8":true, "uint16":true, "uint32":true, + "uint64":true, "int":true, "uint":true, "uintptr":true, "error": true, + "rune":true + }; + + var atoms = { + "true":true, "false":true, "iota":true, "nil":true, "append":true, + "cap":true, "close":true, "complex":true, "copy":true, "delete":true, "imag":true, + "len":true, "make":true, "new":true, "panic":true, "print":true, + "println":true, "real":true, "recover":true + }; + + var isOperatorChar = /[+\-*&^%:=<>!|\/]/; + + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'" || ch == "`") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\d\.]/.test(ch)) { + if (ch == ".") { + stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); + } else if (ch == "0") { + stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); + } else { + stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); + } + return "number"; + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) { + if (cur == "case" || cur == "default") curPunc = "case"; + return "keyword"; + } + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && quote != "`" && next == "\\"; + } + if (end || !(escaped || quote == "`")) + state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + function popContext(state) { + if (!state.context.prev) return; + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + if (ctx.type == "case") ctx.type = "}"; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "case") ctx.type = "case"; + else if (curPunc == "}" && ctx.type == "}") popContext(state); + else if (curPunc == ctx.type) popContext(state); + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) { + state.context.type = "}"; + return ctx.indented; + } + var closing = firstChar == ctx.type; + if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}):", + closeBrackets: "()[]{}''\"\"``", + fold: "brace", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-go", "go"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/groovy/groovy.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/groovy/groovy.js new file mode 100644 index 0000000000..848a07719f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/groovy/groovy.js @@ -0,0 +1,247 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("groovy", function(config) { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = words( + "abstract as assert boolean break byte case catch char class const continue def default " + + "do double else enum extends final finally float for goto if implements import in " + + "instanceof int interface long native new package private protected public return " + + "short static strictfp super switch synchronized threadsafe throw throws trait transient " + + "try void volatile while"); + var blockKeywords = words("catch class def do else enum finally for if interface switch trait try while"); + var standaloneKeywords = words("return break continue"); + var atoms = words("null true false this"); + + var curPunc; + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + return startString(ch, stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); } + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize.push(tokenComment); + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + if (expectExpression(state.lastToken, false)) { + return startString(ch, stream, state); + } + } + if (ch == "-" && stream.eat(">")) { + curPunc = "->"; + return null; + } + if (/[+\-*&%=<>!?|\/~]/.test(ch)) { + stream.eatWhile(/[+\-*&%=<>|~]/); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + if (ch == "@") { stream.eatWhile(/[\w\$_\.]/); return "meta"; } + if (state.lastToken == ".") return "property"; + if (stream.eat(":")) { curPunc = "proplabel"; return "property"; } + var cur = stream.current(); + if (atoms.propertyIsEnumerable(cur)) { return "atom"; } + if (keywords.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = "standalone"; + return "keyword"; + } + return "variable"; + } + tokenBase.isBase = true; + + function startString(quote, stream, state) { + var tripleQuoted = false; + if (quote != "/" && stream.eat(quote)) { + if (stream.eat(quote)) tripleQuoted = true; + else return "string"; + } + function t(stream, state) { + var escaped = false, next, end = !tripleQuoted; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + if (!tripleQuoted) { break; } + if (stream.match(quote + quote)) { end = true; break; } + } + if (quote == '"' && next == "$" && !escaped) { + if (stream.eat("{")) { + state.tokenize.push(tokenBaseUntilBrace()); + return "string"; + } else if (stream.match(/^\w/, false)) { + state.tokenize.push(tokenVariableDeref); + return "string"; + } + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize.pop(); + return "string"; + } + state.tokenize.push(t); + return t(stream, state); + } + + function tokenBaseUntilBrace() { + var depth = 1; + function t(stream, state) { + if (stream.peek() == "}") { + depth--; + if (depth == 0) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } + } else if (stream.peek() == "{") { + depth++; + } + return tokenBase(stream, state); + } + t.isBase = true; + return t; + } + + function tokenVariableDeref(stream, state) { + var next = stream.match(/^(\.|[\w\$_]+)/) + if (!next) { + state.tokenize.pop() + return state.tokenize[state.tokenize.length-1](stream, state) + } + return next[0] == "." ? null : "variable" + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize.pop(); + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function expectExpression(last, newline) { + return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) || + last == "newstatement" || last == "keyword" || last == "proplabel" || + (last == "standalone" && !newline); + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: [tokenBase], + context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), + indented: 0, + startOfLine: true, + lastToken: null + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + // Automatic semicolon insertion + if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) { + popContext(state); ctx = state.context; + } + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = state.tokenize[state.tokenize.length-1](stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); + // Handle indentation for {x -> \n ... } + else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") { + popContext(state); + state.context.align = false; + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + state.lastToken = curPunc || style; + return style; + }, + + indent: function(state, textAfter) { + if (!state.tokenize[state.tokenize.length-1].isBase) return CodeMirror.Pass; + var firstChar = textAfter && textAfter.charAt(0), ctx = state.context; + if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) ctx = ctx.prev; + var closing = firstChar == ctx.type; + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : config.indentUnit); + }, + + electricChars: "{}", + closeBrackets: {triples: "'\""}, + fold: "brace", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-groovy", "groovy"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haml/haml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haml/haml.js new file mode 100644 index 0000000000..d941d97433 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haml/haml.js @@ -0,0 +1,161 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + + // full haml mode. This handled embedded ruby and html fragments too + CodeMirror.defineMode("haml", function(config) { + var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); + var rubyMode = CodeMirror.getMode(config, "ruby"); + + function rubyInQuote(endQuote) { + return function(stream, state) { + var ch = stream.peek(); + if (ch == endQuote && state.rubyState.tokenize.length == 1) { + // step out of ruby context as it seems to complete processing all the braces + stream.next(); + state.tokenize = html; + return "closeAttributeTag"; + } else { + return ruby(stream, state); + } + }; + } + + function ruby(stream, state) { + if (stream.match("-#")) { + stream.skipToEnd(); + return "comment"; + } + return rubyMode.token(stream, state.rubyState); + } + + function html(stream, state) { + var ch = stream.peek(); + + // handle haml declarations. All declarations that cant be handled here + // will be passed to html mode + if (state.previousToken.style == "comment" ) { + if (state.indented > state.previousToken.indented) { + stream.skipToEnd(); + return "commentLine"; + } + } + + if (state.startOfLine) { + if (ch == "!" && stream.match("!!")) { + stream.skipToEnd(); + return "tag"; + } else if (stream.match(/^%[\w:#\.]+=/)) { + state.tokenize = ruby; + return "hamlTag"; + } else if (stream.match(/^%[\w:]+/)) { + return "hamlTag"; + } else if (ch == "/" ) { + stream.skipToEnd(); + return "comment"; + } + } + + if (state.startOfLine || state.previousToken.style == "hamlTag") { + if ( ch == "#" || ch == ".") { + stream.match(/[\w-#\.]*/); + return "hamlAttribute"; + } + } + + // do not handle --> as valid ruby, make it HTML close comment instead + if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) { + state.tokenize = ruby; + return state.tokenize(stream, state); + } + + if (state.previousToken.style == "hamlTag" || + state.previousToken.style == "closeAttributeTag" || + state.previousToken.style == "hamlAttribute") { + if (ch == "(") { + state.tokenize = rubyInQuote(")"); + return state.tokenize(stream, state); + } else if (ch == "{") { + if (!stream.match(/^\{%.*/)) { + state.tokenize = rubyInQuote("}"); + return state.tokenize(stream, state); + } + } + } + + return htmlMode.token(stream, state.htmlState); + } + + return { + // default to html mode + startState: function() { + var htmlState = CodeMirror.startState(htmlMode); + var rubyState = CodeMirror.startState(rubyMode); + return { + htmlState: htmlState, + rubyState: rubyState, + indented: 0, + previousToken: { style: null, indented: 0}, + tokenize: html + }; + }, + + copyState: function(state) { + return { + htmlState : CodeMirror.copyState(htmlMode, state.htmlState), + rubyState: CodeMirror.copyState(rubyMode, state.rubyState), + indented: state.indented, + previousToken: state.previousToken, + tokenize: state.tokenize + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + state.startOfLine = false; + // dont record comment line as we only want to measure comment line with + // the opening comment block + if (style && style != "commentLine") { + state.previousToken = { style: style, indented: state.indented }; + } + // if current state is ruby and the previous token is not `,` reset the + // tokenize to html + if (stream.eol() && state.tokenize == ruby) { + stream.backUp(1); + var ch = stream.peek(); + stream.next(); + if (ch && ch != ",") { + state.tokenize = html; + } + } + // reprocess some of the specific style tag when finish setting previousToken + if (style == "hamlTag") { + style = "tag"; + } else if (style == "commentLine") { + style = "comment"; + } else if (style == "hamlAttribute") { + style = "attribute"; + } else if (style == "closeAttributeTag") { + style = null; + } + return style; + } + }; + }, "htmlmixed", "ruby"); + + CodeMirror.defineMIME("text/x-haml", "haml"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/handlebars/handlebars.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/handlebars/handlebars.js new file mode 100644 index 0000000000..359871a20d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/handlebars/handlebars.js @@ -0,0 +1,70 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple"), require("../../addon/mode/multiplex")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple", "../../addon/mode/multiplex"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineSimpleMode("handlebars-tags", { + start: [ + { regex: /\{\{\{/, push: "handlebars_raw", token: "tag" }, + { regex: /\{\{!--/, push: "dash_comment", token: "comment" }, + { regex: /\{\{!/, push: "comment", token: "comment" }, + { regex: /\{\{/, push: "handlebars", token: "tag" } + ], + handlebars_raw: [ + { regex: /\}\}\}/, pop: true, token: "tag" }, + ], + handlebars: [ + { regex: /\}\}/, pop: true, token: "tag" }, + + // Double and single quotes + { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, + { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, + + // Handlebars keywords + { regex: />|[#\/]([A-Za-z_]\w*)/, token: "keyword" }, + { regex: /(?:else|this)\b/, token: "keyword" }, + + // Numeral + { regex: /\d+/i, token: "number" }, + + // Atoms like = and . + { regex: /=|~|@|true|false/, token: "atom" }, + + // Paths + { regex: /(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/, token: "variable-2" } + ], + dash_comment: [ + { regex: /--\}\}/, pop: true, token: "comment" }, + + // Commented code + { regex: /./, token: "comment"} + ], + comment: [ + { regex: /\}\}/, pop: true, token: "comment" }, + { regex: /./, token: "comment" } + ], + meta: { + blockCommentStart: "{{--", + blockCommentEnd: "--}}" + } + }); + + CodeMirror.defineMode("handlebars", function(config, parserConfig) { + var handlebars = CodeMirror.getMode(config, "handlebars-tags"); + if (!parserConfig || !parserConfig.base) return handlebars; + return CodeMirror.multiplexingMode( + CodeMirror.getMode(config, parserConfig.base), + {open: "{{", close: /\}\}\}?/, mode: handlebars, parseDelimiters: true} + ); + }); + + CodeMirror.defineMIME("text/x-handlebars-template", "handlebars"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell-literate/haskell-literate.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell-literate/haskell-literate.js new file mode 100644 index 0000000000..4bb9268491 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell-literate/haskell-literate.js @@ -0,0 +1,43 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../haskell/haskell")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../haskell/haskell"], mod) + else // Plain browser env + mod(CodeMirror) +})(function (CodeMirror) { + "use strict" + + CodeMirror.defineMode("haskell-literate", function (config, parserConfig) { + var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || "haskell") + + return { + startState: function () { + return { + inCode: false, + baseState: CodeMirror.startState(baseMode) + } + }, + token: function (stream, state) { + if (stream.sol()) { + if (state.inCode = stream.eat(">")) + return "meta" + } + if (state.inCode) { + return baseMode.token(stream, state.baseState) + } else { + stream.skipToEnd() + return "comment" + } + }, + innerMode: function (state) { + return state.inCode ? {state: state.baseState, mode: baseMode} : null + } + } + }, "haskell") + + CodeMirror.defineMIME("text/x-literate-haskell", "haskell-literate") +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell/haskell.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell/haskell.js new file mode 100644 index 0000000000..2e882dc600 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haskell/haskell.js @@ -0,0 +1,268 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("haskell", function(_config, modeConfig) { + + function switchState(source, setState, f) { + setState(f); + return f(source, setState); + } + + // These should all be Unicode extended, as per the Haskell 2010 report + var smallRE = /[a-z_]/; + var largeRE = /[A-Z]/; + var digitRE = /\d/; + var hexitRE = /[0-9A-Fa-f]/; + var octitRE = /[0-7]/; + var idRE = /[a-z_A-Z0-9'\xa1-\uffff]/; + var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/; + var specialRE = /[(),;[\]`{}]/; + var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer + + function normal(source, setState) { + if (source.eatWhile(whiteCharRE)) { + return null; + } + + var ch = source.next(); + if (specialRE.test(ch)) { + if (ch == '{' && source.eat('-')) { + var t = "comment"; + if (source.eat('#')) { + t = "meta"; + } + return switchState(source, setState, ncomment(t, 1)); + } + return null; + } + + if (ch == '\'') { + if (source.eat('\\')) { + source.next(); // should handle other escapes here + } + else { + source.next(); + } + if (source.eat('\'')) { + return "string"; + } + return "string error"; + } + + if (ch == '"') { + return switchState(source, setState, stringLiteral); + } + + if (largeRE.test(ch)) { + source.eatWhile(idRE); + if (source.eat('.')) { + return "qualifier"; + } + return "variable-2"; + } + + if (smallRE.test(ch)) { + source.eatWhile(idRE); + return "variable"; + } + + if (digitRE.test(ch)) { + if (ch == '0') { + if (source.eat(/[xX]/)) { + source.eatWhile(hexitRE); // should require at least 1 + return "integer"; + } + if (source.eat(/[oO]/)) { + source.eatWhile(octitRE); // should require at least 1 + return "number"; + } + } + source.eatWhile(digitRE); + var t = "number"; + if (source.match(/^\.\d+/)) { + t = "number"; + } + if (source.eat(/[eE]/)) { + t = "number"; + source.eat(/[-+]/); + source.eatWhile(digitRE); // should require at least 1 + } + return t; + } + + if (ch == "." && source.eat(".")) + return "keyword"; + + if (symbolRE.test(ch)) { + if (ch == '-' && source.eat(/-/)) { + source.eatWhile(/-/); + if (!source.eat(symbolRE)) { + source.skipToEnd(); + return "comment"; + } + } + var t = "variable"; + if (ch == ':') { + t = "variable-2"; + } + source.eatWhile(symbolRE); + return t; + } + + return "error"; + } + + function ncomment(type, nest) { + if (nest == 0) { + return normal; + } + return function(source, setState) { + var currNest = nest; + while (!source.eol()) { + var ch = source.next(); + if (ch == '{' && source.eat('-')) { + ++currNest; + } + else if (ch == '-' && source.eat('}')) { + --currNest; + if (currNest == 0) { + setState(normal); + return type; + } + } + } + setState(ncomment(type, currNest)); + return type; + }; + } + + function stringLiteral(source, setState) { + while (!source.eol()) { + var ch = source.next(); + if (ch == '"') { + setState(normal); + return "string"; + } + if (ch == '\\') { + if (source.eol() || source.eat(whiteCharRE)) { + setState(stringGap); + return "string"; + } + if (source.eat('&')) { + } + else { + source.next(); // should handle other escapes here + } + } + } + setState(normal); + return "string error"; + } + + function stringGap(source, setState) { + if (source.eat('\\')) { + return switchState(source, setState, stringLiteral); + } + source.next(); + setState(normal); + return "error"; + } + + + var wellKnownWords = (function() { + var wkw = {}; + function setType(t) { + return function () { + for (var i = 0; i < arguments.length; i++) + wkw[arguments[i]] = t; + }; + } + + setType("keyword")( + "case", "class", "data", "default", "deriving", "do", "else", "foreign", + "if", "import", "in", "infix", "infixl", "infixr", "instance", "let", + "module", "newtype", "of", "then", "type", "where", "_"); + + setType("keyword")( + "\.\.", ":", "::", "=", "\\", "<-", "->", "@", "~", "=>"); + + setType("builtin")( + "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<*", "<=", + "<$>", "<*>", "=<<", "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", + "*>", "**"); + + setType("builtin")( + "Applicative", "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", + "Eq", "False", "FilePath", "Float", "Floating", "Fractional", "Functor", + "GT", "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left", + "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read", + "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS", + "String", "True"); + + setType("builtin")( + "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf", + "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling", + "compare", "concat", "concatMap", "const", "cos", "cosh", "curry", + "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either", + "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo", + "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter", + "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap", + "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger", + "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents", + "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized", + "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last", + "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map", + "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound", + "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or", + "otherwise", "pi", "pred", "print", "product", "properFraction", "pure", + "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile", + "readIO", "readList", "readLn", "readParen", "reads", "readsPrec", + "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse", + "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq", + "sequence", "sequence_", "show", "showChar", "showList", "showParen", + "showString", "shows", "showsPrec", "significand", "signum", "sin", + "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum", + "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger", + "toRational", "truncate", "uncurry", "undefined", "unlines", "until", + "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip", + "zip3", "zipWith", "zipWith3"); + + var override = modeConfig.overrideKeywords; + if (override) for (var word in override) if (override.hasOwnProperty(word)) + wkw[word] = override[word]; + + return wkw; + })(); + + + + return { + startState: function () { return { f: normal }; }, + copyState: function (s) { return { f: s.f }; }, + + token: function(stream, state) { + var t = state.f(stream, function(s) { state.f = s; }); + var w = stream.current(); + return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t; + }, + + blockCommentStart: "{-", + blockCommentEnd: "-}", + lineComment: "--" + }; + +}); + +CodeMirror.defineMIME("text/x-haskell", "haskell"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haxe/haxe.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haxe/haxe.js new file mode 100644 index 0000000000..45376852a6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/haxe/haxe.js @@ -0,0 +1,515 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("haxe", function(config, parserConfig) { + var indentUnit = config.indentUnit; + + // Tokenizer + + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"}; + var type = kw("typedef"); + var keywords = { + "if": A, "while": A, "else": B, "do": B, "try": B, + "return": C, "break": C, "continue": C, "new": C, "throw": C, + "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"), + "public": attribute, "private": attribute, "cast": kw("cast"), "import": kw("import"), "macro": kw("macro"), + "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "never": kw("property_access"), "trace":kw("trace"), + "class": type, "abstract":type, "enum":type, "interface":type, "typedef":type, "extends":type, "implements":type, "dynamic":type, + "true": atom, "false": atom, "null": atom + }; + + var isOperatorChar = /[+\-*&%=<>!?|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function toUnescaped(stream, end) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (next == end && !escaped) + return true; + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + + function haxeTokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + return chain(stream, state, haxeTokenString(ch)); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i); + return ret("number", "number"); + } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { + stream.match(/^\d*(?:\.\d*(?!\.))?(?:[eE][+\-]?\d+)?/); + return ret("number", "number"); + } else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) { + toUnescaped(stream, "/"); + stream.eatWhile(/[gimsu]/); + return ret("regexp", "string-2"); + } else if (ch == "/") { + if (stream.eat("*")) { + return chain(stream, state, haxeTokenComment); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } + } else if (ch == "#") { + stream.skipToEnd(); + return ret("conditional", "meta"); + } else if (ch == "@") { + stream.eat(/:/); + stream.eatWhile(/[\w_]/); + return ret ("metadata", "meta"); + } else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } else { + var word; + if(/[A-Z]/.test(ch)) { + stream.eatWhile(/[\w_<>]/); + word = stream.current(); + return ret("type", "variable-3", word); + } else { + stream.eatWhile(/[\w_]/); + var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; + return (known && state.kwAllowed) ? ret(known.type, known.style, word) : + ret("variable", "variable", word); + } + } + } + + function haxeTokenString(quote) { + return function(stream, state) { + if (toUnescaped(stream, quote)) + state.tokenize = haxeTokenBase; + return ret("string", "string"); + }; + } + + function haxeTokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = haxeTokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; + + function HaxeLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + } + + function parseHaxe(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + if (type == "variable" && imported(state, content)) return "variable-3"; + return style; + } + } + } + + function imported(state, typename) { + if (/[a-z]/.test(typename.charAt(0))) + return false; + var len = state.importedtypes.length; + for (var i = 0; i= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) + if (v.name == name) return true; + return false; + } + function register(varname) { + var state = cx.state; + if (state.context) { + cx.marked = "def"; + if (inList(varname, state.localVars)) return; + state.localVars = {name: varname, next: state.localVars}; + } else if (state.globalVars) { + if (inList(varname, state.globalVars)) return; + state.globalVars = {name: varname, next: state.globalVars}; + } + } + + // Combinators + + var defaultVars = {name: "this", next: null}; + function pushcontext() { + if (!cx.state.context) cx.state.localVars = defaultVars; + cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; + } + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + popcontext.lex = true; + function pushlex(type, info) { + var result = function() { + var state = cx.state; + state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function f(type) { + if (type == wanted) return cont(); + else if (wanted == ";") return pass(); + else return cont(f); + } + return f; + } + + function statement(type) { + if (type == "@") return cont(metadef); + if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "{") return cont(pushlex("}"), pushcontext, block, poplex, popcontext); + if (type == ";") return cont(); + if (type == "attribute") return cont(maybeattribute); + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), + poplex, statement, poplex); + if (type == "variable") return cont(pushlex("stat"), maybelabel); + if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), + block, poplex, poplex); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), + statement, poplex, popcontext); + if (type == "import") return cont(importdef, expect(";")); + if (type == "typedef") return cont(typedef); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function expression(type) { + if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); + if (type == "type" ) return cont(maybeoperator); + if (type == "function") return cont(functiondef); + if (type == "keyword c") return cont(maybeexpression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); + if (type == "operator") return cont(expression); + if (type == "[") return cont(pushlex("]"), commasep(maybeexpression, "]"), poplex, maybeoperator); + if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperator(type, value) { + if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); + if (type == "operator" || type == ":") return cont(expression); + if (type == ";") return; + if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); + if (type == ".") return cont(property, maybeoperator); + if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); + } + + function maybeattribute(type) { + if (type == "attribute") return cont(maybeattribute); + if (type == "function") return cont(functiondef); + if (type == "var") return cont(vardef1); + } + + function metadef(type) { + if(type == ":") return cont(metadef); + if(type == "variable") return cont(metadef); + if(type == "(") return cont(pushlex(")"), commasep(metaargs, ")"), poplex, statement); + } + function metaargs(type) { + if(type == "variable") return cont(); + } + + function importdef (type, value) { + if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } + else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef); + } + + function typedef (type, value) + { + if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } + else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); } + } + + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperator, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type) { + if (type == "variable") cx.marked = "property"; + if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); + } + function commasep(what, end) { + function proceed(type) { + if (type == ",") return cont(what, proceed); + if (type == end) return cont(); + return cont(expect(end)); + } + return function(type) { + if (type == end) return cont(); + else return pass(what, proceed); + }; + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function vardef1(type, value) { + if (type == "variable"){register(value); return cont(typeuse, vardef2);} + return cont(); + } + function vardef2(type, value) { + if (value == "=") return cont(expression, vardef2); + if (type == ",") return cont(vardef1); + } + function forspec1(type, value) { + if (type == "variable") { + register(value); + return cont(forin, expression) + } else { + return pass() + } + } + function forin(_type, value) { + if (value == "in") return cont(); + } + function functiondef(type, value) { + //function names starting with upper-case letters are recognised as types, so cludging them together here. + if (type == "variable" || type == "type") {register(value); return cont(functiondef);} + if (value == "new") return cont(functiondef); + if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, typeuse, statement, popcontext); + } + function typeuse(type) { + if(type == ":") return cont(typestring); + } + function typestring(type) { + if(type == "type") return cont(); + if(type == "variable") return cont(); + if(type == "{") return cont(pushlex("}"), commasep(typeprop, "}"), poplex); + } + function typeprop(type) { + if(type == "variable") return cont(typeuse); + } + function funarg(type, value) { + if (type == "variable") {register(value); return cont(typeuse);} + } + + // Interface + return { + startState: function(basecolumn) { + var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"]; + var state = { + tokenize: haxeTokenBase, + reAllowed: true, + kwAllowed: true, + cc: [], + lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + importedtypes: defaulttypes, + context: parserConfig.localVars && {vars: parserConfig.localVars}, + indented: 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/)); + state.kwAllowed = type != '.'; + return parseHaxe(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize != haxeTokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; + if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + if (type == "vardef") return lexical.indented + 4; + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "stat" || type == "form") return lexical.indented + indentUnit; + else if (lexical.info == "switch" && !closing) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME("text/x-haxe", "haxe"); + +CodeMirror.defineMode("hxml", function () { + + return { + startState: function () { + return { + define: false, + inString: false + }; + }, + token: function (stream, state) { + var ch = stream.peek(); + var sol = stream.sol(); + + ///* comments */ + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + if (sol && ch == "-") { + var style = "variable-2"; + + stream.eat(/-/); + + if (stream.peek() == "-") { + stream.eat(/-/); + style = "keyword a"; + } + + if (stream.peek() == "D") { + stream.eat(/[D]/); + style = "keyword c"; + state.define = true; + } + + stream.eatWhile(/[A-Z]/i); + return style; + } + + var ch = stream.peek(); + + if (state.inString == false && ch == "'") { + state.inString = true; + stream.next(); + } + + if (state.inString == true) { + if (stream.skipTo("'")) { + + } else { + stream.skipToEnd(); + } + + if (stream.peek() == "'") { + stream.next(); + state.inString = false; + } + + return "string"; + } + + stream.next(); + return null; + }, + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/x-hxml", "hxml"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlembedded/htmlembedded.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlembedded/htmlembedded.js new file mode 100644 index 0000000000..439e63a427 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlembedded/htmlembedded.js @@ -0,0 +1,37 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/multiplex")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/multiplex"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("htmlembedded", function(config, parserConfig) { + var closeComment = parserConfig.closeComment || "--%>" + return CodeMirror.multiplexingMode(CodeMirror.getMode(config, "htmlmixed"), { + open: parserConfig.openComment || "<%--", + close: closeComment, + delimStyle: "comment", + mode: {token: function(stream) { + stream.skipTo(closeComment) || stream.skipToEnd() + return "comment" + }} + }, { + open: parserConfig.open || parserConfig.scriptStartRegex || "<%", + close: parserConfig.close || parserConfig.scriptEndRegex || "%>", + mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec) + }); + }, "htmlmixed"); + + CodeMirror.defineMIME("application/x-ejs", {name: "htmlembedded", scriptingModeSpec:"javascript"}); + CodeMirror.defineMIME("application/x-aspx", {name: "htmlembedded", scriptingModeSpec:"text/x-csharp"}); + CodeMirror.defineMIME("application/x-jsp", {name: "htmlembedded", scriptingModeSpec:"text/x-java"}); + CodeMirror.defineMIME("application/x-erb", {name: "htmlembedded", scriptingModeSpec:"ruby"}); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlmixed/htmlmixed.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlmixed/htmlmixed.js new file mode 100644 index 0000000000..af3138179a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/htmlmixed/htmlmixed.js @@ -0,0 +1,153 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var defaultTags = { + script: [ + ["lang", /(javascript|babel)/i, "javascript"], + ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i, "javascript"], + ["type", /./, "text/plain"], + [null, null, "javascript"] + ], + style: [ + ["lang", /^css$/i, "css"], + ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], + ["type", /./, "text/plain"], + [null, null, "css"] + ] + }; + + function maybeBackup(stream, pat, style) { + var cur = stream.current(), close = cur.search(pat); + if (close > -1) { + stream.backUp(cur.length - close); + } else if (cur.match(/<\/?$/)) { + stream.backUp(cur.length); + if (!stream.match(pat, false)) stream.match(cur); + } + return style; + } + + var attrRegexpCache = {}; + function getAttrRegexp(attr) { + var regexp = attrRegexpCache[attr]; + if (regexp) return regexp; + return attrRegexpCache[attr] = new RegExp("\\s+" + attr + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*"); + } + + function getAttrValue(text, attr) { + var match = text.match(getAttrRegexp(attr)) + return match ? /^\s*(.*?)\s*$/.exec(match[2])[1] : "" + } + + function getTagRegexp(tagName, anchored) { + return new RegExp((anchored ? "^" : "") + "<\/\\s*" + tagName + "\\s*>", "i"); + } + + function addTags(from, to) { + for (var tag in from) { + var dest = to[tag] || (to[tag] = []); + var source = from[tag]; + for (var i = source.length - 1; i >= 0; i--) + dest.unshift(source[i]) + } + } + + function findMatchingMode(tagInfo, tagText) { + for (var i = 0; i < tagInfo.length; i++) { + var spec = tagInfo[i]; + if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2]; + } + } + + CodeMirror.defineMode("htmlmixed", function (config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, { + name: "xml", + htmlMode: true, + multilineTagIndentFactor: parserConfig.multilineTagIndentFactor, + multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag, + allowMissingTagName: parserConfig.allowMissingTagName, + }); + + var tags = {}; + var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes; + addTags(defaultTags, tags); + if (configTags) addTags(configTags, tags); + if (configScript) for (var i = configScript.length - 1; i >= 0; i--) + tags.script.unshift(["type", configScript[i].matches, configScript[i].mode]) + + function html(stream, state) { + var style = htmlMode.token(stream, state.htmlState), tag = /\btag\b/.test(style), tagName + if (tag && !/[<>\s\/]/.test(stream.current()) && + (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) && + tags.hasOwnProperty(tagName)) { + state.inTag = tagName + " " + } else if (state.inTag && tag && />$/.test(stream.current())) { + var inTag = /^([\S]+) (.*)/.exec(state.inTag) + state.inTag = null + var modeSpec = stream.current() == ">" && findMatchingMode(tags[inTag[1]], inTag[2]) + var mode = CodeMirror.getMode(config, modeSpec) + var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false); + state.token = function (stream, state) { + if (stream.match(endTagA, false)) { + state.token = html; + state.localState = state.localMode = null; + return null; + } + return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState)); + }; + state.localMode = mode; + state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, "", "")); + } else if (state.inTag) { + state.inTag += stream.current() + if (stream.eol()) state.inTag += " " + } + return style; + }; + + return { + startState: function () { + var state = CodeMirror.startState(htmlMode); + return {token: html, inTag: null, localMode: null, localState: null, htmlState: state}; + }, + + copyState: function (state) { + var local; + if (state.localState) { + local = CodeMirror.copyState(state.localMode, state.localState); + } + return {token: state.token, inTag: state.inTag, + localMode: state.localMode, localState: local, + htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; + }, + + token: function (stream, state) { + return state.token(stream, state); + }, + + indent: function (state, textAfter, line) { + if (!state.localMode || /^\s*<\//.test(textAfter)) + return htmlMode.indent(state.htmlState, textAfter, line); + else if (state.localMode.indent) + return state.localMode.indent(state.localState, textAfter, line); + else + return CodeMirror.Pass; + }, + + innerMode: function (state) { + return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode}; + } + }; + }, "xml", "javascript", "css"); + + CodeMirror.defineMIME("text/html", "htmlmixed"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/http/http.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/http/http.js new file mode 100644 index 0000000000..092353259f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/http/http.js @@ -0,0 +1,113 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("http", function() { + function failFirstLine(stream, state) { + stream.skipToEnd(); + state.cur = header; + return "error"; + } + + function start(stream, state) { + if (stream.match(/^HTTP\/\d\.\d/)) { + state.cur = responseStatusCode; + return "keyword"; + } else if (stream.match(/^[A-Z]+/) && /[ \t]/.test(stream.peek())) { + state.cur = requestPath; + return "keyword"; + } else { + return failFirstLine(stream, state); + } + } + + function responseStatusCode(stream, state) { + var code = stream.match(/^\d+/); + if (!code) return failFirstLine(stream, state); + + state.cur = responseStatusText; + var status = Number(code[0]); + if (status >= 100 && status < 200) { + return "positive informational"; + } else if (status >= 200 && status < 300) { + return "positive success"; + } else if (status >= 300 && status < 400) { + return "positive redirect"; + } else if (status >= 400 && status < 500) { + return "negative client-error"; + } else if (status >= 500 && status < 600) { + return "negative server-error"; + } else { + return "error"; + } + } + + function responseStatusText(stream, state) { + stream.skipToEnd(); + state.cur = header; + return null; + } + + function requestPath(stream, state) { + stream.eatWhile(/\S/); + state.cur = requestProtocol; + return "string-2"; + } + + function requestProtocol(stream, state) { + if (stream.match(/^HTTP\/\d\.\d$/)) { + state.cur = header; + return "keyword"; + } else { + return failFirstLine(stream, state); + } + } + + function header(stream) { + if (stream.sol() && !stream.eat(/[ \t]/)) { + if (stream.match(/^.*?:/)) { + return "atom"; + } else { + stream.skipToEnd(); + return "error"; + } + } else { + stream.skipToEnd(); + return "string"; + } + } + + function body(stream) { + stream.skipToEnd(); + return null; + } + + return { + token: function(stream, state) { + var cur = state.cur; + if (cur != header && cur != body && stream.eatSpace()) return null; + return cur(stream, state); + }, + + blankLine: function(state) { + state.cur = body; + }, + + startState: function() { + return {cur: start}; + } + }; +}); + +CodeMirror.defineMIME("message/http", "http"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/idl/idl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/idl/idl.js new file mode 100644 index 0000000000..37302bb90f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/idl/idl.js @@ -0,0 +1,290 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp('^((' + words.join(')|(') + '))\\b', 'i'); + }; + + var builtinArray = [ + 'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog', + 'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir', + 'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices', + 'arrow', 'ascii_template', 'asin', 'assoc', 'atan', + 'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot', + 'bar_plot', 'beseli', 'beselj', 'beselk', 'besely', + 'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template', + 'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy', + 'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor', + 'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr', + 'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar', + 'caldat', 'call_external', 'call_function', 'call_method', + 'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil', + 'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc', + 'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close', + 'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage', + 'color_convert', 'color_exchange', 'color_quan', 'color_range_map', + 'colorbar', 'colorize_sample', 'colormap_applicable', + 'colormap_gradient', 'colormap_rotation', 'colortable', + 'comfit', 'command_line_args', 'common', 'compile_opt', 'complex', + 'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid', + 'conj', 'constrained_min', 'contour', 'contour', 'convert_coord', + 'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate', + 'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata', + 'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength', + 'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord', + 'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load', + 'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index', + 'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form', + 'cw_fslider', 'cw_light_editor', 'cw_light_editor_get', + 'cw_light_editor_set', 'cw_orient', 'cw_palette_editor', + 'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu', + 'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists', + 'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key', + 'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv', + 'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig', + 'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect', + 'dialog_message', 'dialog_pickfile', 'dialog_printersetup', + 'dialog_printjob', 'dialog_read_image', + 'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen', + 'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register', + 'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont', + 'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss', + 'empty', 'enable_sysrtn', 'eof', 'eos', 'erase', + 'erf', 'erfc', 'erfcx', 'erode', 'errorplot', + 'errplot', 'estimator_filter', 'execute', 'exit', 'exp', + 'expand', 'expand_path', 'expint', 'extract', 'extract_slice', + 'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename', + 'file_chmod', 'file_copy', 'file_delete', 'file_dirname', + 'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info', + 'file_lines', 'file_link', 'file_mkdir', 'file_move', + 'file_poll_input', 'file_readlink', 'file_same', + 'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip', + 'file_which', 'file_zip', 'filepath', 'findgen', 'finite', + 'fix', 'flick', 'float', 'floor', 'flow3', + 'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun', + 'fstat', 'fulstr', 'funct', 'function', 'fv_test', + 'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf', + 'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit', + 'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects', + 'get_kbrd', 'get_login_info', + 'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul', + 'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata', + 'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash', + 'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave', + 'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d', + 'hist_equal', 'histogram', 'hls', 'hough', 'hqr', + 'hsv', 'i18n_multibytetoutf8', + 'i18n_multibytetowidechar', 'i18n_utf8tomultibyte', + 'i18n_widechartomultibyte', + 'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity', + 'idl_base64', 'idl_container', 'idl_validname', + 'idlexbr_assistant', 'idlitsys_createtool', + 'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata', + 'igetid', 'igetproperty', 'iimage', 'image', 'image_cont', + 'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen', + 'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol', + 'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen', + 'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata', + 'iregister', 'ireset', 'iresolve', 'irotate', 'isa', + 'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft', + 'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate', + 'ivector', 'ivolume', 'izoom', 'journal', 'json_parse', + 'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d', + 'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove', + 'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec', + 'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert', + 'la_least_square_equality', 'la_least_squares', 'la_linear_equation', + 'la_ludc', 'la_lumprove', 'la_lusol', + 'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired', + 'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre', + 'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter', + 'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen', + 'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit', + 'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get', + 'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr', + 'long', 'long64', 'lsode', 'lu_complex', 'ludc', + 'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array', + 'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid', + 'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch', + 'map_proj_forward', 'map_proj_image', 'map_proj_info', + 'map_proj_init', 'map_proj_inverse', + 'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test', + 'mean', 'meanabsdev', 'mean_filter', 'median', 'memory', + 'mesh_clip', 'mesh_decimate', 'mesh_issolid', + 'mesh_merge', 'mesh_numtriangles', + 'mesh_obj', 'mesh_smooth', 'mesh_surfacearea', + 'mesh_validate', 'mesh_volume', + 'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct', + 'moment', 'morph_close', 'morph_distance', + 'morph_gradient', 'morph_hitormiss', + 'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements', + 'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl', + 'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class', + 'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid', + 'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr', + 'openu', 'openw', 'oplot', 'oploterr', 'orderedhash', + 'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep', + 'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox', + 'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface', + 'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot', + 'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv', + 'polygon', 'polyline', 'polywarp', 'popd', 'powell', + 'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes', + 'print', 'printf', 'printd', 'pro', 'product', + 'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts', + 'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid', + 'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb', + 'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp', + 'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg', + 'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm', + 'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate', + 'r_test', 'radon', 'randomn', 'randomu', 'ranks', + 'rdpix', 'read', 'readf', 'read_ascii', 'read_binary', + 'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image', + 'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict', + 'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk', + 'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap', + 'read_xwd', 'reads', 'readu', 'real_part', 'rebin', + 'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow', + 'register_cursor', 'regress', 'replicate', + 'replicate_inplace', 'resolve_all', + 'resolve_routine', 'restore', 'retall', 'return', 'reverse', + 'rk4', 'roberts', 'rot', 'rotate', 'round', + 'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save', + 'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d', + 'scope_level', 'scope_traceback', 'scope_varfetch', + 'scope_varname', 'search2d', + 'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release', + 'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf', + 'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug', + 'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont', + 'signum', 'simplex', 'sin', 'sindgen', 'sinh', + 'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image', + 'smooth', 'sobel', 'socket', 'sort', 'spawn', + 'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp', + 'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin', + 'sprstp', 'sqrt', 'standardize', 'stddev', 'stop', + 'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline', + 'stregex', 'stretch', 'string', 'strjoin', 'strlen', + 'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos', + 'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide', + 'strupcase', 'surface', 'surface', 'surfr', 'svdc', + 'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol', + 'systime', 't_cvf', 't_pdf', 't3d', 'tag_names', + 'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size', + 'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin', + 'thread', 'threed', 'tic', 'time_test2', 'timegen', + 'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc', + 'total', 'trace', 'transpose', 'tri_surf', 'triangulate', + 'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun', + 'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv', + 'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename', + 'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen', + 'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq', + 'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector', + 'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt', + 'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri', + 'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base', + 'widget_button', 'widget_combobox', 'widget_control', + 'widget_displaycontextmenu', 'widget_draw', + 'widget_droplist', 'widget_event', 'widget_info', + 'widget_label', 'widget_list', + 'widget_propertysheet', 'widget_slider', 'widget_tab', + 'widget_table', 'widget_text', + 'widget_tree', 'widget_tree_move', 'widget_window', + 'wiener_filter', 'window', + 'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image', + 'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png', + 'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff', + 'write_video', 'write_wav', 'write_wave', 'writeu', 'wset', + 'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet', + 'wv_denoise', 'wv_dwt', 'wv_fn_coiflet', + 'wv_fn_daubechies', 'wv_fn_gaussian', + 'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul', + 'wv_fn_symlet', 'wv_import_data', + 'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires', + 'wv_pwt', 'wv_tool_denoise', + 'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate', + 'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview', + 'xobjview_rotate', 'xobjview_write_image', + 'xpalette', 'xpcolor', 'xplot3d', + 'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit', + 'xvolume', 'xvolume_rotate', 'xvolume_write_image', + 'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24' + ]; + var builtins = wordRegexp(builtinArray); + + var keywordArray = [ + 'begin', 'end', 'endcase', 'endfor', + 'endwhile', 'endif', 'endrep', 'endforeach', + 'break', 'case', 'continue', 'for', + 'foreach', 'goto', 'if', 'then', 'else', + 'repeat', 'until', 'switch', 'while', + 'do', 'pro', 'function' + ]; + var keywords = wordRegexp(keywordArray); + + CodeMirror.registerHelper("hintWords", "idl", builtinArray.concat(keywordArray)); + + var identifiers = new RegExp('^[_a-z\xa1-\uffff][_a-z0-9\xa1-\uffff]*', 'i'); + + var singleOperators = /[+\-*&=<>\/@#~$]/; + var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i'); + + function tokenBase(stream) { + // whitespaces + if (stream.eatSpace()) return null; + + // Handle one line Comments + if (stream.match(';')) { + stream.skipToEnd(); + return 'comment'; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.+-]/, false)) { + if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) + return 'number'; + if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) + return 'number'; + if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) + return 'number'; + } + + // Handle Strings + if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } + if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } + + // Handle words + if (stream.match(keywords)) { return 'keyword'; } + if (stream.match(builtins)) { return 'builtin'; } + if (stream.match(identifiers)) { return 'variable'; } + + if (stream.match(singleOperators) || stream.match(boolOperators)) { + return 'operator'; } + + // Handle non-detected items + stream.next(); + return null; + }; + + CodeMirror.defineMode('idl', function() { + return { + token: function(stream) { + return tokenBase(stream); + } + }; + }); + + CodeMirror.defineMIME('text/x-idl', 'idl'); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/javascript/javascript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/javascript/javascript.js new file mode 100644 index 0000000000..7cfee313a3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/javascript/javascript.js @@ -0,0 +1,960 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var trackScope = parserConfig.trackScope !== false + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + return { + "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": D, "break": D, "continue": D, "new": kw("new"), "delete": C, "void": C, "throw": C, + "debugger": kw("debugger"), "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, + "this": kw("this"), "class": kw("class"), "super": kw("atom"), + "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, + "await": C + }; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + + function readRegexp(stream) { + var escaped = false, next, inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true; + else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eat("="); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#" && stream.peek() == "!") { + stream.skipToEnd(); + return ret("meta", "meta"); + } else if (ch == "#" && stream.eatWhile(wordRE)) { + return ret("variable", "property") + } else if (ch == "<" && stream.match("!--") || + (ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start)))) { + stream.skipToEnd() + return ret("comment", "comment") + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") { + if (stream.eat("=")) { + if (ch == "!" || ch == "=") stream.eat("=") + } else if (/[<>*+\-|&?]/.test(ch)) { + stream.eat(ch) + if (ch == ">") stream.eat(ch) + } + } + if (ch == "?" && stream.eat(".")) return ret(".") + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current() + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word] + return ret(kw.type, kw.style, word) + } + if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) + return ret("async", "keyword", word) + } + return ret("variable", "variable", word) + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenQuasi(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + + var brackets = "([{}])"; + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + + if (isTS) { // Try to skip TypeScript return type declarations after the arguments + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)) + if (m) arrow = m.index + } + + var depth = 0, sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { ++pos; break; } + if (--depth == 0) { if (ch == "(") sawSomething = true; break; } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/`]/.test(ch)) { + for (;; --pos) { + if (pos == 0) return + var next = stream.string.charAt(pos - 1) + if (next == ch && stream.string.charAt(pos - 2) != "\\") { pos--; break } + } + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, + "regexp": true, "this": true, "import": true, "jsonld-keyword": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + if (!trackScope) return false + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) + if (v.name == varname) return true; + } + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) if (v.name == name) return true + return false; + } + function register(varname) { + var state = cx.state; + cx.marked = "def"; + if (!trackScope) return + if (state.context) { + if (state.lexical.info == "var" && state.context && state.context.block) { + // FIXME function decls are also not block scoped + var newContext = registerVarScoped(varname, state.context) + if (newContext != null) { + state.context = newContext + return + } + } else if (!inList(varname, state.localVars)) { + state.localVars = new Var(varname, state.localVars) + return + } + } + // Fall through means this is global + if (parserConfig.globalVars && !inList(varname, state.globalVars)) + state.globalVars = new Var(varname, state.globalVars) + } + function registerVarScoped(varname, context) { + if (!context) { + return null + } else if (context.block) { + var inner = registerVarScoped(varname, context.prev) + if (!inner) return null + if (inner == context.prev) return context + return new Context(inner, context.vars, true) + } else if (inList(varname, context.vars)) { + return context + } else { + return new Context(context.prev, new Var(varname, context.vars), false) + } + } + + function isModifier(name) { + return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly" + } + + // Combinators + + function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block } + function Var(name, next) { this.name = name; this.next = next } + + var defaultVars = new Var("this", new Var("arguments", null)) + function pushcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, false) + cx.state.localVars = defaultVars + } + function pushblockcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, true) + cx.state.localVars = null + } + pushcontext.lex = pushblockcontext.lex = true + function popcontext() { + cx.state.localVars = cx.state.context.vars + cx.state.context = cx.state.context.prev + } + popcontext.lex = true + function pushlex(type, info) { + var result = function() { + var state = cx.state, indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented; + else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) + indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont(); + else if (wanted == ";" || type == "}" || type == ")" || type == "]") return pass(); + else return cont(exp); + }; + return exp; + } + + function statement(type, value) { + if (type == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); + if (type == "debugger") return cont(expect(";")); + if (type == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); + if (type == ";") return cont(); + if (type == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) + cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); + if (type == "class" || (isTS && value == "interface")) { + cx.marked = "keyword" + return cont(pushlex("form", type == "class" ? type : value), className, poplex) + } + if (type == "variable") { + if (isTS && value == "declare") { + cx.marked = "keyword" + return cont(statement) + } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { + cx.marked = "keyword" + if (value == "enum") return cont(enumdef); + else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";")); + else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) + } else if (isTS && value == "namespace") { + cx.marked = "keyword" + return cont(pushlex("form"), expression, statement, poplex) + } else if (isTS && value == "abstract") { + cx.marked = "keyword" + return cont(statement) + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, + block, poplex, poplex, popcontext); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); + if (type == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type == "async") return cont(statement) + if (value == "@") return cont(expression, statement) + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function maybeCatchBinding(type) { + if (type == "(") return cont(funarg, expect(")")) + } + function expression(type, value) { + return expressionInner(type, value, false); + } + function expressionNoComma(type, value) { + return expressionInner(type, value, true); + } + function parenExpr(type) { + if (type != "(") return pass() + return cont(pushlex(")"), maybeexpression, expect(")"), poplex) + } + function expressionInner(type, value, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); + else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); + if (type == "function") return cont(functiondef, maybeop); + if (type == "class" || (isTS && value == "interface")) { cx.marked = "keyword"; return cont(pushlex("form"), classExpression, poplex); } + if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type == "{") return contCommasep(objprop, "}", null, maybeop); + if (type == "quasi") return pass(quasi, maybeop); + if (type == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(maybeexpression); + return maybeoperatorNoComma(type, value, false); + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type == "operator") { + if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); + if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) + return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type == "quasi") { return pass(quasi, me); } + if (type == ";") return; + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type == ".") return cont(property, me); + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } + if (type == "regexp") { + cx.state.lastType = cx.marked = "operator" + cx.stream.backUp(cx.stream.pos - cx.stream.start - 1) + return cont(expr) + } + } + function quasi(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(maybeexpression, continueQuasi); + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expression); + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function(type) { + if (type == ".") return cont(noComma ? targetNoComma : target); + else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma) + else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } + } + function targetNoComma(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type, value) { + if (type == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params + if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) + cx.state.fatArrowAt = cx.stream.pos + m[0].length + return cont(afterprop); + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : (cx.style + " property"); + return cont(afterprop); + } else if (type == "jsonld-keyword") { + return cont(afterprop); + } else if (isTS && isModifier(value)) { + cx.marked = "keyword" + return cont(objprop) + } else if (type == "[") { + return cont(expression, maybetype, expect("]"), afterprop); + } else if (type == "spread") { + return cont(expressionNoComma, afterprop); + } else if (value == "*") { + cx.marked = "keyword"; + return cont(objprop); + } else if (type == ":") { + return pass(afterprop) + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma); + if (type == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type, value) { + if (sep ? sep.indexOf(type) > -1 : type == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function(type, value) { + if (type == end || value == end) return pass() + return pass(what) + }, proceed); + } + if (type == end || value == end) return cont(); + if (sep && sep.indexOf(";") > -1) return pass(what) + return cont(expect(end)); + } + return function(type, value) { + if (type == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) + cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type, value) { + if (isTS) { + if (type == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function maybetypeOrIn(type, value) { + if (isTS && (type == ":" || value == "in")) return cont(typeexpr) + } + function mayberettype(type) { + if (isTS && type == ":") { + if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr) + else return cont(typeexpr) + } + } + function isKW(_, value) { + if (value == "is") { + cx.marked = "keyword" + return cont() + } + } + function typeexpr(type, value) { + if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { + cx.marked = "keyword" + return cont(value == "typeof" ? expressionNoComma : typeexpr) + } + if (type == "variable" || value == "void") { + cx.marked = "type" + return cont(afterType) + } + if (value == "|" || value == "&") return cont(typeexpr) + if (type == "string" || type == "number" || type == "atom") return cont(afterType); + if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) + if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType) + if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType) + if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr) + if (type == "quasi") { return pass(quasiType, afterType); } + } + function maybeReturnType(type) { + if (type == "=>") return cont(typeexpr) + } + function typeprops(type) { + if (type.match(/[\}\)\]]/)) return cont() + if (type == "," || type == ";") return cont(typeprops) + return pass(typeprop, typeprops) + } + function typeprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property" + return cont(typeprop) + } else if (value == "?" || type == "number" || type == "string") { + return cont(typeprop) + } else if (type == ":") { + return cont(typeexpr) + } else if (type == "[") { + return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop) + } else if (type == "(") { + return pass(functiondecl, typeprop) + } else if (!type.match(/[;\}\)\],]/)) { + return cont() + } + } + function quasiType(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasiType); + return cont(typeexpr, continueQuasiType); + } + function continueQuasiType(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasiType); + } + } + function typearg(type, value) { + if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg) + if (type == ":") return cont(typeexpr) + if (type == "spread") return cont(typearg) + return pass(typeexpr) + } + function afterType(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + if (value == "|" || type == "." || value == "&") return cont(typeexpr) + if (type == "[") return cont(typeexpr, expect("]"), afterType) + if (value == "extends" || value == "implements") { cx.marked = "keyword"; return cont(typeexpr) } + if (value == "?") return cont(typeexpr, expect(":"), typeexpr) + } + function maybeTypeArgs(_, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + } + function typeparam() { + return pass(typeexpr, maybeTypeDefault) + } + function maybeTypeDefault(_, value) { + if (value == "=") return cont(typeexpr) + } + function vardef(_, value) { + if (value == "enum") {cx.marked = "keyword"; return cont(enumdef)} + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type, value) { + if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(pattern) } + if (type == "variable") { register(value); return cont(); } + if (type == "spread") return cont(pattern); + if (type == "[") return contCommasep(eltpattern, "]"); + if (type == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type == "variable") cx.marked = "property"; + if (type == "spread") return cont(pattern); + if (type == "}") return pass(); + if (type == "[") return cont(expression, expect(']'), expect(':'), proppattern); + return cont(expect(":"), pattern, maybeAssign); + } + function eltpattern() { + return pass(pattern, maybeAssign) + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type) { + if (type == ",") return cont(vardef); + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type, value) { + if (value == "await") return cont(forspec); + if (type == "(") return cont(pushlex(")"), forspec1, poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, forspec2); + if (type == "variable") return cont(forspec2); + return pass(forspec2) + } + function forspec2(type, value) { + if (type == ")") return cont() + if (type == ";") return cont(forspec2) + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression, forspec2) } + return pass(expression, forspec2) + } + function functiondef(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef) + } + function functiondecl(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondecl);} + if (type == "variable") {register(value); return cont(functiondecl);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl) + } + function typename(type, value) { + if (type == "keyword" || type == "variable") { + cx.marked = "type" + return cont(typename) + } else if (value == "<") { + return cont(pushlex(">"), commasep(typeparam, ">"), poplex) + } + } + function funarg(type, value) { + if (value == "@") cont(expression, funarg) + if (type == "spread") return cont(funarg); + if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(funarg); } + if (isTS && type == "this") return cont(maybetype, maybeAssign) + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type, value) { + // Class expressions may have an optional name. + if (type == "variable") return className(type, value); + return classNameAfter(type, value); + } + function className(type, value) { + if (type == "variable") {register(value); return cont(classNameAfter);} + } + function classNameAfter(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter) + if (value == "extends" || value == "implements" || (isTS && type == ",")) { + if (value == "implements") cx.marked = "keyword"; + return cont(isTS ? typeexpr : expression, classNameAfter); + } + if (type == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type, value) { + if (type == "async" || + (type == "variable" && + (value == "static" || value == "get" || value == "set" || (isTS && isModifier(value))) && + cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) { + cx.marked = "keyword"; + return cont(classBody); + } + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(classfield, classBody); + } + if (type == "number" || type == "string") return cont(classfield, classBody); + if (type == "[") + return cont(expression, maybetype, expect("]"), classfield, classBody) + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (isTS && type == "(") return pass(functiondecl, classBody) + if (type == ";" || type == ",") return cont(classBody); + if (type == "}") return cont(); + if (value == "@") return cont(expression, classBody) + } + function classfield(type, value) { + if (value == "!") return cont(classfield) + if (value == "?") return cont(classfield) + if (type == ":") return cont(typeexpr, maybeAssign) + if (value == "=") return cont(expressionNoComma) + var context = cx.state.lexical.prev, isInterface = context && context.info == "interface" + return pass(isInterface ? functiondecl : functiondef) + } + function afterExport(type, value) { + if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } + if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } + if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); } + if (type == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type) { + if (type == "string") return cont(); + if (type == "(") return pass(expression); + if (type == ".") return pass(maybeoperatorComma); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}"); + if (type == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type) { + if (type == ",") return cont(importSpec, maybeMoreImports) + } + function maybeAs(_type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } + } + function maybeFrom(_type, value) { + if (value == "from") { cx.marked = "keyword"; return cont(expression); } + } + function arrayLiteral(type) { + if (type == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + function enumdef() { + return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex) + } + function enummember() { + return pass(pattern, maybeAssign); + } + + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || + isOperatorChar.test(textAfter.charAt(0)) || + /[,.]/.test(textAfter.charAt(0)); + } + + function expressionAllowed(stream, state, backUp) { + return state.tokenize == tokenBase && + /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || + (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) + } + + // Interface + + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && new Context(null, null, false), + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev; + else if (c != maybeelse && c != popcontext) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && + (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) && + (top == maybeoperatorComma || top == maybeoperatorNoComma) && + !/^[,\.=+\-*:?[\(]/.test(textAfter)))) + lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); + else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + blockCommentContinue: jsonMode ? null : " * ", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode, + + expressionAllowed: expressionAllowed, + + skipExpression: function(state) { + parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)) + } + }; +}); + +CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + +CodeMirror.defineMIME("text/javascript", "javascript"); +CodeMirror.defineMIME("text/ecmascript", "javascript"); +CodeMirror.defineMIME("application/javascript", "javascript"); +CodeMirror.defineMIME("application/x-javascript", "javascript"); +CodeMirror.defineMIME("application/ecmascript", "javascript"); +CodeMirror.defineMIME("application/json", { name: "javascript", json: true }); +CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true }); +CodeMirror.defineMIME("application/manifest+json", { name: "javascript", json: true }) +CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true }); +CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); +CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jinja2/jinja2.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jinja2/jinja2.js new file mode 100644 index 0000000000..77c9b22cae --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jinja2/jinja2.js @@ -0,0 +1,146 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("jinja2", function() { + var keywords = ["and", "as", "block", "endblock", "by", "cycle", "debug", "else", "elif", + "extends", "filter", "endfilter", "firstof", "for", + "endfor", "if", "endif", "ifchanged", "endifchanged", + "ifequal", "endifequal", "ifnotequal", + "endifnotequal", "in", "include", "load", "not", "now", "or", + "parsed", "regroup", "reversed", "spaceless", + "endspaceless", "ssi", "templatetag", "openblock", + "closeblock", "openvariable", "closevariable", + "openbrace", "closebrace", "opencomment", + "closecomment", "widthratio", "url", "with", "endwith", + "get_current_language", "trans", "endtrans", "noop", "blocktrans", + "endblocktrans", "get_available_languages", + "get_current_language_bidi", "plural"], + operator = /^[+\-*&%=<>!?|~^]/, + sign = /^[:\[\(\{]/, + atom = ["true", "false"], + number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; + + keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); + atom = new RegExp("((" + atom.join(")|(") + "))\\b"); + + function tokenBase (stream, state) { + var ch = stream.peek(); + + //Comment + if (state.incomment) { + if(!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Tag + } else if (state.intag) { + //After operator + if(state.operator) { + state.operator = false; + if(stream.match(atom)) { + return "atom"; + } + if(stream.match(number)) { + return "number"; + } + } + //After sign + if(state.sign) { + state.sign = false; + if(stream.match(atom)) { + return "atom"; + } + if(stream.match(number)) { + return "number"; + } + } + + if(state.instring) { + if(ch == state.instring) { + state.instring = false; + } + stream.next(); + return "string"; + } else if(ch == "'" || ch == '"') { + state.instring = ch; + stream.next(); + return "string"; + } else if(stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { + state.intag = false; + return "tag"; + } else if(stream.match(operator)) { + state.operator = true; + return "operator"; + } else if(stream.match(sign)) { + state.sign = true; + } else { + if(stream.eat(" ") || stream.sol()) { + if(stream.match(keywords)) { + return "keyword"; + } + if(stream.match(atom)) { + return "atom"; + } + if(stream.match(number)) { + return "number"; + } + if(stream.sol()) { + stream.next(); + } + } else { + stream.next(); + } + + } + return "variable"; + } else if (stream.eat("{")) { + if (stream.eat("#")) { + state.incomment = true; + if(!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Open tag + } else if (ch = stream.eat(/\{|%/)) { + //Cache close tag + state.intag = ch; + if(ch == "{") { + state.intag = "}"; + } + stream.eat("-"); + return "tag"; + } + } + stream.next(); + }; + + return { + startState: function () { + return {tokenize: tokenBase}; + }, + token: function (stream, state) { + return state.tokenize(stream, state); + }, + blockCommentStart: "{#", + blockCommentEnd: "#}" + }; + }); + + CodeMirror.defineMIME("text/jinja2", "jinja2"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jsx/jsx.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jsx/jsx.js new file mode 100644 index 0000000000..beea3b9139 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/jsx/jsx.js @@ -0,0 +1,148 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript"], mod) + else // Plain browser env + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + + // Depth means the amount of open braces in JS context, in XML + // context 0 means not in tag, 1 means in tag, and 2 means in tag + // and js block comment. + function Context(state, mode, depth, prev) { + this.state = state; this.mode = mode; this.depth = depth; this.prev = prev + } + + function copyContext(context) { + return new Context(CodeMirror.copyState(context.mode, context.state), + context.mode, + context.depth, + context.prev && copyContext(context.prev)) + } + + CodeMirror.defineMode("jsx", function(config, modeConfig) { + var xmlMode = CodeMirror.getMode(config, {name: "xml", allowMissing: true, multilineTagIndentPastTag: false, allowMissingTagName: true}) + var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || "javascript") + + function flatXMLIndent(state) { + var tagName = state.tagName + state.tagName = null + var result = xmlMode.indent(state, "", "") + state.tagName = tagName + return result + } + + function token(stream, state) { + if (state.context.mode == xmlMode) + return xmlToken(stream, state, state.context) + else + return jsToken(stream, state, state.context) + } + + function xmlToken(stream, state, cx) { + if (cx.depth == 2) { // Inside a JS /* */ comment + if (stream.match(/^.*?\*\//)) cx.depth = 1 + else stream.skipToEnd() + return "comment" + } + + if (stream.peek() == "{") { + xmlMode.skipAttribute(cx.state) + + var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context + // If JS starts on same line as tag + if (xmlContext && stream.match(/^[^>]*>\s*$/, false)) { + while (xmlContext.prev && !xmlContext.startOfLine) + xmlContext = xmlContext.prev + // If tag starts the line, use XML indentation level + if (xmlContext.startOfLine) indent -= config.indentUnit + // Else use JS indentation level + else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented + // Else if inside of tag + } else if (cx.depth == 1) { + indent += config.indentUnit + } + + state.context = new Context(CodeMirror.startState(jsMode, indent), + jsMode, 0, state.context) + return null + } + + if (cx.depth == 1) { // Inside of tag + if (stream.peek() == "<") { // Tag inside of tag + xmlMode.skipAttribute(cx.state) + state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)), + xmlMode, 0, state.context) + return null + } else if (stream.match("//")) { + stream.skipToEnd() + return "comment" + } else if (stream.match("/*")) { + cx.depth = 2 + return token(stream, state) + } + } + + var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop + if (/\btag\b/.test(style)) { + if (/>$/.test(cur)) { + if (cx.state.context) cx.depth = 0 + else state.context = state.context.prev + } else if (/^ -1) { + stream.backUp(cur.length - stop) + } + return style + } + + function jsToken(stream, state, cx) { + if (stream.peek() == "<" && jsMode.expressionAllowed(stream, cx.state)) { + state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, "", "")), + xmlMode, 0, state.context) + jsMode.skipExpression(cx.state) + return null + } + + var style = jsMode.token(stream, cx.state) + if (!style && cx.depth != null) { + var cur = stream.current() + if (cur == "{") { + cx.depth++ + } else if (cur == "}") { + if (--cx.depth == 0) state.context = state.context.prev + } + } + return style + } + + return { + startState: function() { + return {context: new Context(CodeMirror.startState(jsMode), jsMode)} + }, + + copyState: function(state) { + return {context: copyContext(state.context)} + }, + + token: token, + + indent: function(state, textAfter, fullLine) { + return state.context.mode.indent(state.context.state, textAfter, fullLine) + }, + + innerMode: function(state) { + return state.context + } + } + }, "xml", "javascript") + + CodeMirror.defineMIME("text/jsx", "jsx") + CodeMirror.defineMIME("text/typescript-jsx", {name: "jsx", base: {name: "javascript", typescript: true}}) +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/julia/julia.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/julia/julia.js new file mode 100644 index 0000000000..cb0d69c8e2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/julia/julia.js @@ -0,0 +1,390 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("julia", function(config, parserConf) { + function wordRegexp(words, end, pre) { + if (typeof pre === "undefined") { pre = ""; } + if (typeof end === "undefined") { end = "\\b"; } + return new RegExp("^" + pre + "((" + words.join(")|(") + "))" + end); + } + + var octChar = "\\\\[0-7]{1,3}"; + var hexChar = "\\\\x[A-Fa-f0-9]{1,2}"; + var sChar = "\\\\[abefnrtv0%?'\"\\\\]"; + var uChar = "([^\\u0027\\u005C\\uD800-\\uDFFF]|[\\uD800-\\uDFFF][\\uDC00-\\uDFFF])"; + + var asciiOperatorsList = [ + "[<>]:", "[<>=]=", "<<=?", ">>>?=?", "=>", "--?>", "<--[->]?", "\\/\\/", + "\\.{2,3}", "[\\.\\\\%*+\\-<>!\\/^|&]=?", "\\?", "\\$", "~", ":" + ]; + var operators = parserConf.operators || wordRegexp([ + "[<>]:", "[<>=]=", "<<=?", ">>>?=?", "=>", "--?>", "<--[->]?", "\\/\\/", + "[\\\\%*+\\-<>!\\/^|&\\u00F7\\u22BB]=?", "\\?", "\\$", "~", ":", + "\\u00D7", "\\u2208", "\\u2209", "\\u220B", "\\u220C", "\\u2218", + "\\u221A", "\\u221B", "\\u2229", "\\u222A", "\\u2260", "\\u2264", + "\\u2265", "\\u2286", "\\u2288", "\\u228A", "\\u22C5", + "\\b(in|isa)\\b(?!\.?\\()" + ], ""); + var delimiters = parserConf.delimiters || /^[;,()[\]{}]/; + var identifiers = parserConf.identifiers || + /^[_A-Za-z\u00A1-\u2217\u2219-\uFFFF][\w\u00A1-\u2217\u2219-\uFFFF]*!*/; + + var chars = wordRegexp([octChar, hexChar, sChar, uChar], "'"); + + var openersList = ["begin", "function", "type", "struct", "immutable", "let", + "macro", "for", "while", "quote", "if", "else", "elseif", "try", + "finally", "catch", "do"]; + + var closersList = ["end", "else", "elseif", "catch", "finally"]; + + var keywordsList = ["if", "else", "elseif", "while", "for", "begin", "let", + "end", "do", "try", "catch", "finally", "return", "break", "continue", + "global", "local", "const", "export", "import", "importall", "using", + "function", "where", "macro", "module", "baremodule", "struct", "type", + "mutable", "immutable", "quote", "typealias", "abstract", "primitive", + "bitstype"]; + + var builtinsList = ["true", "false", "nothing", "NaN", "Inf"]; + + CodeMirror.registerHelper("hintWords", "julia", keywordsList.concat(builtinsList)); + + var openers = wordRegexp(openersList); + var closers = wordRegexp(closersList); + var keywords = wordRegexp(keywordsList); + var builtins = wordRegexp(builtinsList); + + var macro = /^@[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; + var symbol = /^:[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; + var stringPrefixes = /^(`|([_A-Za-z\u00A1-\uFFFF]*"("")?))/; + + var macroOperators = wordRegexp(asciiOperatorsList, "", "@"); + var symbolOperators = wordRegexp(asciiOperatorsList, "", ":"); + + function inArray(state) { + return (state.nestedArrays > 0); + } + + function inGenerator(state) { + return (state.nestedGenerators > 0); + } + + function currentScope(state, n) { + if (typeof(n) === "undefined") { n = 0; } + if (state.scopes.length <= n) { + return null; + } + return state.scopes[state.scopes.length - (n + 1)]; + } + + // tokenizers + function tokenBase(stream, state) { + // Handle multiline comments + if (stream.match('#=', false)) { + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + + // Handle scope changes + var leavingExpr = state.leavingExpr; + if (stream.sol()) { + leavingExpr = false; + } + state.leavingExpr = false; + + if (leavingExpr) { + if (stream.match(/^'+/)) { + return "operator"; + } + } + + if (stream.match(/\.{4,}/)) { + return "error"; + } else if (stream.match(/\.{1,3}/)) { + return "operator"; + } + + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle single line comments + if (ch === '#') { + stream.skipToEnd(); + return "comment"; + } + + if (ch === '[') { + state.scopes.push('['); + state.nestedArrays++; + } + + if (ch === '(') { + state.scopes.push('('); + state.nestedGenerators++; + } + + if (inArray(state) && ch === ']') { + while (state.scopes.length && currentScope(state) !== "[") { state.scopes.pop(); } + state.scopes.pop(); + state.nestedArrays--; + state.leavingExpr = true; + } + + if (inGenerator(state) && ch === ')') { + while (state.scopes.length && currentScope(state) !== "(") { state.scopes.pop(); } + state.scopes.pop(); + state.nestedGenerators--; + state.leavingExpr = true; + } + + if (inArray(state)) { + if (state.lastToken == "end" && stream.match(':')) { + return "operator"; + } + if (stream.match('end')) { + return "number"; + } + } + + var match; + if (match = stream.match(openers, false)) { + state.scopes.push(match[0]); + } + + if (stream.match(closers, false)) { + state.scopes.pop(); + } + + // Handle type annotations + if (stream.match(/^::(?![:\$])/)) { + state.tokenize = tokenAnnotation; + return state.tokenize(stream, state); + } + + // Handle symbols + if (!leavingExpr && (stream.match(symbol) || stream.match(symbolOperators))) { + return "builtin"; + } + + // Handle parametric types + //if (stream.match(/^{[^}]*}(?=\()/)) { + // return "builtin"; + //} + + // Handle operators and Delimiters + if (stream.match(operators)) { + return "operator"; + } + + // Handle Number Literals + if (stream.match(/^\.?\d/, false)) { + var imMatcher = RegExp(/^im\b/); + var numberLiteral = false; + if (stream.match(/^0x\.[0-9a-f_]+p[\+\-]?[_\d]+/i)) { numberLiteral = true; } + // Integers + if (stream.match(/^0x[0-9a-f_]+/i)) { numberLiteral = true; } // Hex + if (stream.match(/^0b[01_]+/i)) { numberLiteral = true; } // Binary + if (stream.match(/^0o[0-7_]+/i)) { numberLiteral = true; } // Octal + // Floats + if (stream.match(/^(?:(?:\d[_\d]*)?\.(?!\.)(?:\d[_\d]*)?|\d[_\d]*\.(?!\.)(?:\d[_\d]*))?([Eef][\+\-]?[_\d]+)?/i)) { numberLiteral = true; } + if (stream.match(/^\d[_\d]*(e[\+\-]?\d+)?/i)) { numberLiteral = true; } // Decimal + if (numberLiteral) { + // Integer literals may be "long" + stream.match(imMatcher); + state.leavingExpr = true; + return "number"; + } + } + + // Handle Chars + if (stream.match('\'')) { + state.tokenize = tokenChar; + return state.tokenize(stream, state); + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + if (stream.match(macro) || stream.match(macroOperators)) { + return "meta"; + } + + if (stream.match(delimiters)) { + return null; + } + + if (stream.match(keywords)) { + return "keyword"; + } + + if (stream.match(builtins)) { + return "builtin"; + } + + var isDefinition = state.isDefinition || state.lastToken == "function" || + state.lastToken == "macro" || state.lastToken == "type" || + state.lastToken == "struct" || state.lastToken == "immutable"; + + if (stream.match(identifiers)) { + if (isDefinition) { + if (stream.peek() === '.') { + state.isDefinition = true; + return "variable"; + } + state.isDefinition = false; + return "def"; + } + state.leavingExpr = true; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return "error"; + } + + function tokenAnnotation(stream, state) { + stream.match(/.*?(?=[,;{}()=\s]|$)/); + if (stream.match('{')) { + state.nestedParameters++; + } else if (stream.match('}') && state.nestedParameters > 0) { + state.nestedParameters--; + } + if (state.nestedParameters > 0) { + stream.match(/.*?(?={|})/) || stream.next(); + } else if (state.nestedParameters == 0) { + state.tokenize = tokenBase; + } + return "builtin"; + } + + function tokenComment(stream, state) { + if (stream.match('#=')) { + state.nestedComments++; + } + if (!stream.match(/.*?(?=(#=|=#))/)) { + stream.skipToEnd(); + } + if (stream.match('=#')) { + state.nestedComments--; + if (state.nestedComments == 0) + state.tokenize = tokenBase; + } + return "comment"; + } + + function tokenChar(stream, state) { + var isChar = false, match; + if (stream.match(chars)) { + isChar = true; + } else if (match = stream.match(/\\u([a-f0-9]{1,4})(?=')/i)) { + var value = parseInt(match[1], 16); + if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF) + isChar = true; + stream.next(); + } + } else if (match = stream.match(/\\U([A-Fa-f0-9]{5,8})(?=')/)) { + var value = parseInt(match[1], 16); + if (value <= 1114111) { // U+10FFFF + isChar = true; + stream.next(); + } + } + if (isChar) { + state.leavingExpr = true; + state.tokenize = tokenBase; + return "string"; + } + if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); } + if (stream.match('\'')) { state.tokenize = tokenBase; } + return "error"; + } + + function tokenStringFactory(delimiter) { + if (delimiter.substr(-3) === '"""') { + delimiter = '"""'; + } else if (delimiter.substr(-1) === '"') { + delimiter = '"'; + } + function tokenString(stream, state) { + if (stream.eat('\\')) { + stream.next(); + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + state.leavingExpr = true; + return "string"; + } else { + stream.eat(/[`"]/); + } + stream.eatWhile(/[^\\`"]/); + return "string"; + } + return tokenString; + } + + var external = { + startState: function() { + return { + tokenize: tokenBase, + scopes: [], + lastToken: null, + leavingExpr: false, + isDefinition: false, + nestedArrays: 0, + nestedComments: 0, + nestedGenerators: 0, + nestedParameters: 0, + firstParenPos: -1 + }; + }, + + token: function(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + if (current && style) { + state.lastToken = current; + } + + return style; + }, + + indent: function(state, textAfter) { + var delta = 0; + if ( textAfter === ']' || textAfter === ')' || /^end\b/.test(textAfter) || + /^else/.test(textAfter) || /^catch\b/.test(textAfter) || /^elseif\b/.test(textAfter) || + /^finally/.test(textAfter) ) { + delta = -1; + } + return (state.scopes.length + delta) * config.indentUnit; + }, + + electricInput: /\b(end|else|catch|finally)\b/, + blockCommentStart: "#=", + blockCommentEnd: "=#", + lineComment: "#", + closeBrackets: "()[]{}\"\"", + fold: "indent" + }; + return external; +}); + + +CodeMirror.defineMIME("text/x-julia", "julia"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/livescript/livescript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/livescript/livescript.js new file mode 100644 index 0000000000..595e067d16 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/livescript/livescript.js @@ -0,0 +1,280 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Link to the project's GitHub page: + * https://github.com/duralog/CodeMirror + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode('livescript', function(){ + var tokenBase = function(stream, state) { + var next_rule = state.next || "start"; + if (next_rule) { + state.next = state.next; + var nr = Rules[next_rule]; + if (nr.splice) { + for (var i$ = 0; i$ < nr.length; ++i$) { + var r = nr[i$]; + if (r.regex && stream.match(r.regex)) { + state.next = r.next || state.next; + return r.token; + } + } + stream.next(); + return 'error'; + } + if (stream.match(r = Rules[next_rule])) { + if (r.regex && stream.match(r.regex)) { + state.next = r.next; + return r.token; + } else { + stream.next(); + return 'error'; + } + } + } + stream.next(); + return 'error'; + }; + var external = { + startState: function(){ + return { + next: 'start', + lastToken: {style: null, indent: 0, content: ""} + }; + }, + token: function(stream, state){ + while (stream.pos == stream.start) + var style = tokenBase(stream, state); + state.lastToken = { + style: style, + indent: stream.indentation(), + content: stream.current() + }; + return style.replace(/\./g, ' '); + }, + indent: function(state){ + var indentation = state.lastToken.indent; + if (state.lastToken.content.match(indenter)) { + indentation += 2; + } + return indentation; + } + }; + return external; + }); + + var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; + var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); + var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; + var stringfill = { + token: 'string', + regex: '.+' + }; + var Rules = { + start: [ + { + token: 'comment.doc', + regex: '/\\*', + next: 'comment' + }, { + token: 'comment', + regex: '#.*' + }, { + token: 'keyword', + regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend + }, { + token: 'constant.language', + regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend + }, { + token: 'invalid.illegal', + regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend + }, { + token: 'language.support.class', + regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend + }, { + token: 'language.support.function', + regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend + }, { + token: 'variable.language', + regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend + }, { + token: 'identifier', + regex: identifier + '\\s*:(?![:=])' + }, { + token: 'variable', + regex: identifier + }, { + token: 'keyword.operator', + regex: '(?:\\.{3}|\\s+\\?)' + }, { + token: 'keyword.variable', + regex: '(?:@+|::|\\.\\.)', + next: 'key' + }, { + token: 'keyword.operator', + regex: '\\.\\s*', + next: 'key' + }, { + token: 'string', + regex: '\\\\\\S[^\\s,;)}\\]]*' + }, { + token: 'string.doc', + regex: '\'\'\'', + next: 'qdoc' + }, { + token: 'string.doc', + regex: '"""', + next: 'qqdoc' + }, { + token: 'string', + regex: '\'', + next: 'qstring' + }, { + token: 'string', + regex: '"', + next: 'qqstring' + }, { + token: 'string', + regex: '`', + next: 'js' + }, { + token: 'string', + regex: '<\\[', + next: 'words' + }, { + token: 'string.regex', + regex: '//', + next: 'heregex' + }, { + token: 'string.regex', + regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', + next: 'key' + }, { + token: 'constant.numeric', + regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' + }, { + token: 'lparen', + regex: '[({[]' + }, { + token: 'rparen', + regex: '[)}\\]]', + next: 'key' + }, { + token: 'keyword.operator', + regex: '\\S+' + }, { + token: 'text', + regex: '\\s+' + } + ], + heregex: [ + { + token: 'string.regex', + regex: '.*?//[gimy$?]{0,4}', + next: 'start' + }, { + token: 'string.regex', + regex: '\\s*#{' + }, { + token: 'comment.regex', + regex: '\\s+(?:#.*)?' + }, { + token: 'string.regex', + regex: '\\S+' + } + ], + key: [ + { + token: 'keyword.operator', + regex: '[.?@!]+' + }, { + token: 'identifier', + regex: identifier, + next: 'start' + }, { + token: 'text', + regex: '', + next: 'start' + } + ], + comment: [ + { + token: 'comment.doc', + regex: '.*?\\*/', + next: 'start' + }, { + token: 'comment.doc', + regex: '.+' + } + ], + qdoc: [ + { + token: 'string', + regex: ".*?'''", + next: 'key' + }, stringfill + ], + qqdoc: [ + { + token: 'string', + regex: '.*?"""', + next: 'key' + }, stringfill + ], + qstring: [ + { + token: 'string', + regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', + next: 'key' + }, stringfill + ], + qqstring: [ + { + token: 'string', + regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', + next: 'key' + }, stringfill + ], + js: [ + { + token: 'string', + regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', + next: 'key' + }, stringfill + ], + words: [ + { + token: 'string', + regex: '.*?\\]>', + next: 'key' + }, stringfill + ] + }; + for (var idx in Rules) { + var r = Rules[idx]; + if (r.splice) { + for (var i = 0, len = r.length; i < len; ++i) { + var rr = r[i]; + if (typeof rr.regex === 'string') { + Rules[idx][i].regex = new RegExp('^' + rr.regex); + } + } + } else if (typeof rr.regex === 'string') { + Rules[idx].regex = new RegExp('^' + r.regex); + } + } + + CodeMirror.defineMIME('text/x-livescript', 'livescript'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/lua/lua.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/lua/lua.js new file mode 100644 index 0000000000..2fad0180ff --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/lua/lua.js @@ -0,0 +1,160 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's +// CodeMirror 1 mode. +// highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("lua", function(config, parserConfig) { + var indentUnit = config.indentUnit; + + function prefixRE(words) { + return new RegExp("^(?:" + words.join("|") + ")", "i"); + } + function wordRE(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var specials = wordRE(parserConfig.specials || []); + + // long list of standard functions from lua manual + var builtins = wordRE([ + "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load", + "loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require", + "select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall", + + "coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield", + + "debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable", + "debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable", + "debug.setupvalue","debug.traceback", + + "close","flush","lines","read","seek","setvbuf","write", + + "io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin", + "io.stdout","io.tmpfile","io.type","io.write", + + "math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg", + "math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max", + "math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh", + "math.sqrt","math.tan","math.tanh", + + "os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale", + "os.time","os.tmpname", + + "package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload", + "package.seeall", + + "string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub", + "string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper", + + "table.concat","table.insert","table.maxn","table.remove","table.sort" + ]); + var keywords = wordRE(["and","break","elseif","false","nil","not","or","return", + "true","function", "end", "if", "then", "else", "do", + "while", "repeat", "until", "for", "in", "local" ]); + + var indentTokens = wordRE(["function", "if","repeat","do", "\\(", "{"]); + var dedentTokens = wordRE(["end", "until", "\\)", "}"]); + var dedentPartial = prefixRE(["end", "until", "\\)", "}", "else", "elseif"]); + + function readBracket(stream) { + var level = 0; + while (stream.eat("=")) ++level; + stream.eat("["); + return level; + } + + function normal(stream, state) { + var ch = stream.next(); + if (ch == "-" && stream.eat("-")) { + if (stream.eat("[") && stream.eat("[")) + return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state); + stream.skipToEnd(); + return "comment"; + } + if (ch == "\"" || ch == "'") + return (state.cur = string(ch))(stream, state); + if (ch == "[" && /[\[=]/.test(stream.peek())) + return (state.cur = bracketed(readBracket(stream), "string"))(stream, state); + if (/\d/.test(ch)) { + stream.eatWhile(/[\w.%]/); + return "number"; + } + if (/[\w_]/.test(ch)) { + stream.eatWhile(/[\w\\\-_.]/); + return "variable"; + } + return null; + } + + function bracketed(level, style) { + return function(stream, state) { + var curlev = null, ch; + while ((ch = stream.next()) != null) { + if (curlev == null) {if (ch == "]") curlev = 0;} + else if (ch == "=") ++curlev; + else if (ch == "]" && curlev == level) { state.cur = normal; break; } + else curlev = null; + } + return style; + }; + } + + function string(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.cur = normal; + return "string"; + }; + } + + return { + startState: function(basecol) { + return {basecol: basecol || 0, indentDepth: 0, cur: normal}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.cur(stream, state); + var word = stream.current(); + if (style == "variable") { + if (keywords.test(word)) style = "keyword"; + else if (builtins.test(word)) style = "builtin"; + else if (specials.test(word)) style = "variable-2"; + } + if ((style != "comment") && (style != "string")){ + if (indentTokens.test(word)) ++state.indentDepth; + else if (dedentTokens.test(word)) --state.indentDepth; + } + return style; + }, + + indent: function(state, textAfter) { + var closing = dedentPartial.test(textAfter); + return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0)); + }, + + electricInput: /^\s*(?:end|until|else|\)|\})$/, + lineComment: "--", + blockCommentStart: "--[[", + blockCommentEnd: "]]" + }; +}); + +CodeMirror.defineMIME("text/x-lua", "lua"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/markdown/markdown.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/markdown/markdown.js new file mode 100644 index 0000000000..a9e272ea81 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/markdown/markdown.js @@ -0,0 +1,886 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../xml/xml", "../meta"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { + + var htmlMode = CodeMirror.getMode(cmCfg, "text/html"); + var htmlModeMissing = htmlMode.name == "null" + + function getMode(name) { + if (CodeMirror.findModeByName) { + var found = CodeMirror.findModeByName(name); + if (found) name = found.mime || found.mimes[0]; + } + var mode = CodeMirror.getMode(cmCfg, name); + return mode.name == "null" ? null : mode; + } + + // Should characters that affect highlighting be highlighted separate? + // Does not include characters that will be output (such as `1.` and `-` for lists) + if (modeCfg.highlightFormatting === undefined) + modeCfg.highlightFormatting = false; + + // Maximum number of nested blockquotes. Set to 0 for infinite nesting. + // Excess `>` will emit `error` token. + if (modeCfg.maxBlockquoteDepth === undefined) + modeCfg.maxBlockquoteDepth = 0; + + // Turn on task lists? ("- [ ] " and "- [x] ") + if (modeCfg.taskLists === undefined) modeCfg.taskLists = false; + + // Turn on strikethrough syntax + if (modeCfg.strikethrough === undefined) + modeCfg.strikethrough = false; + + if (modeCfg.emoji === undefined) + modeCfg.emoji = false; + + if (modeCfg.fencedCodeBlockHighlighting === undefined) + modeCfg.fencedCodeBlockHighlighting = true; + + if (modeCfg.fencedCodeBlockDefaultMode === undefined) + modeCfg.fencedCodeBlockDefaultMode = 'text/plain'; + + if (modeCfg.xml === undefined) + modeCfg.xml = true; + + // Allow token types to be overridden by user-provided token types. + if (modeCfg.tokenTypeOverrides === undefined) + modeCfg.tokenTypeOverrides = {}; + + var tokenTypes = { + header: "header", + code: "comment", + quote: "quote", + list1: "variable-2", + list2: "variable-3", + list3: "keyword", + hr: "hr", + image: "image", + imageAltText: "image-alt-text", + imageMarker: "image-marker", + formatting: "formatting", + linkInline: "link", + linkEmail: "link", + linkText: "link", + linkHref: "string", + em: "em", + strong: "strong", + strikethrough: "strikethrough", + emoji: "builtin" + }; + + for (var tokenType in tokenTypes) { + if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) { + tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType]; + } + } + + var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/ + , listRE = /^(?:[*\-+]|^[0-9]+([.)]))\s+/ + , taskListRE = /^\[(x| )\](?=\s)/i // Must follow listRE + , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/ + , setextHeaderRE = /^ {0,3}(?:\={1,}|-{2,})\s*$/ + , textRE = /^[^#!\[\]*_\\<>` "'(~:]+/ + , fencedCodeRE = /^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/ + , linkDefRE = /^\s*\[[^\]]+?\]:.*$/ // naive link-definition + , punctuation = /[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/ + , expandedTab = " " // CommonMark specifies tab as 4 spaces + + function switchInline(stream, state, f) { + state.f = state.inline = f; + return f(stream, state); + } + + function switchBlock(stream, state, f) { + state.f = state.block = f; + return f(stream, state); + } + + function lineIsEmpty(line) { + return !line || !/\S/.test(line.string) + } + + // Blocks + + function blankLine(state) { + // Reset linkTitle state + state.linkTitle = false; + state.linkHref = false; + state.linkText = false; + // Reset EM state + state.em = false; + // Reset STRONG state + state.strong = false; + // Reset strikethrough state + state.strikethrough = false; + // Reset state.quote + state.quote = 0; + // Reset state.indentedCode + state.indentedCode = false; + if (state.f == htmlBlock) { + var exit = htmlModeMissing + if (!exit) { + var inner = CodeMirror.innerMode(htmlMode, state.htmlState) + exit = inner.mode.name == "xml" && inner.state.tagStart === null && + (!inner.state.context && inner.state.tokenize.isInText) + } + if (exit) { + state.f = inlineNormal; + state.block = blockNormal; + state.htmlState = null; + } + } + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + // Mark this line as blank + state.prevLine = state.thisLine + state.thisLine = {stream: null} + return null; + } + + function blockNormal(stream, state) { + var firstTokenOnLine = stream.column() === state.indentation; + var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream); + var prevLineIsIndentedCode = state.indentedCode; + var prevLineIsHr = state.prevLine.hr; + var prevLineIsList = state.list !== false; + var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3; + + state.indentedCode = false; + + var lineIndentation = state.indentation; + // compute once per line (on first token) + if (state.indentationDiff === null) { + state.indentationDiff = state.indentation; + if (prevLineIsList) { + state.list = null; + // While this list item's marker's indentation is less than the deepest + // list item's content's indentation,pop the deepest list item + // indentation off the stack, and update block indentation state + while (lineIndentation < state.listStack[state.listStack.length - 1]) { + state.listStack.pop(); + if (state.listStack.length) { + state.indentation = state.listStack[state.listStack.length - 1]; + // less than the first list's indent -> the line is no longer a list + } else { + state.list = false; + } + } + if (state.list !== false) { + state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1] + } + } + } + + // not comprehensive (currently only for setext detection purposes) + var allowsInlineContinuation = ( + !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header && + (!prevLineIsList || !prevLineIsIndentedCode) && + !state.prevLine.fencedCodeEnd + ); + + var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) && + state.indentation <= maxNonCodeIndentation && stream.match(hrRE); + + var match = null; + if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd || + state.prevLine.header || prevLineLineIsEmpty)) { + stream.skipToEnd(); + state.indentedCode = true; + return tokenTypes.code; + } else if (stream.eatSpace()) { + return null; + } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) { + state.quote = 0; + state.header = match[1].length; + state.thisLine.header = true; + if (modeCfg.highlightFormatting) state.formatting = "header"; + state.f = state.inline; + return getType(state); + } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) { + state.quote = firstTokenOnLine ? 1 : state.quote + 1; + if (modeCfg.highlightFormatting) state.formatting = "quote"; + stream.eatSpace(); + return getType(state); + } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) { + var listType = match[1] ? "ol" : "ul"; + + state.indentation = lineIndentation + stream.current().length; + state.list = true; + state.quote = 0; + + // Add this list item's content's indentation to the stack + state.listStack.push(state.indentation); + // Reset inline styles which shouldn't propagate across list items + state.em = false; + state.strong = false; + state.code = false; + state.strikethrough = false; + + if (modeCfg.taskLists && stream.match(taskListRE, false)) { + state.taskList = true; + } + state.f = state.inline; + if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; + return getType(state); + } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) { + state.quote = 0; + state.fencedEndRE = new RegExp(match[1] + "+ *$"); + // try switching mode + state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode ); + if (state.localMode) state.localState = CodeMirror.startState(state.localMode); + state.f = state.block = local; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = -1 + return getType(state); + // SETEXT has lowest block-scope precedence after HR, so check it after + // the others (code, blockquote, list...) + } else if ( + // if setext set, indicates line after ---/=== + state.setext || ( + // line before ---/=== + (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false && + !state.code && !isHr && !linkDefRE.test(stream.string) && + (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE)) + ) + ) { + if ( !state.setext ) { + state.header = match[0].charAt(0) == '=' ? 1 : 2; + state.setext = state.header; + } else { + state.header = state.setext; + // has no effect on type so we can reset it now + state.setext = 0; + stream.skipToEnd(); + if (modeCfg.highlightFormatting) state.formatting = "header"; + } + state.thisLine.header = true; + state.f = state.inline; + return getType(state); + } else if (isHr) { + stream.skipToEnd(); + state.hr = true; + state.thisLine.hr = true; + return tokenTypes.hr; + } else if (stream.peek() === '[') { + return switchInline(stream, state, footnoteLink); + } + + return switchInline(stream, state, state.inline); + } + + function htmlBlock(stream, state) { + var style = htmlMode.token(stream, state.htmlState); + if (!htmlModeMissing) { + var inner = CodeMirror.innerMode(htmlMode, state.htmlState) + if ((inner.mode.name == "xml" && inner.state.tagStart === null && + (!inner.state.context && inner.state.tokenize.isInText)) || + (state.md_inside && stream.current().indexOf(">") > -1)) { + state.f = inlineNormal; + state.block = blockNormal; + state.htmlState = null; + } + } + return style; + } + + function local(stream, state) { + var currListInd = state.listStack[state.listStack.length - 1] || 0; + var hasExitedList = state.indentation < currListInd; + var maxFencedEndInd = currListInd + 3; + if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) { + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + var returnType; + if (!hasExitedList) returnType = getType(state) + state.localMode = state.localState = null; + state.block = blockNormal; + state.f = inlineNormal; + state.fencedEndRE = null; + state.code = 0 + state.thisLine.fencedCodeEnd = true; + if (hasExitedList) return switchBlock(stream, state, state.block); + return returnType; + } else if (state.localMode) { + return state.localMode.token(stream, state.localState); + } else { + stream.skipToEnd(); + return tokenTypes.code; + } + } + + // Inline + function getType(state) { + var styles = []; + + if (state.formatting) { + styles.push(tokenTypes.formatting); + + if (typeof state.formatting === "string") state.formatting = [state.formatting]; + + for (var i = 0; i < state.formatting.length; i++) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i]); + + if (state.formatting[i] === "header") { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.header); + } + + // Add `formatting-quote` and `formatting-quote-#` for blockquotes + // Add `error` instead if the maximum blockquote nesting depth is passed + if (state.formatting[i] === "quote") { + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.quote); + } else { + styles.push("error"); + } + } + } + } + + if (state.taskOpen) { + styles.push("meta"); + return styles.length ? styles.join(' ') : null; + } + if (state.taskClosed) { + styles.push("property"); + return styles.length ? styles.join(' ') : null; + } + + if (state.linkHref) { + styles.push(tokenTypes.linkHref, "url"); + } else { // Only apply inline styles to non-url text + if (state.strong) { styles.push(tokenTypes.strong); } + if (state.em) { styles.push(tokenTypes.em); } + if (state.strikethrough) { styles.push(tokenTypes.strikethrough); } + if (state.emoji) { styles.push(tokenTypes.emoji); } + if (state.linkText) { styles.push(tokenTypes.linkText); } + if (state.code) { styles.push(tokenTypes.code); } + if (state.image) { styles.push(tokenTypes.image); } + if (state.imageAltText) { styles.push(tokenTypes.imageAltText, "link"); } + if (state.imageMarker) { styles.push(tokenTypes.imageMarker); } + } + + if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); } + + if (state.quote) { + styles.push(tokenTypes.quote); + + // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.quote + "-" + state.quote); + } else { + styles.push(tokenTypes.quote + "-" + modeCfg.maxBlockquoteDepth); + } + } + + if (state.list !== false) { + var listMod = (state.listStack.length - 1) % 3; + if (!listMod) { + styles.push(tokenTypes.list1); + } else if (listMod === 1) { + styles.push(tokenTypes.list2); + } else { + styles.push(tokenTypes.list3); + } + } + + if (state.trailingSpaceNewLine) { + styles.push("trailing-space-new-line"); + } else if (state.trailingSpace) { + styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); + } + + return styles.length ? styles.join(' ') : null; + } + + function handleText(stream, state) { + if (stream.match(textRE, true)) { + return getType(state); + } + return undefined; + } + + function inlineNormal(stream, state) { + var style = state.text(stream, state); + if (typeof style !== 'undefined') + return style; + + if (state.list) { // List marker (*, +, -, 1., etc) + state.list = null; + return getType(state); + } + + if (state.taskList) { + var taskOpen = stream.match(taskListRE, true)[1] === " "; + if (taskOpen) state.taskOpen = true; + else state.taskClosed = true; + if (modeCfg.highlightFormatting) state.formatting = "task"; + state.taskList = false; + return getType(state); + } + + state.taskOpen = false; + state.taskClosed = false; + + if (state.header && stream.match(/^#+$/, true)) { + if (modeCfg.highlightFormatting) state.formatting = "header"; + return getType(state); + } + + var ch = stream.next(); + + // Matches link titles present on next line + if (state.linkTitle) { + state.linkTitle = false; + var matchCh = ch; + if (ch === '(') { + matchCh = ')'; + } + matchCh = (matchCh+'').replace(/([.?*+^\[\]\\(){}|-])/g, "\\$1"); + var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; + if (stream.match(new RegExp(regex), true)) { + return tokenTypes.linkHref; + } + } + + // If this block is changed, it may need to be updated in GFM mode + if (ch === '`') { + var previousFormatting = state.formatting; + if (modeCfg.highlightFormatting) state.formatting = "code"; + stream.eatWhile('`'); + var count = stream.current().length + if (state.code == 0 && (!state.quote || count == 1)) { + state.code = count + return getType(state) + } else if (count == state.code) { // Must be exact + var t = getType(state) + state.code = 0 + return t + } else { + state.formatting = previousFormatting + return getType(state) + } + } else if (state.code) { + return getType(state); + } + + if (ch === '\\') { + stream.next(); + if (modeCfg.highlightFormatting) { + var type = getType(state); + var formattingEscape = tokenTypes.formatting + "-escape"; + return type ? type + " " + formattingEscape : formattingEscape; + } + } + + if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { + state.imageMarker = true; + state.image = true; + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + + if (ch === '[' && state.imageMarker && stream.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/, false)) { + state.imageMarker = false; + state.imageAltText = true + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + + if (ch === ']' && state.imageAltText) { + if (modeCfg.highlightFormatting) state.formatting = "image"; + var type = getType(state); + state.imageAltText = false; + state.image = false; + state.inline = state.f = linkHref; + return type; + } + + if (ch === '[' && !state.image) { + if (state.linkText && stream.match(/^.*?\]/)) return getType(state) + state.linkText = true; + if (modeCfg.highlightFormatting) state.formatting = "link"; + return getType(state); + } + + if (ch === ']' && state.linkText) { + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + state.linkText = false; + state.inline = state.f = stream.match(/\(.*?\)| ?\[.*?\]/, false) ? linkHref : inlineNormal + return type; + } + + if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + + if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkEmail; + } + + if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i, false)) { + var end = stream.string.indexOf(">", stream.pos); + if (end != -1) { + var atts = stream.string.substring(stream.start, end); + if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true; + } + stream.backUp(1); + state.htmlState = CodeMirror.startState(htmlMode); + return switchBlock(stream, state, htmlBlock); + } + + if (modeCfg.xml && ch === '<' && stream.match(/^\/\w*?>/)) { + state.md_inside = false; + return "tag"; + } else if (ch === "*" || ch === "_") { + var len = 1, before = stream.pos == 1 ? " " : stream.string.charAt(stream.pos - 2) + while (len < 3 && stream.eat(ch)) len++ + var after = stream.peek() || " " + // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis + var leftFlanking = !/\s/.test(after) && (!punctuation.test(after) || /\s/.test(before) || punctuation.test(before)) + var rightFlanking = !/\s/.test(before) && (!punctuation.test(before) || /\s/.test(after) || punctuation.test(after)) + var setEm = null, setStrong = null + if (len % 2) { // Em + if (!state.em && leftFlanking && (ch === "*" || !rightFlanking || punctuation.test(before))) + setEm = true + else if (state.em == ch && rightFlanking && (ch === "*" || !leftFlanking || punctuation.test(after))) + setEm = false + } + if (len > 1) { // Strong + if (!state.strong && leftFlanking && (ch === "*" || !rightFlanking || punctuation.test(before))) + setStrong = true + else if (state.strong == ch && rightFlanking && (ch === "*" || !leftFlanking || punctuation.test(after))) + setStrong = false + } + if (setStrong != null || setEm != null) { + if (modeCfg.highlightFormatting) state.formatting = setEm == null ? "strong" : setStrong == null ? "em" : "strong em" + if (setEm === true) state.em = ch + if (setStrong === true) state.strong = ch + var t = getType(state) + if (setEm === false) state.em = false + if (setStrong === false) state.strong = false + return t + } + } else if (ch === ' ') { + if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(1); + } + } + } + + if (modeCfg.strikethrough) { + if (ch === '~' && stream.eatWhile(ch)) { + if (state.strikethrough) {// Remove strikethrough + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + var t = getType(state); + state.strikethrough = false; + return t; + } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough + state.strikethrough = true; + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + return getType(state); + } + } else if (ch === ' ') { + if (stream.match('~~', true)) { // Probably surrounded by space + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(2); + } + } + } + } + + if (modeCfg.emoji && ch === ":" && stream.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)) { + state.emoji = true; + if (modeCfg.highlightFormatting) state.formatting = "emoji"; + var retType = getType(state); + state.emoji = false; + return retType; + } + + if (ch === ' ') { + if (stream.match(/^ +$/, false)) { + state.trailingSpace++; + } else if (state.trailingSpace) { + state.trailingSpaceNewLine = true; + } + } + + return getType(state); + } + + function linkInline(stream, state) { + var ch = stream.next(); + + if (ch === ">") { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + + stream.match(/^[^>]+/, true); + + return tokenTypes.linkInline; + } + + function linkHref(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + var ch = stream.next(); + if (ch === '(' || ch === '[') { + state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]"); + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + state.linkHref = true; + return getType(state); + } + return 'error'; + } + + var linkRE = { + ")": /^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/, + "]": /^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/ + } + + function getLinkHrefInside(endChar) { + return function(stream, state) { + var ch = stream.next(); + + if (ch === endChar) { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + var returnState = getType(state); + state.linkHref = false; + return returnState; + } + + stream.match(linkRE[endChar]) + state.linkHref = true; + return getType(state); + }; + } + + function footnoteLink(stream, state) { + if (stream.match(/^([^\]\\]|\\.)*\]:/, false)) { + state.f = footnoteLinkInside; + stream.next(); // Consume [ + if (modeCfg.highlightFormatting) state.formatting = "link"; + state.linkText = true; + return getType(state); + } + return switchInline(stream, state, inlineNormal); + } + + function footnoteLinkInside(stream, state) { + if (stream.match(']:', true)) { + state.f = state.inline = footnoteUrl; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var returnType = getType(state); + state.linkText = false; + return returnType; + } + + stream.match(/^([^\]\\]|\\.)+/, true); + + return tokenTypes.linkText; + } + + function footnoteUrl(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + // Match URL + stream.match(/^[^\s]+/, true); + // Check for link title + if (stream.peek() === undefined) { // End of line, set flag to check next line + state.linkTitle = true; + } else { // More content on line, check if link title + stream.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/, true); + } + state.f = state.inline = inlineNormal; + return tokenTypes.linkHref + " url"; + } + + var mode = { + startState: function() { + return { + f: blockNormal, + + prevLine: {stream: null}, + thisLine: {stream: null}, + + block: blockNormal, + htmlState: null, + indentation: 0, + + inline: inlineNormal, + text: handleText, + + formatting: false, + linkText: false, + linkHref: false, + linkTitle: false, + code: 0, + em: false, + strong: false, + header: 0, + setext: 0, + hr: false, + taskList: false, + list: false, + listStack: [], + quote: 0, + trailingSpace: 0, + trailingSpaceNewLine: false, + strikethrough: false, + emoji: false, + fencedEndRE: null + }; + }, + + copyState: function(s) { + return { + f: s.f, + + prevLine: s.prevLine, + thisLine: s.thisLine, + + block: s.block, + htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), + indentation: s.indentation, + + localMode: s.localMode, + localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, + + inline: s.inline, + text: s.text, + formatting: false, + linkText: s.linkText, + linkTitle: s.linkTitle, + linkHref: s.linkHref, + code: s.code, + em: s.em, + strong: s.strong, + strikethrough: s.strikethrough, + emoji: s.emoji, + header: s.header, + setext: s.setext, + hr: s.hr, + taskList: s.taskList, + list: s.list, + listStack: s.listStack.slice(0), + quote: s.quote, + indentedCode: s.indentedCode, + trailingSpace: s.trailingSpace, + trailingSpaceNewLine: s.trailingSpaceNewLine, + md_inside: s.md_inside, + fencedEndRE: s.fencedEndRE + }; + }, + + token: function(stream, state) { + + // Reset state.formatting + state.formatting = false; + + if (stream != state.thisLine.stream) { + state.header = 0; + state.hr = false; + + if (stream.match(/^\s*$/, true)) { + blankLine(state); + return null; + } + + state.prevLine = state.thisLine + state.thisLine = {stream: stream} + + // Reset state.taskList + state.taskList = false; + + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + + if (!state.localState) { + state.f = state.block; + if (state.f != htmlBlock) { + var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, expandedTab).length; + state.indentation = indentation; + state.indentationDiff = null; + if (indentation > 0) return null; + } + } + } + return state.f(stream, state); + }, + + innerMode: function(state) { + if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode}; + if (state.localState) return {state: state.localState, mode: state.localMode}; + return {state: state, mode: mode}; + }, + + indent: function(state, textAfter, line) { + if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line) + if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line) + return CodeMirror.Pass + }, + + blankLine: blankLine, + + getType: getType, + + blockCommentStart: "", + closeBrackets: "()[]{}''\"\"``", + fold: "markdown" + }; + return mode; +}, "xml"); + +CodeMirror.defineMIME("text/markdown", "markdown"); + +CodeMirror.defineMIME("text/x-markdown", "markdown"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mathematica/mathematica.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mathematica/mathematica.js new file mode 100644 index 0000000000..72b3492101 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mathematica/mathematica.js @@ -0,0 +1,176 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Mathematica mode copyright (c) 2015 by Calin Barbat +// Based on code by Patrick Scheibe (halirutan) +// See: https://github.com/halirutan/Mathematica-Source-Highlighting/tree/master/src/lang-mma.js + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('mathematica', function(_config, _parserConfig) { + + // used pattern building blocks + var Identifier = '[a-zA-Z\\$][a-zA-Z0-9\\$]*'; + var pBase = "(?:\\d+)"; + var pFloat = "(?:\\.\\d+|\\d+\\.\\d*|\\d+)"; + var pFloatBase = "(?:\\.\\w+|\\w+\\.\\w*|\\w+)"; + var pPrecision = "(?:`(?:`?"+pFloat+")?)"; + + // regular expressions + var reBaseForm = new RegExp('(?:'+pBase+'(?:\\^\\^'+pFloatBase+pPrecision+'?(?:\\*\\^[+-]?\\d+)?))'); + var reFloatForm = new RegExp('(?:' + pFloat + pPrecision + '?(?:\\*\\^[+-]?\\d+)?)'); + var reIdInContext = new RegExp('(?:`?)(?:' + Identifier + ')(?:`(?:' + Identifier + '))*(?:`?)'); + + function tokenBase(stream, state) { + var ch; + + // get next character + ch = stream.next(); + + // string + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + + // comment + if (ch === '(') { + if (stream.eat('*')) { + state.commentLevel++; + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + } + + // go back one character + stream.backUp(1); + + // look for numbers + // Numbers in a baseform + if (stream.match(reBaseForm, true, false)) { + return 'number'; + } + + // Mathematica numbers. Floats (1.2, .2, 1.) can have optionally a precision (`float) or an accuracy definition + // (``float). Note: while 1.2` is possible 1.2`` is not. At the end an exponent (float*^+12) can follow. + if (stream.match(reFloatForm, true, false)) { + return 'number'; + } + + /* In[23] and Out[34] */ + if (stream.match(/(?:In|Out)\[[0-9]*\]/, true, false)) { + return 'atom'; + } + + // usage + if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*(?:`[a-zA-Z0-9\$]+)*::usage)/, true, false)) { + return 'meta'; + } + + // message + if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*(?:`[a-zA-Z0-9\$]+)*::[a-zA-Z\$][a-zA-Z0-9\$]*):?/, true, false)) { + return 'string-2'; + } + + // this makes a look-ahead match for something like variable:{_Integer} + // the match is then forwarded to the mma-patterns tokenizer. + if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*\s*:)(?:(?:[a-zA-Z\$][a-zA-Z0-9\$]*)|(?:[^:=>~@\^\&\*\)\[\]'\?,\|])).*/, true, false)) { + return 'variable-2'; + } + + // catch variables which are used together with Blank (_), BlankSequence (__) or BlankNullSequence (___) + // Cannot start with a number, but can have numbers at any other position. Examples + // blub__Integer, a1_, b34_Integer32 + if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { + return 'variable-2'; + } + if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+/, true, false)) { + return 'variable-2'; + } + if (stream.match(/_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { + return 'variable-2'; + } + + // Named characters in Mathematica, like \[Gamma]. + if (stream.match(/\\\[[a-zA-Z\$][a-zA-Z0-9\$]*\]/, true, false)) { + return 'variable-3'; + } + + // Match all braces separately + if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { + return 'bracket'; + } + + // Catch Slots (#, ##, #3, ##9 and the V10 named slots #name). I have never seen someone using more than one digit after #, so we match + // only one. + if (stream.match(/(?:#[a-zA-Z\$][a-zA-Z0-9\$]*|#+[0-9]?)/, true, false)) { + return 'variable-2'; + } + + // Literals like variables, keywords, functions + if (stream.match(reIdInContext, true, false)) { + return 'keyword'; + } + + // operators. Note that operators like @@ or /; are matched separately for each symbol. + if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) { + return 'operator'; + } + + // everything else is an error + stream.next(); // advance the stream. + return 'error'; + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while(state.commentLevel > 0 && (next = stream.next()) != null) { + if (prev === '(' && next === '*') state.commentLevel++; + if (prev === '*' && next === ')') state.commentLevel--; + prev = next; + } + if (state.commentLevel <= 0) { + state.tokenize = tokenBase; + } + return 'comment'; + } + + return { + startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + blockCommentStart: "(*", + blockCommentEnd: "*)" + }; +}); + +CodeMirror.defineMIME('text/x-mathematica', { + name: 'mathematica' +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mbox/mbox.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mbox/mbox.js new file mode 100644 index 0000000000..640437ed64 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mbox/mbox.js @@ -0,0 +1,129 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +var rfc2822 = [ + "From", "Sender", "Reply-To", "To", "Cc", "Bcc", "Message-ID", + "In-Reply-To", "References", "Resent-From", "Resent-Sender", "Resent-To", + "Resent-Cc", "Resent-Bcc", "Resent-Message-ID", "Return-Path", "Received" +]; +var rfc2822NoEmail = [ + "Date", "Subject", "Comments", "Keywords", "Resent-Date" +]; + +CodeMirror.registerHelper("hintWords", "mbox", rfc2822.concat(rfc2822NoEmail)); + +var whitespace = /^[ \t]/; +var separator = /^From /; // See RFC 4155 +var rfc2822Header = new RegExp("^(" + rfc2822.join("|") + "): "); +var rfc2822HeaderNoEmail = new RegExp("^(" + rfc2822NoEmail.join("|") + "): "); +var header = /^[^:]+:/; // Optional fields defined in RFC 2822 +var email = /^[^ ]+@[^ ]+/; +var untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/; +var bracketedEmail = /^<.*?>/; +var untilBracketedEmail = /^.*?(?=<.*>)/; + +function styleForHeader(header) { + if (header === "Subject") return "header"; + return "string"; +} + +function readToken(stream, state) { + if (stream.sol()) { + // From last line + state.inSeparator = false; + if (state.inHeader && stream.match(whitespace)) { + // Header folding + return null; + } else { + state.inHeader = false; + state.header = null; + } + + if (stream.match(separator)) { + state.inHeaders = true; + state.inSeparator = true; + return "atom"; + } + + var match; + var emailPermitted = false; + if ((match = stream.match(rfc2822HeaderNoEmail)) || + (emailPermitted = true) && (match = stream.match(rfc2822Header))) { + state.inHeaders = true; + state.inHeader = true; + state.emailPermitted = emailPermitted; + state.header = match[1]; + return "atom"; + } + + // Use vim's heuristics: recognize custom headers only if the line is in a + // block of legitimate headers. + if (state.inHeaders && (match = stream.match(header))) { + state.inHeader = true; + state.emailPermitted = true; + state.header = match[1]; + return "atom"; + } + + state.inHeaders = false; + stream.skipToEnd(); + return null; + } + + if (state.inSeparator) { + if (stream.match(email)) return "link"; + if (stream.match(untilEmail)) return "atom"; + stream.skipToEnd(); + return "atom"; + } + + if (state.inHeader) { + var style = styleForHeader(state.header); + + if (state.emailPermitted) { + if (stream.match(bracketedEmail)) return style + " link"; + if (stream.match(untilBracketedEmail)) return style; + } + stream.skipToEnd(); + return style; + } + + stream.skipToEnd(); + return null; +}; + +CodeMirror.defineMode("mbox", function() { + return { + startState: function() { + return { + // Is in a mbox separator + inSeparator: false, + // Is in a mail header + inHeader: false, + // If bracketed email is permitted. Only applicable when inHeader + emailPermitted: false, + // Name of current header + header: null, + // Is in a region of mail headers + inHeaders: false + }; + }, + token: readToken, + blankLine: function(state) { + state.inHeaders = state.inSeparator = state.inHeader = false; + } + }; +}); + +CodeMirror.defineMIME("application/mbox", "mbox"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/meta.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/meta.js new file mode 100644 index 0000000000..38d5e0131d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/meta.js @@ -0,0 +1,221 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.modeInfo = [ + {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]}, + {name: "PGP", mimes: ["application/pgp", "application/pgp-encrypted", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["asc", "pgp", "sig"]}, + {name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"]}, + {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i}, + {name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"]}, + {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h", "ino"]}, + {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]}, + {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy", "cbl"]}, + {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp", "cs"]}, + {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]}, + {name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]}, + {name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]}, + {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists\.txt$/}, + {name: "CoffeeScript", mimes: ["application/vnd.coffeescript", "text/coffeescript", "text/x-coffeescript"], mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]}, + {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]}, + {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]}, + {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]}, + {name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"]}, + {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]}, + {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]}, + {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]}, + {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]}, + {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]}, + {name: "Django", mime: "text/x-django", mode: "django"}, + {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/}, + {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]}, + {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]}, + {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"}, + {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]}, + {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]}, + {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]}, + {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]}, + {name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]}, + {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]}, + {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]}, + {name: "Esper", mime: "text/x-esper", mode: "sql"}, + {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]}, + {name: "FCL", mime: "text/x-fcl", mode: "fcl"}, + {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]}, + {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90", "f95"]}, + {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]}, + {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]}, + {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]}, + {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history)\.md$/i}, + {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]}, + {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"], file: /^Jenkinsfile$/}, + {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]}, + {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]}, + {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]}, + {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]}, + {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]}, + {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]}, + {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm", "handlebars", "hbs"], alias: ["xhtml"]}, + {name: "HTTP", mime: "message/http", mode: "http"}, + {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]}, + {name: "Pug", mime: "text/x-pug", mode: "pug", ext: ["jade", "pug"], alias: ["jade"]}, + {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]}, + {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]}, + {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], + mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]}, + {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]}, + {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]}, + {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]}, + {name: "Jinja2", mime: "text/jinja2", mode: "jinja2", ext: ["j2", "jinja", "jinja2"]}, + {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"], alias: ["jl"]}, + {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]}, + {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]}, + {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]}, + {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]}, + {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]}, + {name: "mIRC", mime: "text/mirc", mode: "mirc"}, + {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"}, + {name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb", "wl", "wls"]}, + {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]}, + {name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"]}, + {name: "MS SQL", mime: "text/x-mssql", mode: "sql"}, + {name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"]}, + {name: "MySQL", mime: "text/x-mysql", mode: "sql"}, + {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i}, + {name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"]}, + {name: "NTriples", mimes: ["application/n-triples", "application/n-quads", "text/n-triples"], + mode: "ntriples", ext: ["nt", "nq"]}, + {name: "Objective-C", mime: "text/x-objectivec", mode: "clike", ext: ["m"], alias: ["objective-c", "objc"]}, + {name: "Objective-C++", mime: "text/x-objectivec++", mode: "clike", ext: ["mm"], alias: ["objective-c++", "objc++"]}, + {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]}, + {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]}, + {name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"]}, + {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]}, + {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]}, + {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]}, + {name: "PHP", mimes: ["text/x-php", "application/x-httpd-php", "application/x-httpd-php-open"], mode: "php", ext: ["php", "php3", "php4", "php5", "php7", "phtml"]}, + {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]}, + {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]}, + {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]}, + {name: "PostgreSQL", mime: "text/x-pgsql", mode: "sql"}, + {name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"]}, + {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]}, + {name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"]}, + {name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/}, + {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]}, + {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]}, + {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r", "R"], alias: ["rscript"]}, + {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]}, + {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"}, + {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]}, + {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]}, + {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]}, + {name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"]}, + {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]}, + {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]}, + {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]}, + {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]}, + {name: "Shell", mimes: ["text/x-sh", "application/x-sh"], mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/}, + {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]}, + {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]}, + {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]}, + {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]}, + {name: "Solr", mime: "text/x-solr", mode: "solr"}, + {name: "SML", mime: "text/x-sml", mode: "mllike", ext: ["sml", "sig", "fun", "smackspec"]}, + {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]}, + {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]}, + {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]}, + {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]}, + {name: "SQLite", mime: "text/x-sqlite", mode: "sql"}, + {name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"]}, + {name: "Stylus", mime: "text/x-styl", mode: "stylus", ext: ["styl"]}, + {name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"]}, + {name: "sTeX", mime: "text/x-stex", mode: "stex"}, + {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx", "tex"], alias: ["tex"]}, + {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v", "sv", "svh"]}, + {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]}, + {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]}, + {name: "TiddlyWiki", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, + {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, + {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]}, + {name: "Tornado", mime: "text/x-tornado", mode: "tornado"}, + {name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]}, + {name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"]}, + {name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"]}, + {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]}, + {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]}, + {name: "TypeScript-JSX", mime: "text/typescript-jsx", mode: "jsx", ext: ["tsx"], alias: ["tsx"]}, + {name: "Twig", mime: "text/x-twig", mode: "twig"}, + {name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"]}, + {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]}, + {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]}, + {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]}, + {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]}, + {name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]}, + {name: "Vue.js Component", mimes: ["script/x-vue", "text/x-vue"], mode: "vue", ext: ["vue"]}, + {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd", "svg"], alias: ["rss", "wsdl", "xsd"]}, + {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]}, + {name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]}, + {name: "YAML", mimes: ["text/x-yaml", "text/yaml"], mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]}, + {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}, + {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]}, + {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]}, + {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]}, + {name: "WebAssembly", mime: "text/webassembly", mode: "wast", ext: ["wat", "wast"]}, + ]; + // Ensure all modes have a mime property for backwards compatibility + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mimes) info.mime = info.mimes[0]; + } + + CodeMirror.findModeByMIME = function(mime) { + mime = mime.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mime == mime) return info; + if (info.mimes) for (var j = 0; j < info.mimes.length; j++) + if (info.mimes[j] == mime) return info; + } + if (/\+xml$/.test(mime)) return CodeMirror.findModeByMIME("application/xml") + if (/\+json$/.test(mime)) return CodeMirror.findModeByMIME("application/json") + }; + + CodeMirror.findModeByExtension = function(ext) { + ext = ext.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.ext) for (var j = 0; j < info.ext.length; j++) + if (info.ext[j] == ext) return info; + } + }; + + CodeMirror.findModeByFileName = function(filename) { + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.file && info.file.test(filename)) return info; + } + var dot = filename.lastIndexOf("."); + var ext = dot > -1 && filename.substring(dot + 1, filename.length); + if (ext) return CodeMirror.findModeByExtension(ext); + }; + + CodeMirror.findModeByName = function(name) { + name = name.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.name.toLowerCase() == name) return info; + if (info.alias) for (var j = 0; j < info.alias.length; j++) + if (info.alias[j].toLowerCase() == name) return info; + } + }; +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mirc/mirc.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mirc/mirc.js new file mode 100644 index 0000000000..d27b0152e9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mirc/mirc.js @@ -0,0 +1,193 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +//mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMIME("text/mirc", "mirc"); +CodeMirror.defineMode("mirc", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " + + "$activewid $address $addtok $agent $agentname $agentstat $agentver " + + "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " + + "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " + + "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " + + "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " + + "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " + + "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " + + "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " + + "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " + + "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " + + "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " + + "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " + + "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " + + "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " + + "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " + + "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " + + "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " + + "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " + + "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " + + "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " + + "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " + + "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " + + "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " + + "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " + + "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " + + "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " + + "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " + + "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " + + "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " + + "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " + + "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " + + "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " + + "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " + + "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " + + "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor"); + var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " + + "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " + + "channel clear clearall cline clipboard close cnick color comclose comopen " + + "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " + + "debug dec describe dialog did didtok disable disconnect dlevel dline dll " + + "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " + + "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " + + "events exit fclose filter findtext finger firewall flash flist flood flush " + + "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " + + "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " + + "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " + + "ialmark identd if ignore iline inc invite iuser join kick linesep links list " + + "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " + + "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " + + "qme qmsg query queryn quit raw reload remini remote remove rename renwin " + + "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " + + "say scid scon server set showmirc signam sline sockaccept sockclose socklist " + + "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " + + "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " + + "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " + + "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " + + "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " + + "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " + + "elseif else goto menu nicklist status title icon size option text edit " + + "button check radio box scroll list combo link tab item"); + var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); + var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + if (/[\[\]{}\(\),\.]/.test(ch)) { + if (ch == "(" && beforeParams) state.inParams = true; + else if (ch == ")") state.inParams = false; + return null; + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + else if (ch == "\\") { + stream.eat("\\"); + stream.eat(/./); + return "number"; + } + else if (ch == "/" && stream.eat("*")) { + return chain(stream, state, tokenComment); + } + else if (ch == ";" && stream.match(/ *\( *\(/)) { + return chain(stream, state, tokenUnparsed); + } + else if (ch == ";" && !state.inParams) { + stream.skipToEnd(); + return "comment"; + } + else if (ch == '"') { + stream.eat(/"/); + return "keyword"; + } + else if (ch == "$") { + stream.eatWhile(/[$_a-z0-9A-Z\.:]/); + if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) { + return "keyword"; + } + else { + state.beforeParams = true; + return "builtin"; + } + } + else if (ch == "%") { + stream.eatWhile(/[^,\s()]/); + state.beforeParams = true; + return "string"; + } + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + stream.eatWhile(/[\w\$_{}]/); + var word = stream.current().toLowerCase(); + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + if (functions && functions.propertyIsEnumerable(word)) { + state.beforeParams = true; + return "keyword"; + } + return null; + } + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == ";" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == ")") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + } + }; +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mllike/mllike.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mllike/mllike.js new file mode 100644 index 0000000000..8f92372782 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mllike/mllike.js @@ -0,0 +1,359 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('mllike', function(_config, parserConfig) { + var words = { + 'as': 'keyword', + 'do': 'keyword', + 'else': 'keyword', + 'end': 'keyword', + 'exception': 'keyword', + 'fun': 'keyword', + 'functor': 'keyword', + 'if': 'keyword', + 'in': 'keyword', + 'include': 'keyword', + 'let': 'keyword', + 'of': 'keyword', + 'open': 'keyword', + 'rec': 'keyword', + 'struct': 'keyword', + 'then': 'keyword', + 'type': 'keyword', + 'val': 'keyword', + 'while': 'keyword', + 'with': 'keyword' + }; + + var extraWords = parserConfig.extraWords || {}; + for (var prop in extraWords) { + if (extraWords.hasOwnProperty(prop)) { + words[prop] = parserConfig.extraWords[prop]; + } + } + var hintWords = []; + for (var k in words) { hintWords.push(k); } + CodeMirror.registerHelper("hintWords", "mllike", hintWords); + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + if (ch === '{') { + if (stream.eat('|')) { + state.longString = true; + state.tokenize = tokenLongString; + return state.tokenize(stream, state); + } + } + if (ch === '(') { + if (stream.match(/^\*(?!\))/)) { + state.commentLevel++; + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + } + if (ch === '~' || ch === '?') { + stream.eatWhile(/\w/); + return 'variable-2'; + } + if (ch === '`') { + stream.eatWhile(/\w/); + return 'quote'; + } + if (ch === '/' && parserConfig.slashComments && stream.eat('/')) { + stream.skipToEnd(); + return 'comment'; + } + if (/\d/.test(ch)) { + if (ch === '0' && stream.eat(/[bB]/)) { + stream.eatWhile(/[01]/); + } if (ch === '0' && stream.eat(/[xX]/)) { + stream.eatWhile(/[0-9a-fA-F]/) + } if (ch === '0' && stream.eat(/[oO]/)) { + stream.eatWhile(/[0-7]/); + } else { + stream.eatWhile(/[\d_]/); + if (stream.eat('.')) { + stream.eatWhile(/[\d]/); + } + if (stream.eat(/[eE]/)) { + stream.eatWhile(/[\d\-+]/); + } + } + return 'number'; + } + if ( /[+\-*&%=<>!?|@\.~:]/.test(ch)) { + return 'operator'; + } + if (/[\w\xa1-\uffff]/.test(ch)) { + stream.eatWhile(/[\w\xa1-\uffff]/); + var cur = stream.current(); + return words.hasOwnProperty(cur) ? words[cur] : 'variable'; + } + return null + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while(state.commentLevel > 0 && (next = stream.next()) != null) { + if (prev === '(' && next === '*') state.commentLevel++; + if (prev === '*' && next === ')') state.commentLevel--; + prev = next; + } + if (state.commentLevel <= 0) { + state.tokenize = tokenBase; + } + return 'comment'; + } + + function tokenLongString(stream, state) { + var prev, next; + while (state.longString && (next = stream.next()) != null) { + if (prev === '|' && next === '}') state.longString = false; + prev = next; + } + if (!state.longString) { + state.tokenize = tokenBase; + } + return 'string'; + } + + return { + startState: function() {return {tokenize: tokenBase, commentLevel: 0, longString: false};}, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + + blockCommentStart: "(*", + blockCommentEnd: "*)", + lineComment: parserConfig.slashComments ? "//" : null + }; +}); + +CodeMirror.defineMIME('text/x-ocaml', { + name: 'mllike', + extraWords: { + 'and': 'keyword', + 'assert': 'keyword', + 'begin': 'keyword', + 'class': 'keyword', + 'constraint': 'keyword', + 'done': 'keyword', + 'downto': 'keyword', + 'external': 'keyword', + 'function': 'keyword', + 'initializer': 'keyword', + 'lazy': 'keyword', + 'match': 'keyword', + 'method': 'keyword', + 'module': 'keyword', + 'mutable': 'keyword', + 'new': 'keyword', + 'nonrec': 'keyword', + 'object': 'keyword', + 'private': 'keyword', + 'sig': 'keyword', + 'to': 'keyword', + 'try': 'keyword', + 'value': 'keyword', + 'virtual': 'keyword', + 'when': 'keyword', + + // builtins + 'raise': 'builtin', + 'failwith': 'builtin', + 'true': 'builtin', + 'false': 'builtin', + + // Pervasives builtins + 'asr': 'builtin', + 'land': 'builtin', + 'lor': 'builtin', + 'lsl': 'builtin', + 'lsr': 'builtin', + 'lxor': 'builtin', + 'mod': 'builtin', + 'or': 'builtin', + + // More Pervasives + 'raise_notrace': 'builtin', + 'trace': 'builtin', + 'exit': 'builtin', + 'print_string': 'builtin', + 'print_endline': 'builtin', + + 'int': 'type', + 'float': 'type', + 'bool': 'type', + 'char': 'type', + 'string': 'type', + 'unit': 'type', + + // Modules + 'List': 'builtin' + } +}); + +CodeMirror.defineMIME('text/x-fsharp', { + name: 'mllike', + extraWords: { + 'abstract': 'keyword', + 'assert': 'keyword', + 'base': 'keyword', + 'begin': 'keyword', + 'class': 'keyword', + 'default': 'keyword', + 'delegate': 'keyword', + 'do!': 'keyword', + 'done': 'keyword', + 'downcast': 'keyword', + 'downto': 'keyword', + 'elif': 'keyword', + 'extern': 'keyword', + 'finally': 'keyword', + 'for': 'keyword', + 'function': 'keyword', + 'global': 'keyword', + 'inherit': 'keyword', + 'inline': 'keyword', + 'interface': 'keyword', + 'internal': 'keyword', + 'lazy': 'keyword', + 'let!': 'keyword', + 'match': 'keyword', + 'member': 'keyword', + 'module': 'keyword', + 'mutable': 'keyword', + 'namespace': 'keyword', + 'new': 'keyword', + 'null': 'keyword', + 'override': 'keyword', + 'private': 'keyword', + 'public': 'keyword', + 'return!': 'keyword', + 'return': 'keyword', + 'select': 'keyword', + 'static': 'keyword', + 'to': 'keyword', + 'try': 'keyword', + 'upcast': 'keyword', + 'use!': 'keyword', + 'use': 'keyword', + 'void': 'keyword', + 'when': 'keyword', + 'yield!': 'keyword', + 'yield': 'keyword', + + // Reserved words + 'atomic': 'keyword', + 'break': 'keyword', + 'checked': 'keyword', + 'component': 'keyword', + 'const': 'keyword', + 'constraint': 'keyword', + 'constructor': 'keyword', + 'continue': 'keyword', + 'eager': 'keyword', + 'event': 'keyword', + 'external': 'keyword', + 'fixed': 'keyword', + 'method': 'keyword', + 'mixin': 'keyword', + 'object': 'keyword', + 'parallel': 'keyword', + 'process': 'keyword', + 'protected': 'keyword', + 'pure': 'keyword', + 'sealed': 'keyword', + 'tailcall': 'keyword', + 'trait': 'keyword', + 'virtual': 'keyword', + 'volatile': 'keyword', + + // builtins + 'List': 'builtin', + 'Seq': 'builtin', + 'Map': 'builtin', + 'Set': 'builtin', + 'Option': 'builtin', + 'int': 'builtin', + 'string': 'builtin', + 'not': 'builtin', + 'true': 'builtin', + 'false': 'builtin', + + 'raise': 'builtin', + 'failwith': 'builtin' + }, + slashComments: true +}); + + +CodeMirror.defineMIME('text/x-sml', { + name: 'mllike', + extraWords: { + 'abstype': 'keyword', + 'and': 'keyword', + 'andalso': 'keyword', + 'case': 'keyword', + 'datatype': 'keyword', + 'fn': 'keyword', + 'handle': 'keyword', + 'infix': 'keyword', + 'infixr': 'keyword', + 'local': 'keyword', + 'nonfix': 'keyword', + 'op': 'keyword', + 'orelse': 'keyword', + 'raise': 'keyword', + 'withtype': 'keyword', + 'eqtype': 'keyword', + 'sharing': 'keyword', + 'sig': 'keyword', + 'signature': 'keyword', + 'structure': 'keyword', + 'where': 'keyword', + 'true': 'keyword', + 'false': 'keyword', + + // types + 'int': 'builtin', + 'real': 'builtin', + 'string': 'builtin', + 'char': 'builtin', + 'bool': 'builtin' + }, + slashComments: true +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/modelica/modelica.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/modelica/modelica.js new file mode 100644 index 0000000000..2e9622f03f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/modelica/modelica.js @@ -0,0 +1,245 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Modelica support for CodeMirror, copyright (c) by Lennart Ochel + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +}) + +(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("modelica", function(config, parserConfig) { + + var indentUnit = config.indentUnit; + var keywords = parserConfig.keywords || {}; + var builtin = parserConfig.builtin || {}; + var atoms = parserConfig.atoms || {}; + + var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/; + var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/; + var isDigit = /[0-9]/; + var isNonDigit = /[_a-zA-Z]/; + + function tokenLineComment(stream, state) { + stream.skipToEnd(); + state.tokenize = null; + return "comment"; + } + + function tokenBlockComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == '"' && !escaped) { + state.tokenize = null; + state.sol = false; + break; + } + escaped = !escaped && ch == "\\"; + } + + return "string"; + } + + function tokenIdent(stream, state) { + stream.eatWhile(isDigit); + while (stream.eat(isDigit) || stream.eat(isNonDigit)) { } + + + var cur = stream.current(); + + if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++; + else if(state.sol && cur == "end" && state.level > 0) state.level--; + + state.tokenize = null; + state.sol = false; + + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + else if (builtin.propertyIsEnumerable(cur)) return "builtin"; + else if (atoms.propertyIsEnumerable(cur)) return "atom"; + else return "variable"; + } + + function tokenQIdent(stream, state) { + while (stream.eat(/[^']/)) { } + + state.tokenize = null; + state.sol = false; + + if(stream.eat("'")) + return "variable"; + else + return "error"; + } + + function tokenUnsignedNumber(stream, state) { + stream.eatWhile(isDigit); + if (stream.eat('.')) { + stream.eatWhile(isDigit); + } + if (stream.eat('e') || stream.eat('E')) { + if (!stream.eat('-')) + stream.eat('+'); + stream.eatWhile(isDigit); + } + + state.tokenize = null; + state.sol = false; + return "number"; + } + + // Interface + return { + startState: function() { + return { + tokenize: null, + level: 0, + sol: true + }; + }, + + token: function(stream, state) { + if(state.tokenize != null) { + return state.tokenize(stream, state); + } + + if(stream.sol()) { + state.sol = true; + } + + // WHITESPACE + if(stream.eatSpace()) { + state.tokenize = null; + return null; + } + + var ch = stream.next(); + + // LINECOMMENT + if(ch == '/' && stream.eat('/')) { + state.tokenize = tokenLineComment; + } + // BLOCKCOMMENT + else if(ch == '/' && stream.eat('*')) { + state.tokenize = tokenBlockComment; + } + // TWO SYMBOL TOKENS + else if(isDoubleOperatorChar.test(ch+stream.peek())) { + stream.next(); + state.tokenize = null; + return "operator"; + } + // SINGLE SYMBOL TOKENS + else if(isSingleOperatorChar.test(ch)) { + state.tokenize = null; + return "operator"; + } + // IDENT + else if(isNonDigit.test(ch)) { + state.tokenize = tokenIdent; + } + // Q-IDENT + else if(ch == "'" && stream.peek() && stream.peek() != "'") { + state.tokenize = tokenQIdent; + } + // STRING + else if(ch == '"') { + state.tokenize = tokenString; + } + // UNSIGNED_NUMBER + else if(isDigit.test(ch)) { + state.tokenize = tokenUnsignedNumber; + } + // ERROR + else { + state.tokenize = null; + return "error"; + } + + return state.tokenize(stream, state); + }, + + indent: function(state, textAfter) { + if (state.tokenize != null) return CodeMirror.Pass; + + var level = state.level; + if(/(algorithm)/.test(textAfter)) level--; + if(/(equation)/.test(textAfter)) level--; + if(/(initial algorithm)/.test(textAfter)) level--; + if(/(initial equation)/.test(textAfter)) level--; + if(/(end)/.test(textAfter)) level--; + + if(level > 0) + return indentUnit*level; + else + return 0; + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i=0; i", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], + "singlecomment" : ["//", "#"], + "operators" : ["="] + }, + xu: { + "keywords" : ["msc", "xu"], + "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "wordwrapentities", "watermark"], + "constants" : ["true", "false", "on", "off", "auto"], + "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip", "title", "deactivate", "activate", "activation"], + "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists + "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], + "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], + "singlecomment" : ["//", "#"], + "operators" : ["="] + }, + msgenny: { + "keywords" : null, + "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "wordwrapentities", "watermark"], + "constants" : ["true", "false", "on", "off", "auto"], + "attributes" : null, + "brackets" : ["\\{", "\\}"], + "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], + "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], + "singlecomment" : ["//", "#"], + "operators" : ["="] + } + } + + CodeMirror.defineMode("mscgen", function(_, modeConfig) { + var language = languages[modeConfig && modeConfig.language || "mscgen"] + return { + startState: startStateFn, + copyState: copyStateFn, + token: produceTokenFunction(language), + lineComment : "#", + blockCommentStart : "/*", + blockCommentEnd : "*/" + }; + }); + + CodeMirror.defineMIME("text/x-mscgen", "mscgen"); + CodeMirror.defineMIME("text/x-xu", {name: "mscgen", language: "xu"}); + CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"}); + + function wordRegexpBoundary(pWords) { + return new RegExp("^\\b(?:" + pWords.join("|") + ")\\b", "i"); + } + + function wordRegexp(pWords) { + return new RegExp("^(?:" + pWords.join("|") + ")", "i"); + } + + function startStateFn() { + return { + inComment : false, + inString : false, + inAttributeList : false, + inScript : false + }; + } + + function copyStateFn(pState) { + return { + inComment : pState.inComment, + inString : pState.inString, + inAttributeList : pState.inAttributeList, + inScript : pState.inScript + }; + } + + function produceTokenFunction(pConfig) { + + return function(pStream, pState) { + if (pStream.match(wordRegexp(pConfig.brackets), true, true)) { + return "bracket"; + } + /* comments */ + if (!pState.inComment) { + if (pStream.match(/\/\*[^\*\/]*/, true, true)) { + pState.inComment = true; + return "comment"; + } + if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) { + pStream.skipToEnd(); + return "comment"; + } + } + if (pState.inComment) { + if (pStream.match(/[^\*\/]*\*\//, true, true)) + pState.inComment = false; + else + pStream.skipToEnd(); + return "comment"; + } + /* strings */ + if (!pState.inString && pStream.match(/\"(\\\"|[^\"])*/, true, true)) { + pState.inString = true; + return "string"; + } + if (pState.inString) { + if (pStream.match(/[^\"]*\"/, true, true)) + pState.inString = false; + else + pStream.skipToEnd(); + return "string"; + } + /* keywords & operators */ + if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true)) + return "keyword"; + + if (pStream.match(wordRegexpBoundary(pConfig.options), true, true)) + return "keyword"; + + if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true)) + return "keyword"; + + if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true)) + return "keyword"; + + if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true)) + return "operator"; + + if (!!pConfig.constants && pStream.match(wordRegexp(pConfig.constants), true, true)) + return "variable"; + + /* attribute lists */ + if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match('[', true, true)) { + pConfig.inAttributeList = true; + return "bracket"; + } + if (pConfig.inAttributeList) { + if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) { + return "attribute"; + } + if (pStream.match(']', true, true)) { + pConfig.inAttributeList = false; + return "bracket"; + } + } + + pStream.next(); + return "base"; + }; + } + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mumps/mumps.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mumps/mumps.js new file mode 100644 index 0000000000..c53b4bf3a2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/mumps/mumps.js @@ -0,0 +1,148 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + This MUMPS Language script was constructed using vbscript.js as a template. +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("mumps", function() { + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]"); + var doubleOperators = new RegExp("^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))"); + var singleDelimiters = new RegExp("^[\\.,:]"); + var brackets = new RegExp("[()]"); + var identifiers = new RegExp("^[%A-Za-z][A-Za-z0-9]*"); + var commandKeywords = ["break","close","do","else","for","goto", "halt", "hang", "if", "job","kill","lock","merge","new","open", "quit", "read", "set", "tcommit", "trollback", "tstart", "use", "view", "write", "xecute", "b","c","d","e","f","g", "h", "i", "j","k","l","m","n","o", "q", "r", "s", "tc", "tro", "ts", "u", "v", "w", "x"]; + // The following list includes intrinsic functions _and_ special variables + var intrinsicFuncsWords = ["\\$ascii", "\\$char", "\\$data", "\\$ecode", "\\$estack", "\\$etrap", "\\$extract", "\\$find", "\\$fnumber", "\\$get", "\\$horolog", "\\$io", "\\$increment", "\\$job", "\\$justify", "\\$length", "\\$name", "\\$next", "\\$order", "\\$piece", "\\$qlength", "\\$qsubscript", "\\$query", "\\$quit", "\\$random", "\\$reverse", "\\$select", "\\$stack", "\\$test", "\\$text", "\\$translate", "\\$view", "\\$x", "\\$y", "\\$a", "\\$c", "\\$d", "\\$e", "\\$ec", "\\$es", "\\$et", "\\$f", "\\$fn", "\\$g", "\\$h", "\\$i", "\\$j", "\\$l", "\\$n", "\\$na", "\\$o", "\\$p", "\\$q", "\\$ql", "\\$qs", "\\$r", "\\$re", "\\$s", "\\$st", "\\$t", "\\$tr", "\\$v", "\\$z"]; + var intrinsicFuncs = wordRegexp(intrinsicFuncsWords); + var command = wordRegexp(commandKeywords); + + function tokenBase(stream, state) { + if (stream.sol()) { + state.label = true; + state.commandMode = 0; + } + + // The character has meaning in MUMPS. Ignoring consecutive + // spaces would interfere with interpreting whether the next non-space + // character belongs to the command or argument context. + + // Examine each character and update a mode variable whose interpretation is: + // >0 => command 0 => argument <0 => command post-conditional + var ch = stream.peek(); + + if (ch == " " || ch == "\t") { // Pre-process + state.label = false; + if (state.commandMode == 0) + state.commandMode = 1; + else if ((state.commandMode < 0) || (state.commandMode == 2)) + state.commandMode = 0; + } else if ((ch != ".") && (state.commandMode > 0)) { + if (ch == ":") + state.commandMode = -1; // SIS - Command post-conditional + else + state.commandMode = 2; + } + + // Do not color parameter list as line tag + if ((ch === "(") || (ch === "\u0009")) + state.label = false; + + // MUMPS comment starts with ";" + if (ch === ";") { + stream.skipToEnd(); + return "comment"; + } + + // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator + if (stream.match(/^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?/)) + return "number"; + + // Handle Strings + if (ch == '"') { + if (stream.skipTo('"')) { + stream.next(); + return "string"; + } else { + stream.skipToEnd(); + return "error"; + } + } + + // Handle operators and Delimiters + if (stream.match(doubleOperators) || stream.match(singleOperators)) + return "operator"; + + // Prevents leading "." in DO block from falling through to error + if (stream.match(singleDelimiters)) + return null; + + if (brackets.test(ch)) { + stream.next(); + return "bracket"; + } + + if (state.commandMode > 0 && stream.match(command)) + return "variable-2"; + + if (stream.match(intrinsicFuncs)) + return "builtin"; + + if (stream.match(identifiers)) + return "variable"; + + // Detect dollar-sign when not a documented intrinsic function + // "^" may introduce a GVN or SSVN - Color same as function + if (ch === "$" || ch === "^") { + stream.next(); + return "builtin"; + } + + // MUMPS Indirection + if (ch === "@") { + stream.next(); + return "string-2"; + } + + if (/[\w%]/.test(ch)) { + stream.eatWhile(/[\w%]/); + return "variable"; + } + + // Handle non-detected items + stream.next(); + return "error"; + } + + return { + startState: function() { + return { + label: false, + commandMode: 0 + }; + }, + + token: function(stream, state) { + var style = tokenBase(stream, state); + if (state.label) return "tag"; + return style; + } + }; + }); + + CodeMirror.defineMIME("text/x-mumps", "mumps"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nginx/nginx.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nginx/nginx.js new file mode 100644 index 0000000000..a09f1501fa --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nginx/nginx.js @@ -0,0 +1,178 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("nginx", function(config) { + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = words( + /* ngxDirectiveControl */ "break return rewrite set" + + /* ngxDirective */ " accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23" + ); + + var keywords_block = words( + /* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map" + ); + + var keywords_important = words( + /* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files" + ); + + var indentUnit = config.indentUnit, type; + function ret(style, tp) {type = tp; return style;} + + function tokenBase(stream, state) { + + + stream.eatWhile(/[\w\$_]/); + + var cur = stream.current(); + + + if (keywords.propertyIsEnumerable(cur)) { + return "keyword"; + } + else if (keywords_block.propertyIsEnumerable(cur)) { + return "variable-2"; + } + else if (keywords_important.propertyIsEnumerable(cur)) { + return "string-2"; + } + /**/ + + var ch = stream.next(); + if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());} + else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + else if (ch == "<" && stream.eat("!")) { + state.tokenize = tokenSGMLComment; + return tokenSGMLComment(stream, state); + } + else if (ch == "=") ret(null, "compare"); + else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + else if (ch == "#") { + stream.skipToEnd(); + return ret("comment", "comment"); + } + else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } + else if (/\d/.test(ch)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } + else if (/[,.+>*\/]/.test(ch)) { + return ret(null, "select-op"); + } + else if (/[;{}:\[\]]/.test(ch)) { + return ret(null, ch); + } + else { + stream.eatWhile(/[\w\\\-]/); + return ret("variable", "variable"); + } + } + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenSGMLComment(stream, state) { + var dashes = 0, ch; + while ((ch = stream.next()) != null) { + if (dashes >= 2 && ch == ">") { + state.tokenize = tokenBase; + break; + } + dashes = (ch == "-") ? dashes + 1 : 0; + } + return ret("comment", "comment"); + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) + break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + stack: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + type = null; + var style = state.tokenize(stream, state); + + var context = state.stack[state.stack.length-1]; + if (type == "hash" && context == "rule") style = "atom"; + else if (style == "variable") { + if (context == "rule") style = "number"; + else if (!context || context == "@media{") style = "tag"; + } + + if (context == "rule" && /^[\{\};]$/.test(type)) + state.stack.pop(); + if (type == "{") { + if (context == "@media") state.stack[state.stack.length-1] = "@media{"; + else state.stack.push("{"); + } + else if (type == "}") state.stack.pop(); + else if (type == "@media") state.stack.push("@media"); + else if (context == "{" && type != "comment") state.stack.push("rule"); + return style; + }, + + indent: function(state, textAfter) { + var n = state.stack.length; + if (/^\}/.test(textAfter)) + n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; + return state.baseIndent + n * indentUnit; + }, + + electricChars: "}" + }; +}); + +CodeMirror.defineMIME("text/x-nginx-conf", "nginx"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nsis/nsis.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nsis/nsis.js new file mode 100644 index 0000000000..ebd3c8bf5c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/nsis/nsis.js @@ -0,0 +1,95 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Author: Jan T. Sott (http://github.com/idleberg) + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineSimpleMode("nsis",{ + start:[ + // Numbers + {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"}, + + // Strings + { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, + { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, + { regex: /`(?:[^\\`]|\\.)*`?/, token: "string" }, + + // Compile Time Commands + {regex: /^\s*(?:\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|error|execute|finalize|getdllversion|gettlbversion|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|uninstfinalize|verbose|warning))\b/i, token: "keyword"}, + + // Conditional Compilation + {regex: /^\s*(?:\!(if(?:n?def)?|ifmacron?def|macro))\b/i, token: "keyword", indent: true}, + {regex: /^\s*(?:\!(else|endif|macroend))\b/i, token: "keyword", dedent: true}, + + // Runtime Commands + {regex: /^\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecShellWait|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetKnownFolderPath|GetLabelAddress|GetTempFileName|GetWinVer|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfRtlLanguage|IfShellVarContextAll|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|Int64Cmp|Int64CmpU|Int64Fmt|IntCmp|IntCmpU|IntFmt|IntOp|IntPtrCmp|IntPtrCmpU|IntPtrOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadAndSetImage|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestLongPathAware|ManifestMaxVersionTested|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|PEAddResource|PEDllCharacteristics|PERemoveResource|PESubsysVer|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegMultiStr|WriteRegNone|WriteRegStr|WriteUninstaller|XPStyle)\b/i, token: "keyword"}, + {regex: /^\s*(?:Function|PageEx|Section(?:Group)?)\b/i, token: "keyword", indent: true}, + {regex: /^\s*(?:(Function|PageEx|Section(?:Group)?)End)\b/i, token: "keyword", dedent: true}, + + // Command Options + {regex: /\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR(32|64)?|HKCU(32|64)?|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM(32|64)?|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\b/i, token: "atom"}, + {regex: /\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|false|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|off|on|right|show|silent|silentlog|textonly|top|true|try|un\.components|un\.custom|un\.directory|un\.instfiles|un\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\b/i, token: "builtin"}, + + // LogicLib.nsh + {regex: /\$\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\}/i, token: "variable-2", indent: true}, + + // FileFunc.nsh + {regex: /\$\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\}/i, token: "variable-2", dedent: true}, + + // Memento.nsh + {regex: /\$\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\}/i, token: "variable-2", dedent: true}, + + // TextFunc.nsh + {regex: /\$\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\}/i, token: "variable-2", dedent: true}, + + // WinVer.nsh + {regex: /\$\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\}/i, token: "variable", dedent: true}, + + // WordFunc.nsh + {regex: /\$\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\}/i, token: "variable-2", dedent: true}, + + // x64.nsh + {regex: /\$\{(?:RunningX64)\}/i, token: "variable", dedent: true}, + {regex: /\$\{(?:Disable|Enable)X64FSRedirection\}/i, token: "variable-2", dedent: true}, + + // Line Comment + {regex: /(#|;).*/, token: "comment"}, + + // Block Comment + {regex: /\/\*/, token: "comment", next: "comment"}, + + // Operator + {regex: /[-+\/*=<>!]+/, token: "operator"}, + + // Variable + {regex: /\$\w[\w\.]*/, token: "variable"}, + + // Constant + {regex: /\${[\!\w\.:-]+}/, token: "variable-2"}, + + // Language String + {regex: /\$\([\!\w\.:-]+\)/, token: "variable-3"} + ], + comment: [ + {regex: /.*?\*\//, token: "comment", next: "start"}, + {regex: /.*/, token: "comment"} + ], + meta: { + electricInput: /^\s*((Function|PageEx|Section|Section(Group)?)End|(\!(endif|macroend))|\$\{(End(If|Unless|While)|Loop(Until)|Next)\})$/i, + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: ["#", ";"] + } +}); + +CodeMirror.defineMIME("text/x-nsis", "nsis"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ntriples/ntriples.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ntriples/ntriples.js new file mode 100644 index 0000000000..5dd027286a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ntriples/ntriples.js @@ -0,0 +1,195 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/********************************************************** +* This script provides syntax highlighting support for +* the N-Triples format. +* N-Triples format specification: +* https://www.w3.org/TR/n-triples/ +***********************************************************/ + +/* + The following expression defines the defined ASF grammar transitions. + + pre_subject -> + { + ( writing_subject_uri | writing_bnode_uri ) + -> pre_predicate + -> writing_predicate_uri + -> pre_object + -> writing_object_uri | writing_object_bnode | + ( + writing_object_literal + -> writing_literal_lang | writing_literal_type + ) + -> post_object + -> BEGIN + } otherwise { + -> ERROR + } +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("ntriples", function() { + + var Location = { + PRE_SUBJECT : 0, + WRITING_SUB_URI : 1, + WRITING_BNODE_URI : 2, + PRE_PRED : 3, + WRITING_PRED_URI : 4, + PRE_OBJ : 5, + WRITING_OBJ_URI : 6, + WRITING_OBJ_BNODE : 7, + WRITING_OBJ_LITERAL : 8, + WRITING_LIT_LANG : 9, + WRITING_LIT_TYPE : 10, + POST_OBJ : 11, + ERROR : 12 + }; + function transitState(currState, c) { + var currLocation = currState.location; + var ret; + + // Opening. + if (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI; + else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI; + else if(currLocation == Location.PRE_PRED && c == '<') ret = Location.WRITING_PRED_URI; + else if(currLocation == Location.PRE_OBJ && c == '<') ret = Location.WRITING_OBJ_URI; + else if(currLocation == Location.PRE_OBJ && c == '_') ret = Location.WRITING_OBJ_BNODE; + else if(currLocation == Location.PRE_OBJ && c == '"') ret = Location.WRITING_OBJ_LITERAL; + + // Closing. + else if(currLocation == Location.WRITING_SUB_URI && c == '>') ret = Location.PRE_PRED; + else if(currLocation == Location.WRITING_BNODE_URI && c == ' ') ret = Location.PRE_PRED; + else if(currLocation == Location.WRITING_PRED_URI && c == '>') ret = Location.PRE_OBJ; + else if(currLocation == Location.WRITING_OBJ_URI && c == '>') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_OBJ_BNODE && c == ' ') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ; + else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ; + + // Closing typed and language literal. + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG; + else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE; + + // Spaces. + else if( c == ' ' && + ( + currLocation == Location.PRE_SUBJECT || + currLocation == Location.PRE_PRED || + currLocation == Location.PRE_OBJ || + currLocation == Location.POST_OBJ + ) + ) ret = currLocation; + + // Reset. + else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT; + + // Error + else ret = Location.ERROR; + + currState.location=ret; + } + + return { + startState: function() { + return { + location : Location.PRE_SUBJECT, + uris : [], + anchors : [], + bnodes : [], + langs : [], + types : [] + }; + }, + token: function(stream, state) { + var ch = stream.next(); + if(ch == '<') { + transitState(state, ch); + var parsedURI = ''; + stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} ); + state.uris.push(parsedURI); + if( stream.match('#', false) ) return 'variable'; + stream.next(); + transitState(state, '>'); + return 'variable'; + } + if(ch == '#') { + var parsedAnchor = ''; + stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;}); + state.anchors.push(parsedAnchor); + return 'variable-2'; + } + if(ch == '>') { + transitState(state, '>'); + return 'variable'; + } + if(ch == '_') { + transitState(state, ch); + var parsedBNode = ''; + stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;}); + state.bnodes.push(parsedBNode); + stream.next(); + transitState(state, ' '); + return 'builtin'; + } + if(ch == '"') { + transitState(state, ch); + stream.eatWhile( function(c) { return c != '"'; } ); + stream.next(); + if( stream.peek() != '@' && stream.peek() != '^' ) { + transitState(state, '"'); + } + return 'string'; + } + if( ch == '@' ) { + transitState(state, '@'); + var parsedLang = ''; + stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;}); + state.langs.push(parsedLang); + stream.next(); + transitState(state, ' '); + return 'string-2'; + } + if( ch == '^' ) { + stream.next(); + transitState(state, '^'); + var parsedType = ''; + stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} ); + state.types.push(parsedType); + stream.next(); + transitState(state, '>'); + return 'variable'; + } + if( ch == ' ' ) { + transitState(state, ch); + } + if( ch == '.' ) { + transitState(state, ch); + } + } + }; +}); + +// define the registered Media Type for n-triples: +// https://www.w3.org/TR/n-triples/#n-triples-mediatype +CodeMirror.defineMIME("application/n-triples", "ntriples"); + +// N-Quads is based on the N-Triples format (so same highlighting works) +// https://www.w3.org/TR/n-quads/ +CodeMirror.defineMIME("application/n-quads", "ntriples"); + +// previously used, though technically incorrect media type for n-triples +CodeMirror.defineMIME("text/n-triples", "ntriples"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/octave/octave.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/octave/octave.js new file mode 100644 index 0000000000..33a03368fa --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/octave/octave.js @@ -0,0 +1,139 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("octave", function() { + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&|\\^~<>!@'\\\\]"); + var singleDelimiters = new RegExp('^[\\(\\[\\{\\},:=;\\.]'); + var doubleOperators = new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))"); + var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = new RegExp("^((>>=)|(<<=))"); + var expressionEnd = new RegExp("^[\\]\\)]"); + var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); + + var builtins = wordRegexp([ + 'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos', + 'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh', + 'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones', + 'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov', + 'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot', + 'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str', + 'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember' + ]); + + var keywords = wordRegexp([ + 'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction', + 'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events', + 'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until', + 'continue', 'pkg' + ]); + + + // tokenizers + function tokenTranspose(stream, state) { + if (!stream.sol() && stream.peek() === '\'') { + stream.next(); + state.tokenize = tokenBase; + return 'operator'; + } + state.tokenize = tokenBase; + return tokenBase(stream, state); + } + + + function tokenComment(stream, state) { + if (stream.match(/^.*%}/)) { + state.tokenize = tokenBase; + return 'comment'; + }; + stream.skipToEnd(); + return 'comment'; + } + + function tokenBase(stream, state) { + // whitespaces + if (stream.eatSpace()) return null; + + // Handle one line Comments + if (stream.match('%{')){ + state.tokenize = tokenComment; + stream.skipToEnd(); + return 'comment'; + } + + if (stream.match(/^[%#]/)){ + stream.skipToEnd(); + return 'comment'; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.+-]/, false)) { + if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) { + stream.tokenize = tokenBase; + return 'number'; }; + if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; + if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; + } + if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; }; + + // Handle Strings + var m = stream.match(/^"(?:[^"]|"")*("|$)/) || stream.match(/^'(?:[^']|'')*('|$)/) + if (m) { return m[1] ? 'string' : "string error"; } + + // Handle words + if (stream.match(keywords)) { return 'keyword'; } ; + if (stream.match(builtins)) { return 'builtin'; } ; + if (stream.match(identifiers)) { return 'variable'; } ; + + if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; }; + if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; }; + + if (stream.match(expressionEnd)) { + state.tokenize = tokenTranspose; + return null; + }; + + + // Handle non-detected items + stream.next(); + return 'error'; + }; + + + return { + startState: function() { + return { + tokenize: tokenBase + }; + }, + + token: function(stream, state) { + var style = state.tokenize(stream, state); + if (style === 'number' || style === 'variable'){ + state.tokenize = tokenTranspose; + } + return style; + }, + + lineComment: '%', + + fold: 'indent' + }; +}); + +CodeMirror.defineMIME("text/x-octave", "octave"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/oz/oz.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/oz/oz.js new file mode 100644 index 0000000000..73857e4c7e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/oz/oz.js @@ -0,0 +1,252 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("oz", function (conf) { + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var singleOperators = /[\^@!\|<>#~\.\*\-\+\\/,=]/; + var doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\=)|(\\=:)|(!!)|(==)|(::)/; + var tripleOperators = /(:::)|(\.\.\.)|(=<:)|(>=:)/; + + var middle = ["in", "then", "else", "of", "elseof", "elsecase", "elseif", "catch", + "finally", "with", "require", "prepare", "import", "export", "define", "do"]; + var end = ["end"]; + + var atoms = wordRegexp(["true", "false", "nil", "unit"]); + var commonKeywords = wordRegexp(["andthen", "at", "attr", "declare", "feat", "from", "lex", + "mod", "div", "mode", "orelse", "parser", "prod", "prop", "scanner", "self", "syn", "token"]); + var openingKeywords = wordRegexp(["local", "proc", "fun", "case", "class", "if", "cond", "or", "dis", + "choice", "not", "thread", "try", "raise", "lock", "for", "suchthat", "meth", "functor"]); + var middleKeywords = wordRegexp(middle); + var endKeywords = wordRegexp(end); + + // Tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return null; + } + + // Brackets + if(stream.match(/[{}]/)) { + return "bracket"; + } + + // Special [] keyword + if (stream.match('[]')) { + return "keyword" + } + + // Operators + if (stream.match(tripleOperators) || stream.match(doubleOperators)) { + return "operator"; + } + + // Atoms + if(stream.match(atoms)) { + return 'atom'; + } + + // Opening keywords + var matched = stream.match(openingKeywords); + if (matched) { + if (!state.doInCurrentLine) + state.currentIndent++; + else + state.doInCurrentLine = false; + + // Special matching for signatures + if(matched[0] == "proc" || matched[0] == "fun") + state.tokenize = tokenFunProc; + else if(matched[0] == "class") + state.tokenize = tokenClass; + else if(matched[0] == "meth") + state.tokenize = tokenMeth; + + return 'keyword'; + } + + // Middle and other keywords + if (stream.match(middleKeywords) || stream.match(commonKeywords)) { + return "keyword" + } + + // End keywords + if (stream.match(endKeywords)) { + state.currentIndent--; + return 'keyword'; + } + + // Eat the next char for next comparisons + var ch = stream.next(); + + // Strings + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + + // Numbers + if (/[~\d]/.test(ch)) { + if (ch == "~") { + if(! /^[0-9]/.test(stream.peek())) + return null; + else if (( stream.next() == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) + return "number"; + } + + if ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) + return "number"; + + return null; + } + + // Comments + if (ch == "%") { + stream.skipToEnd(); + return 'comment'; + } + else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + } + + // Single operators + if(singleOperators.test(ch)) { + return "operator"; + } + + // If nothing match, we skip the entire alphanumeric block + stream.eatWhile(/\w/); + + return "variable"; + } + + function tokenClass(stream, state) { + if (stream.eatSpace()) { + return null; + } + stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/); + state.tokenize = tokenBase; + return "variable-3" + } + + function tokenMeth(stream, state) { + if (stream.eatSpace()) { + return null; + } + stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/); + state.tokenize = tokenBase; + return "def" + } + + function tokenFunProc(stream, state) { + if (stream.eatSpace()) { + return null; + } + + if(!state.hasPassedFirstStage && stream.eat("{")) { + state.hasPassedFirstStage = true; + return "bracket"; + } + else if(state.hasPassedFirstStage) { + stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\$/); + state.hasPassedFirstStage = false; + state.tokenize = tokenBase; + return "def" + } + else { + state.tokenize = tokenBase; + return null; + } + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(quote) { + return function (stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !escaped) + state.tokenize = tokenBase; + return "string"; + }; + } + + function buildElectricInputRegEx() { + // Reindentation should occur on [] or on a match of any of + // the block closing keywords, at the end of a line. + var allClosings = middle.concat(end); + return new RegExp("[\\[\\]]|(" + allClosings.join("|") + ")$"); + } + + return { + + startState: function () { + return { + tokenize: tokenBase, + currentIndent: 0, + doInCurrentLine: false, + hasPassedFirstStage: false + }; + }, + + token: function (stream, state) { + if (stream.sol()) + state.doInCurrentLine = 0; + + return state.tokenize(stream, state); + }, + + indent: function (state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, ''); + + if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\[])/)) + return conf.indentUnit * (state.currentIndent - 1); + + if (state.currentIndent < 0) + return 0; + + return state.currentIndent * conf.indentUnit; + }, + fold: "indent", + electricInput: buildElectricInputRegEx(), + lineComment: "%", + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; +}); + +CodeMirror.defineMIME("text/x-oz", "oz"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pascal/pascal.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pascal/pascal.js new file mode 100644 index 0000000000..c48698bd70 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pascal/pascal.js @@ -0,0 +1,136 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pascal", function() { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = words( + "absolute and array asm begin case const constructor destructor div do " + + "downto else end file for function goto if implementation in inherited " + + "inline interface label mod nil not object of operator or packed procedure " + + "program record reintroduce repeat self set shl shr string then to type " + + "unit until uses var while with xor as class dispinterface except exports " + + "finalization finally initialization inline is library on out packed " + + "property raise resourcestring threadvar try absolute abstract alias " + + "assembler bitpacked break cdecl continue cppdecl cvar default deprecated " + + "dynamic enumerator experimental export external far far16 forward generic " + + "helper implements index interrupt iocheck local message name near " + + "nodefault noreturn nostackframe oldfpccall otherwise overload override " + + "pascal platform private protected public published read register " + + "reintroduce result safecall saveregisters softfloat specialize static " + + "stdcall stored strict unaligned unimplemented varargs virtual write"); + var atoms = {"null": true}; + + var isOperatorChar = /[+\-*&%=<>!?|\/]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == "#" && state.startOfLine) { + stream.skipToEnd(); + return "meta"; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (ch == "(" && stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (ch == "{") { + state.tokenize = tokenCommentBraces; + return tokenCommentBraces(stream, state); + } + if (/[\[\]\(\),;\:\.]/.test(ch)) { + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (atoms.propertyIsEnumerable(cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !escaped) state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == ")" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenCommentBraces(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "}") { + state.tokenize = null; + break; + } + } + return "comment"; + } + + // Interface + + return { + startState: function() { + return {tokenize: null}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + return style; + }, + + electricChars: "{}" + }; +}); + +CodeMirror.defineMIME("text/x-pascal", "pascal"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pegjs/pegjs.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pegjs/pegjs.js new file mode 100644 index 0000000000..ac011d3c8f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pegjs/pegjs.js @@ -0,0 +1,114 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../javascript/javascript")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../javascript/javascript"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pegjs", function (config) { + var jsMode = CodeMirror.getMode(config, "javascript"); + + function identifier(stream) { + return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); + } + + return { + startState: function () { + return { + inString: false, + stringType: null, + inComment: false, + inCharacterClass: false, + braced: 0, + lhs: true, + localState: null + }; + }, + token: function (stream, state) { + if (stream) + + //check for state changes + if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.inString = true; // Update state + } + if (!state.inString && !state.inComment && stream.match('/*')) { + state.inComment = true; + } + + //return state + if (state.inString) { + while (state.inString && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.inString = false; // Clear flag + } else if (stream.peek() === '\\') { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + } else if (state.inComment) { + while (state.inComment && !stream.eol()) { + if (stream.match('*/')) { + state.inComment = false; // Clear flag + } else { + stream.match(/^.[^\*]*/); + } + } + return "comment"; + } else if (state.inCharacterClass) { + while (state.inCharacterClass && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { + state.inCharacterClass = false; + } + } + } else if (stream.peek() === '[') { + stream.next(); + state.inCharacterClass = true; + return 'bracket'; + } else if (stream.match('//')) { + stream.skipToEnd(); + return "comment"; + } else if (state.braced || stream.peek() === '{') { + if (state.localState === null) { + state.localState = CodeMirror.startState(jsMode); + } + var token = jsMode.token(stream, state.localState); + var text = stream.current(); + if (!token) { + for (var i = 0; i < text.length; i++) { + if (text[i] === '{') { + state.braced++; + } else if (text[i] === '}') { + state.braced--; + } + }; + } + return token; + } else if (identifier(stream)) { + if (stream.peek() === ':') { + return 'variable'; + } + return 'variable-2'; + } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { + stream.next(); + return 'bracket'; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; +}, "javascript"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/perl/perl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/perl/perl.js new file mode 100644 index 0000000000..41e7bc731c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/perl/perl.js @@ -0,0 +1,836 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08) +// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com) + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("perl",function(){ + // http://perldoc.perl.org + var PERL={ // null - magic touch + // 1 - keyword + // 2 - def + // 3 - atom + // 4 - operator + // 5 - variable-2 (predefined) + // [x,y] - x=1,2,3; y=must be defined if x{...} + // PERL operators + '->' : 4, + '++' : 4, + '--' : 4, + '**' : 4, + // ! ~ \ and unary + and - + '=~' : 4, + '!~' : 4, + '*' : 4, + '/' : 4, + '%' : 4, + 'x' : 4, + '+' : 4, + '-' : 4, + '.' : 4, + '<<' : 4, + '>>' : 4, + // named unary operators + '<' : 4, + '>' : 4, + '<=' : 4, + '>=' : 4, + 'lt' : 4, + 'gt' : 4, + 'le' : 4, + 'ge' : 4, + '==' : 4, + '!=' : 4, + '<=>' : 4, + 'eq' : 4, + 'ne' : 4, + 'cmp' : 4, + '~~' : 4, + '&' : 4, + '|' : 4, + '^' : 4, + '&&' : 4, + '||' : 4, + '//' : 4, + '..' : 4, + '...' : 4, + '?' : 4, + ':' : 4, + '=' : 4, + '+=' : 4, + '-=' : 4, + '*=' : 4, // etc. ??? + ',' : 4, + '=>' : 4, + '::' : 4, + // list operators (rightward) + 'not' : 4, + 'and' : 4, + 'or' : 4, + 'xor' : 4, + // PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;) + 'BEGIN' : [5,1], + 'END' : [5,1], + 'PRINT' : [5,1], + 'PRINTF' : [5,1], + 'GETC' : [5,1], + 'READ' : [5,1], + 'READLINE' : [5,1], + 'DESTROY' : [5,1], + 'TIE' : [5,1], + 'TIEHANDLE' : [5,1], + 'UNTIE' : [5,1], + 'STDIN' : 5, + 'STDIN_TOP' : 5, + 'STDOUT' : 5, + 'STDOUT_TOP' : 5, + 'STDERR' : 5, + 'STDERR_TOP' : 5, + '$ARG' : 5, + '$_' : 5, + '@ARG' : 5, + '@_' : 5, + '$LIST_SEPARATOR' : 5, + '$"' : 5, + '$PROCESS_ID' : 5, + '$PID' : 5, + '$$' : 5, + '$REAL_GROUP_ID' : 5, + '$GID' : 5, + '$(' : 5, + '$EFFECTIVE_GROUP_ID' : 5, + '$EGID' : 5, + '$)' : 5, + '$PROGRAM_NAME' : 5, + '$0' : 5, + '$SUBSCRIPT_SEPARATOR' : 5, + '$SUBSEP' : 5, + '$;' : 5, + '$REAL_USER_ID' : 5, + '$UID' : 5, + '$<' : 5, + '$EFFECTIVE_USER_ID' : 5, + '$EUID' : 5, + '$>' : 5, + '$a' : 5, + '$b' : 5, + '$COMPILING' : 5, + '$^C' : 5, + '$DEBUGGING' : 5, + '$^D' : 5, + '${^ENCODING}' : 5, + '$ENV' : 5, + '%ENV' : 5, + '$SYSTEM_FD_MAX' : 5, + '$^F' : 5, + '@F' : 5, + '${^GLOBAL_PHASE}' : 5, + '$^H' : 5, + '%^H' : 5, + '@INC' : 5, + '%INC' : 5, + '$INPLACE_EDIT' : 5, + '$^I' : 5, + '$^M' : 5, + '$OSNAME' : 5, + '$^O' : 5, + '${^OPEN}' : 5, + '$PERLDB' : 5, + '$^P' : 5, + '$SIG' : 5, + '%SIG' : 5, + '$BASETIME' : 5, + '$^T' : 5, + '${^TAINT}' : 5, + '${^UNICODE}' : 5, + '${^UTF8CACHE}' : 5, + '${^UTF8LOCALE}' : 5, + '$PERL_VERSION' : 5, + '$^V' : 5, + '${^WIN32_SLOPPY_STAT}' : 5, + '$EXECUTABLE_NAME' : 5, + '$^X' : 5, + '$1' : 5, // - regexp $1, $2... + '$MATCH' : 5, + '$&' : 5, + '${^MATCH}' : 5, + '$PREMATCH' : 5, + '$`' : 5, + '${^PREMATCH}' : 5, + '$POSTMATCH' : 5, + "$'" : 5, + '${^POSTMATCH}' : 5, + '$LAST_PAREN_MATCH' : 5, + '$+' : 5, + '$LAST_SUBMATCH_RESULT' : 5, + '$^N' : 5, + '@LAST_MATCH_END' : 5, + '@+' : 5, + '%LAST_PAREN_MATCH' : 5, + '%+' : 5, + '@LAST_MATCH_START' : 5, + '@-' : 5, + '%LAST_MATCH_START' : 5, + '%-' : 5, + '$LAST_REGEXP_CODE_RESULT' : 5, + '$^R' : 5, + '${^RE_DEBUG_FLAGS}' : 5, + '${^RE_TRIE_MAXBUF}' : 5, + '$ARGV' : 5, + '@ARGV' : 5, + 'ARGV' : 5, + 'ARGVOUT' : 5, + '$OUTPUT_FIELD_SEPARATOR' : 5, + '$OFS' : 5, + '$,' : 5, + '$INPUT_LINE_NUMBER' : 5, + '$NR' : 5, + '$.' : 5, + '$INPUT_RECORD_SEPARATOR' : 5, + '$RS' : 5, + '$/' : 5, + '$OUTPUT_RECORD_SEPARATOR' : 5, + '$ORS' : 5, + '$\\' : 5, + '$OUTPUT_AUTOFLUSH' : 5, + '$|' : 5, + '$ACCUMULATOR' : 5, + '$^A' : 5, + '$FORMAT_FORMFEED' : 5, + '$^L' : 5, + '$FORMAT_PAGE_NUMBER' : 5, + '$%' : 5, + '$FORMAT_LINES_LEFT' : 5, + '$-' : 5, + '$FORMAT_LINE_BREAK_CHARACTERS' : 5, + '$:' : 5, + '$FORMAT_LINES_PER_PAGE' : 5, + '$=' : 5, + '$FORMAT_TOP_NAME' : 5, + '$^' : 5, + '$FORMAT_NAME' : 5, + '$~' : 5, + '${^CHILD_ERROR_NATIVE}' : 5, + '$EXTENDED_OS_ERROR' : 5, + '$^E' : 5, + '$EXCEPTIONS_BEING_CAUGHT' : 5, + '$^S' : 5, + '$WARNING' : 5, + '$^W' : 5, + '${^WARNING_BITS}' : 5, + '$OS_ERROR' : 5, + '$ERRNO' : 5, + '$!' : 5, + '%OS_ERROR' : 5, + '%ERRNO' : 5, + '%!' : 5, + '$CHILD_ERROR' : 5, + '$?' : 5, + '$EVAL_ERROR' : 5, + '$@' : 5, + '$OFMT' : 5, + '$#' : 5, + '$*' : 5, + '$ARRAY_BASE' : 5, + '$[' : 5, + '$OLD_PERL_VERSION' : 5, + '$]' : 5, + // PERL blocks + 'if' :[1,1], + elsif :[1,1], + 'else' :[1,1], + 'while' :[1,1], + unless :[1,1], + 'for' :[1,1], + foreach :[1,1], + // PERL functions + 'abs' :1, // - absolute value function + accept :1, // - accept an incoming socket connect + alarm :1, // - schedule a SIGALRM + 'atan2' :1, // - arctangent of Y/X in the range -PI to PI + bind :1, // - binds an address to a socket + binmode :1, // - prepare binary files for I/O + bless :1, // - create an object + bootstrap :1, // + 'break' :1, // - break out of a "given" block + caller :1, // - get context of the current subroutine call + chdir :1, // - change your current working directory + chmod :1, // - changes the permissions on a list of files + chomp :1, // - remove a trailing record separator from a string + chop :1, // - remove the last character from a string + chown :1, // - change the ownership on a list of files + chr :1, // - get character this number represents + chroot :1, // - make directory new root for path lookups + close :1, // - close file (or pipe or socket) handle + closedir :1, // - close directory handle + connect :1, // - connect to a remote socket + 'continue' :[1,1], // - optional trailing block in a while or foreach + 'cos' :1, // - cosine function + crypt :1, // - one-way passwd-style encryption + dbmclose :1, // - breaks binding on a tied dbm file + dbmopen :1, // - create binding on a tied dbm file + 'default' :1, // + defined :1, // - test whether a value, variable, or function is defined + 'delete' :1, // - deletes a value from a hash + die :1, // - raise an exception or bail out + 'do' :1, // - turn a BLOCK into a TERM + dump :1, // - create an immediate core dump + each :1, // - retrieve the next key/value pair from a hash + endgrent :1, // - be done using group file + endhostent :1, // - be done using hosts file + endnetent :1, // - be done using networks file + endprotoent :1, // - be done using protocols file + endpwent :1, // - be done using passwd file + endservent :1, // - be done using services file + eof :1, // - test a filehandle for its end + 'eval' :1, // - catch exceptions or compile and run code + 'exec' :1, // - abandon this program to run another + exists :1, // - test whether a hash key is present + exit :1, // - terminate this program + 'exp' :1, // - raise I to a power + fcntl :1, // - file control system call + fileno :1, // - return file descriptor from filehandle + flock :1, // - lock an entire file with an advisory lock + fork :1, // - create a new process just like this one + format :1, // - declare a picture format with use by the write() function + formline :1, // - internal function used for formats + getc :1, // - get the next character from the filehandle + getgrent :1, // - get next group record + getgrgid :1, // - get group record given group user ID + getgrnam :1, // - get group record given group name + gethostbyaddr :1, // - get host record given its address + gethostbyname :1, // - get host record given name + gethostent :1, // - get next hosts record + getlogin :1, // - return who logged in at this tty + getnetbyaddr :1, // - get network record given its address + getnetbyname :1, // - get networks record given name + getnetent :1, // - get next networks record + getpeername :1, // - find the other end of a socket connection + getpgrp :1, // - get process group + getppid :1, // - get parent process ID + getpriority :1, // - get current nice value + getprotobyname :1, // - get protocol record given name + getprotobynumber :1, // - get protocol record numeric protocol + getprotoent :1, // - get next protocols record + getpwent :1, // - get next passwd record + getpwnam :1, // - get passwd record given user login name + getpwuid :1, // - get passwd record given user ID + getservbyname :1, // - get services record given its name + getservbyport :1, // - get services record given numeric port + getservent :1, // - get next services record + getsockname :1, // - retrieve the sockaddr for a given socket + getsockopt :1, // - get socket options on a given socket + given :1, // + glob :1, // - expand filenames using wildcards + gmtime :1, // - convert UNIX time into record or string using Greenwich time + 'goto' :1, // - create spaghetti code + grep :1, // - locate elements in a list test true against a given criterion + hex :1, // - convert a string to a hexadecimal number + 'import' :1, // - patch a module's namespace into your own + index :1, // - find a substring within a string + 'int' :1, // - get the integer portion of a number + ioctl :1, // - system-dependent device control system call + 'join' :1, // - join a list into a string using a separator + keys :1, // - retrieve list of indices from a hash + kill :1, // - send a signal to a process or process group + last :1, // - exit a block prematurely + lc :1, // - return lower-case version of a string + lcfirst :1, // - return a string with just the next letter in lower case + length :1, // - return the number of bytes in a string + 'link' :1, // - create a hard link in the filesystem + listen :1, // - register your socket as a server + local : 2, // - create a temporary value for a global variable (dynamic scoping) + localtime :1, // - convert UNIX time into record or string using local time + lock :1, // - get a thread lock on a variable, subroutine, or method + 'log' :1, // - retrieve the natural logarithm for a number + lstat :1, // - stat a symbolic link + m :null, // - match a string with a regular expression pattern + map :1, // - apply a change to a list to get back a new list with the changes + mkdir :1, // - create a directory + msgctl :1, // - SysV IPC message control operations + msgget :1, // - get SysV IPC message queue + msgrcv :1, // - receive a SysV IPC message from a message queue + msgsnd :1, // - send a SysV IPC message to a message queue + my : 2, // - declare and assign a local variable (lexical scoping) + 'new' :1, // + next :1, // - iterate a block prematurely + no :1, // - unimport some module symbols or semantics at compile time + oct :1, // - convert a string to an octal number + open :1, // - open a file, pipe, or descriptor + opendir :1, // - open a directory + ord :1, // - find a character's numeric representation + our : 2, // - declare and assign a package variable (lexical scoping) + pack :1, // - convert a list into a binary representation + 'package' :1, // - declare a separate global namespace + pipe :1, // - open a pair of connected filehandles + pop :1, // - remove the last element from an array and return it + pos :1, // - find or set the offset for the last/next m//g search + print :1, // - output a list to a filehandle + printf :1, // - output a formatted list to a filehandle + prototype :1, // - get the prototype (if any) of a subroutine + push :1, // - append one or more elements to an array + q :null, // - singly quote a string + qq :null, // - doubly quote a string + qr :null, // - Compile pattern + quotemeta :null, // - quote regular expression magic characters + qw :null, // - quote a list of words + qx :null, // - backquote quote a string + rand :1, // - retrieve the next pseudorandom number + read :1, // - fixed-length buffered input from a filehandle + readdir :1, // - get a directory from a directory handle + readline :1, // - fetch a record from a file + readlink :1, // - determine where a symbolic link is pointing + readpipe :1, // - execute a system command and collect standard output + recv :1, // - receive a message over a Socket + redo :1, // - start this loop iteration over again + ref :1, // - find out the type of thing being referenced + rename :1, // - change a filename + require :1, // - load in external functions from a library at runtime + reset :1, // - clear all variables of a given name + 'return' :1, // - get out of a function early + reverse :1, // - flip a string or a list + rewinddir :1, // - reset directory handle + rindex :1, // - right-to-left substring search + rmdir :1, // - remove a directory + s :null, // - replace a pattern with a string + say :1, // - print with newline + scalar :1, // - force a scalar context + seek :1, // - reposition file pointer for random-access I/O + seekdir :1, // - reposition directory pointer + select :1, // - reset default output or do I/O multiplexing + semctl :1, // - SysV semaphore control operations + semget :1, // - get set of SysV semaphores + semop :1, // - SysV semaphore operations + send :1, // - send a message over a socket + setgrent :1, // - prepare group file for use + sethostent :1, // - prepare hosts file for use + setnetent :1, // - prepare networks file for use + setpgrp :1, // - set the process group of a process + setpriority :1, // - set a process's nice value + setprotoent :1, // - prepare protocols file for use + setpwent :1, // - prepare passwd file for use + setservent :1, // - prepare services file for use + setsockopt :1, // - set some socket options + shift :1, // - remove the first element of an array, and return it + shmctl :1, // - SysV shared memory operations + shmget :1, // - get SysV shared memory segment identifier + shmread :1, // - read SysV shared memory + shmwrite :1, // - write SysV shared memory + shutdown :1, // - close down just half of a socket connection + 'sin' :1, // - return the sine of a number + sleep :1, // - block for some number of seconds + socket :1, // - create a socket + socketpair :1, // - create a pair of sockets + 'sort' :1, // - sort a list of values + splice :1, // - add or remove elements anywhere in an array + 'split' :1, // - split up a string using a regexp delimiter + sprintf :1, // - formatted print into a string + 'sqrt' :1, // - square root function + srand :1, // - seed the random number generator + stat :1, // - get a file's status information + state :1, // - declare and assign a state variable (persistent lexical scoping) + study :1, // - optimize input data for repeated searches + 'sub' :1, // - declare a subroutine, possibly anonymously + 'substr' :1, // - get or alter a portion of a string + symlink :1, // - create a symbolic link to a file + syscall :1, // - execute an arbitrary system call + sysopen :1, // - open a file, pipe, or descriptor + sysread :1, // - fixed-length unbuffered input from a filehandle + sysseek :1, // - position I/O pointer on handle used with sysread and syswrite + system :1, // - run a separate program + syswrite :1, // - fixed-length unbuffered output to a filehandle + tell :1, // - get current seekpointer on a filehandle + telldir :1, // - get current seekpointer on a directory handle + tie :1, // - bind a variable to an object class + tied :1, // - get a reference to the object underlying a tied variable + time :1, // - return number of seconds since 1970 + times :1, // - return elapsed time for self and child processes + tr :null, // - transliterate a string + truncate :1, // - shorten a file + uc :1, // - return upper-case version of a string + ucfirst :1, // - return a string with just the next letter in upper case + umask :1, // - set file creation mode mask + undef :1, // - remove a variable or function definition + unlink :1, // - remove one link to a file + unpack :1, // - convert binary structure into normal perl variables + unshift :1, // - prepend more elements to the beginning of a list + untie :1, // - break a tie binding to a variable + use :1, // - load in a module at compile time + utime :1, // - set a file's last access and modify times + values :1, // - return a list of the values in a hash + vec :1, // - test or set particular bits in a string + wait :1, // - wait for any child process to die + waitpid :1, // - wait for a particular child process to die + wantarray :1, // - get void vs scalar vs list context of current subroutine call + warn :1, // - print debugging info + when :1, // + write :1, // - print a picture record + y :null}; // - transliterate a string + + var RXstyle="string-2"; + var RXmodifiers=/[goseximacplud]/; // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type + + function tokenChain(stream,state,chain,style,tail){ // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;) + state.chain=null; // 12 3tail + state.style=null; + state.tail=null; + state.tokenize=function(stream,state){ + var e=false,c,i=0; + while(c=stream.next()){ + if(c===chain[i]&&!e){ + if(chain[++i]!==undefined){ + state.chain=chain[i]; + state.style=style; + state.tail=tail;} + else if(tail) + stream.eatWhile(tail); + state.tokenize=tokenPerl; + return style;} + e=!e&&c=="\\";} + return style;}; + return state.tokenize(stream,state);} + + function tokenSOMETHING(stream,state,string){ + state.tokenize=function(stream,state){ + if(stream.string==string) + state.tokenize=tokenPerl; + stream.skipToEnd(); + return "string";}; + return state.tokenize(stream,state);} + + function tokenPerl(stream,state){ + if(stream.eatSpace()) + return null; + if(state.chain) + return tokenChain(stream,state,state.chain,state.style,state.tail); + if(stream.match(/^(\-?((\d[\d_]*)?\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F_]+|0b[01_]+|\d[\d_]*(e[+-]?\d+)?)/)) + return 'number'; + if(stream.match(/^<<(?=[_a-zA-Z])/)){ // NOTE: <"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(c=="q"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"string");}} + else if(c=="w"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"bracket");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"bracket");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"bracket");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"bracket");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"bracket");}} + else if(c=="r"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(/[\^'"!~\/(\[{<]/.test(c)){ + if(c=="("){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[stream.eat(c)],"string");}}}} + if(ch=="m"){ + var c=look(stream, -2); + if(!(c&&/\w/.test(c))){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[c],RXstyle,RXmodifiers);} + if(c=="("){ + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}} + if(ch=="s"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="y"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="t"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat("r");if(c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}} + if(ch=="`"){ + return tokenChain(stream,state,[ch],"variable-2");} + if(ch=="/"){ + if(!/~\s*$/.test(prefix(stream))) + return "operator"; + else + return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);} + if(ch=="$"){ + var p=stream.pos; + if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}")) + return "variable-2"; + else + stream.pos=p;} + if(/[$@%]/.test(ch)){ + var p=stream.pos; + if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){ + var c=stream.current(); + if(PERL[c]) + return "variable-2";} + stream.pos=p;} + if(/[$@%&]/.test(ch)){ + if(stream.eatWhile(/[\w$]/)||stream.eat("{")&&stream.eatWhile(/[\w$]/)&&stream.eat("}")){ + var c=stream.current(); + if(PERL[c]) + return "variable-2"; + else + return "variable";}} + if(ch=="#"){ + if(look(stream, -2)!="$"){ + stream.skipToEnd(); + return "comment";}} + if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){ + var p=stream.pos; + stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/); + if(PERL[stream.current()]) + return "operator"; + else + stream.pos=p;} + if(ch=="_"){ + if(stream.pos==1){ + if(suffix(stream, 6)=="_END__"){ + return tokenChain(stream,state,['\0'],"comment");} + else if(suffix(stream, 7)=="_DATA__"){ + return tokenChain(stream,state,['\0'],"variable-2");} + else if(suffix(stream, 7)=="_C__"){ + return tokenChain(stream,state,['\0'],"string");}}} + if(/\w/.test(ch)){ + var p=stream.pos; + if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}")) + return "string"; + else + stream.pos=p;} + if(/[A-Z]/.test(ch)){ + var l=look(stream, -2); + var p=stream.pos; + stream.eatWhile(/[A-Z_]/); + if(/[\da-z]/.test(look(stream, 0))){ + stream.pos=p;} + else{ + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";}} + if(/[a-zA-Z_]/.test(ch)){ + var l=look(stream, -2); + stream.eatWhile(/\w/); + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";} + return null;} + + return { + startState: function() { + return { + tokenize: tokenPerl, + chain: null, + style: null, + tail: null + }; + }, + token: function(stream, state) { + return (state.tokenize || tokenPerl)(stream, state); + }, + lineComment: '#' + }; +}); + +CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); + +CodeMirror.defineMIME("text/x-perl", "perl"); + +// it's like "peek", but need for look-ahead or look-behind if index < 0 +function look(stream, c){ + return stream.string.charAt(stream.pos+(c||0)); +} + +// return a part of prefix of current stream from current position +function prefix(stream, c){ + if(c){ + var x=stream.pos-c; + return stream.string.substr((x>=0?x:0),c);} + else{ + return stream.string.substr(0,stream.pos-1); + } +} + +// return a part of suffix of current stream from current position +function suffix(stream, c){ + var y=stream.string.length; + var x=y-stream.pos+1; + return stream.string.substr(stream.pos,(c&&c=(y=stream.string.length-1)) + stream.pos=y; + else + stream.pos=x; +} + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/php/php.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/php/php.js new file mode 100644 index 0000000000..127b4a2382 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/php/php.js @@ -0,0 +1,234 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../clike/clike")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // Helper for phpString + function matchSequence(list, end, escapes) { + if (list.length == 0) return phpString(end); + return function (stream, state) { + var patterns = list[0]; + for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { + state.tokenize = matchSequence(list.slice(1), end); + return patterns[i][1]; + } + state.tokenize = phpString(end, escapes); + return "string"; + }; + } + function phpString(closing, escapes) { + return function(stream, state) { return phpString_(stream, state, closing, escapes); }; + } + function phpString_(stream, state, closing, escapes) { + // "Complex" syntax + if (escapes !== false && stream.match("${", false) || stream.match("{$", false)) { + state.tokenize = null; + return "string"; + } + + // Simple syntax + if (escapes !== false && stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) { + // After the variable name there may appear array or object operator. + if (stream.match("[", false)) { + // Match array operator + state.tokenize = matchSequence([ + [["[", null]], + [[/\d[\w\.]*/, "number"], + [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], + [/[\w\$]+/, "variable"]], + [["]", null]] + ], closing, escapes); + } + if (stream.match(/^->\w/, false)) { + // Match object operator + state.tokenize = matchSequence([ + [["->", null]], + [[/[\w]+/, "variable"]] + ], closing, escapes); + } + return "variable-2"; + } + + var escaped = false; + // Normal string + while (!stream.eol() && + (escaped || escapes === false || + (!stream.match("{$", false) && + !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) { + if (!escaped && stream.match(closing)) { + state.tokenize = null; + state.tokStack.pop(); state.tokStack.pop(); + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + var phpKeywords = "abstract and array as break case catch class clone const continue declare default " + + "do else elseif enddeclare endfor endforeach endif endswitch endwhile enum extends final " + + "for foreach function global goto if implements interface instanceof namespace " + + "new or private protected public static switch throw trait try use var while xor " + + "die echo empty exit eval include include_once isset list require require_once return " + + "print unset __halt_compiler self static parent yield insteadof finally readonly match"; + var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"; + var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count"; + CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" ")); + CodeMirror.registerHelper("wordChars", "php", /[\w$]/); + + var phpConfig = { + name: "clike", + helperType: "php", + keywords: keywords(phpKeywords), + blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"), + defKeywords: keywords("class enum function interface namespace trait"), + atoms: keywords(phpAtoms), + builtin: keywords(phpBuiltin), + multiLineStrings: true, + hooks: { + "$": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "variable-2"; + }, + "<": function(stream, state) { + var before; + if (before = stream.match(/^<<\s*/)) { + var quoted = stream.eat(/['"]/); + stream.eatWhile(/[\w\.]/); + var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1)); + if (quoted) stream.eat(quoted); + if (delim) { + (state.tokStack || (state.tokStack = [])).push(delim, 0); + state.tokenize = phpString(delim, quoted != "'"); + return "string"; + } + } + return false; + }, + "#": function(stream) { + while (!stream.eol() && !stream.match("?>", false)) stream.next(); + return "comment"; + }, + "/": function(stream) { + if (stream.eat("/")) { + while (!stream.eol() && !stream.match("?>", false)) stream.next(); + return "comment"; + } + return false; + }, + '"': function(_stream, state) { + (state.tokStack || (state.tokStack = [])).push('"', 0); + state.tokenize = phpString('"'); + return "string"; + }, + "{": function(_stream, state) { + if (state.tokStack && state.tokStack.length) + state.tokStack[state.tokStack.length - 1]++; + return false; + }, + "}": function(_stream, state) { + if (state.tokStack && state.tokStack.length > 0 && + !--state.tokStack[state.tokStack.length - 1]) { + state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]); + } + return false; + } + } + }; + + CodeMirror.defineMode("php", function(config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || "text/html"); + var phpMode = CodeMirror.getMode(config, phpConfig); + + function dispatch(stream, state) { + var isPHP = state.curMode == phpMode; + if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null; + if (!isPHP) { + if (stream.match(/^<\?\w*/)) { + state.curMode = phpMode; + if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, "", "")) + state.curState = state.php; + return "meta"; + } + if (state.pending == '"' || state.pending == "'") { + while (!stream.eol() && stream.next() != state.pending) {} + var style = "string"; + } else if (state.pending && stream.pos < state.pending.end) { + stream.pos = state.pending.end; + var style = state.pending.style; + } else { + var style = htmlMode.token(stream, state.curState); + } + if (state.pending) state.pending = null; + var cur = stream.current(), openPHP = cur.search(/<\?/), m; + if (openPHP != -1) { + if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0]; + else state.pending = {end: stream.pos, style: style}; + stream.backUp(cur.length - openPHP); + } + return style; + } else if (isPHP && state.php.tokenize == null && stream.match("?>")) { + state.curMode = htmlMode; + state.curState = state.html; + if (!state.php.context.prev) state.php = null; + return "meta"; + } else { + return phpMode.token(stream, state.curState); + } + } + + return { + startState: function() { + var html = CodeMirror.startState(htmlMode) + var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null + return {html: html, + php: php, + curMode: parserConfig.startOpen ? phpMode : htmlMode, + curState: parserConfig.startOpen ? php : html, + pending: null}; + }, + + copyState: function(state) { + var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), + php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur; + if (state.curMode == htmlMode) cur = htmlNew; + else cur = phpNew; + return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, + pending: state.pending}; + }, + + token: dispatch, + + indent: function(state, textAfter, line) { + if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || + (state.curMode == phpMode && /^\?>/.test(textAfter))) + return htmlMode.indent(state.html, textAfter, line); + return state.curMode.indent(state.curState, textAfter, line); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + + innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } + }; + }, "htmlmixed", "clike"); + + CodeMirror.defineMIME("application/x-httpd-php", "php"); + CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); + CodeMirror.defineMIME("text/x-php", phpConfig); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pig/pig.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pig/pig.js new file mode 100644 index 0000000000..3b9c7746bb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pig/pig.js @@ -0,0 +1,178 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + * Pig Latin Mode for CodeMirror 2 + * @author Prasanth Jayachandran + * @link https://github.com/prasanthj/pig-codemirror-2 + * This implementation is adapted from PL/SQL mode in CodeMirror 2. + */ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pig", function(_config, parserConfig) { + var keywords = parserConfig.keywords, + builtins = parserConfig.builtins, + types = parserConfig.types, + multiLineStrings = parserConfig.multiLineStrings; + + var isOperatorChar = /[*+\-%<>=&?:\/!|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function tokenComment(stream, state) { + var isEnd = false; + var ch; + while(ch = stream.next()) { + if(ch == "/" && isEnd) { + state.tokenize = tokenBase; + break; + } + isEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = tokenBase; + return "error"; + }; + } + + + function tokenBase(stream, state) { + var ch = stream.next(); + + // is a start of string? + if (ch == '"' || ch == "'") + return chain(stream, state, tokenString(ch)); + // is it one of the special chars + else if(/[\[\]{}\(\),;\.]/.test(ch)) + return null; + // is it a number? + else if(/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + // multi line comment or operator + else if (ch == "/") { + if (stream.eat("*")) { + return chain(stream, state, tokenComment); + } + else { + stream.eatWhile(isOperatorChar); + return "operator"; + } + } + // single line comment or operator + else if (ch=="-") { + if(stream.eat("-")){ + stream.skipToEnd(); + return "comment"; + } + else { + stream.eatWhile(isOperatorChar); + return "operator"; + } + } + // is it an operator + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + // get the while word + stream.eatWhile(/[\w\$_]/); + // is it one of the listed keywords? + if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { + //keywords can be used as variables like flatten(group), group.$0 etc.. + if (!stream.eat(")") && !stream.eat(".")) + return "keyword"; + } + // is it one of the builtin functions? + if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) + return "variable-2"; + // is it one of the listed types? + if (types && types.propertyIsEnumerable(stream.current().toUpperCase())) + return "variable-3"; + // default is a 'variable' + return "variable"; + } + } + + // Interface + return { + startState: function() { + return { + tokenize: tokenBase, + startOfLine: true + }; + }, + + token: function(stream, state) { + if(stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + } + }; +}); + +(function() { + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // builtin funcs taken from trunk revision 1303237 + var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " + + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " + + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " + + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " + + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " + + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " + + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " + + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " + + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " + + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; + + // taken from QueryLexer.g + var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " + + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " + + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " + + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " + + "NEQ MATCHES TRUE FALSE DUMP"; + + // data types + var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "; + + CodeMirror.defineMIME("text/x-pig", { + name: "pig", + builtins: keywords(pBuiltins), + keywords: keywords(pKeywords), + types: keywords(pTypes) + }); + + CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" ")); +}()); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/powershell/powershell.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/powershell/powershell.js new file mode 100644 index 0000000000..4869ae7370 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/powershell/powershell.js @@ -0,0 +1,398 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + 'use strict'; + if (typeof exports == 'object' && typeof module == 'object') // CommonJS + mod(require('../../lib/codemirror')); + else if (typeof define == 'function' && define.amd) // AMD + define(['../../lib/codemirror'], mod); + else // Plain browser env + mod(window.CodeMirror); +})(function(CodeMirror) { +'use strict'; + +CodeMirror.defineMode('powershell', function() { + function buildRegexp(patterns, options) { + options = options || {}; + var prefix = options.prefix !== undefined ? options.prefix : '^'; + var suffix = options.suffix !== undefined ? options.suffix : '\\b'; + + for (var i = 0; i < patterns.length; i++) { + if (patterns[i] instanceof RegExp) { + patterns[i] = patterns[i].source; + } + else { + patterns[i] = patterns[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + } + + return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i'); + } + + var notCharacterOrDash = '(?=[^A-Za-z\\d\\-_]|$)'; + var varNames = /[\w\-:]/ + var keywords = buildRegexp([ + /begin|break|catch|continue|data|default|do|dynamicparam/, + /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/, + /param|process|return|switch|throw|trap|try|until|where|while/ + ], { suffix: notCharacterOrDash }); + + var punctuation = /[\[\]{},;`\\\.]|@[({]/; + var wordOperators = buildRegexp([ + 'f', + /b?not/, + /[ic]?split/, 'join', + /is(not)?/, 'as', + /[ic]?(eq|ne|[gl][te])/, + /[ic]?(not)?(like|match|contains)/, + /[ic]?replace/, + /b?(and|or|xor)/ + ], { prefix: '-' }); + var symbolOperators = /[+\-*\/%]=|\+\+|--|\.\.|[+\-*&^%:=!|\/]|<(?!#)|(?!#)>/; + var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' }); + + var numbers = /^((0x[\da-f]+)|((\d+\.\d+|\d\.|\.\d+|\d+)(e[\+\-]?\d+)?))[ld]?([kmgtp]b)?/i; + + var identifiers = /^[A-Za-z\_][A-Za-z\-\_\d]*\b/; + + var symbolBuiltins = /[A-Z]:|%|\?/i; + var namedBuiltins = buildRegexp([ + /Add-(Computer|Content|History|Member|PSSnapin|Type)/, + /Checkpoint-Computer/, + /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/, + /Compare-Object/, + /Complete-Transaction/, + /Connect-PSSession/, + /ConvertFrom-(Csv|Json|SecureString|StringData)/, + /Convert-Path/, + /ConvertTo-(Csv|Html|Json|SecureString|Xml)/, + /Copy-Item(Property)?/, + /Debug-Process/, + /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, + /Disconnect-PSSession/, + /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, + /(Enter|Exit)-PSSession/, + /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/, + /ForEach-Object/, + /Format-(Custom|List|Table|Wide)/, + new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential' + + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job' + + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration' + + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'), + /Group-Object/, + /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/, + /ImportSystemModules/, + /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/, + /Join-Path/, + /Limit-EventLog/, + /Measure-(Command|Object)/, + /Move-Item(Property)?/, + new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile' + + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'), + /Out-(Default|File|GridView|Host|Null|Printer|String)/, + /Pause/, + /(Pop|Push)-Location/, + /Read-Host/, + /Receive-(Job|PSSession)/, + /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/, + /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/, + /Rename-(Computer|Item(Property)?)/, + /Reset-ComputerMachinePassword/, + /Resolve-Path/, + /Restart-(Computer|Service)/, + /Restore-Computer/, + /Resume-(Job|Service)/, + /Save-Help/, + /Select-(Object|String|Xml)/, + /Send-MailMessage/, + new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' + + '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'), + /Show-(Command|ControlPanelItem|EventLog)/, + /Sort-Object/, + /Split-Path/, + /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/, + /Stop-(Computer|Job|Process|Service|Transcript)/, + /Suspend-(Job|Service)/, + /TabExpansion2/, + /Tee-Object/, + /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/, + /Trace-Command/, + /Unblock-File/, + /Undo-Transaction/, + /Unregister-(Event|PSSessionConfiguration)/, + /Update-(FormatData|Help|List|TypeData)/, + /Use-Transaction/, + /Wait-(Event|Job|Process)/, + /Where-Object/, + /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/, + /cd|help|mkdir|more|oss|prompt/, + /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/, + /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/, + /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/, + /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/, + /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/, + /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/ + ], { prefix: '', suffix: '' }); + var variableBuiltins = buildRegexp([ + /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/, + /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/, + /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/, + /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/, + /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/, + /WarningPreference|WhatIfPreference/, + + /Event|EventArgs|EventSubscriber|Sender/, + /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/, + /true|false|null/ + ], { prefix: '\\$', suffix: '' }); + + var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash }); + + var grammar = { + keyword: keywords, + number: numbers, + operator: operators, + builtin: builtins, + punctuation: punctuation, + identifier: identifiers + }; + + // tokenizers + function tokenBase(stream, state) { + // Handle Comments + //var ch = stream.peek(); + + var parent = state.returnStack[state.returnStack.length - 1]; + if (parent && parent.shouldReturnFrom(state)) { + state.tokenize = parent.tokenize; + state.returnStack.pop(); + return state.tokenize(stream, state); + } + + if (stream.eatSpace()) { + return null; + } + + if (stream.eat('(')) { + state.bracketNesting += 1; + return 'punctuation'; + } + + if (stream.eat(')')) { + state.bracketNesting -= 1; + return 'punctuation'; + } + + for (var key in grammar) { + if (stream.match(grammar[key])) { + return key; + } + } + + var ch = stream.next(); + + // single-quote string + if (ch === "'") { + return tokenSingleQuoteString(stream, state); + } + + if (ch === '$') { + return tokenVariable(stream, state); + } + + // double-quote string + if (ch === '"') { + return tokenDoubleQuoteString(stream, state); + } + + if (ch === '<' && stream.eat('#')) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + + if (ch === '#') { + stream.skipToEnd(); + return 'comment'; + } + + if (ch === '@') { + var quoteMatch = stream.eat(/["']/); + if (quoteMatch && stream.eol()) { + state.tokenize = tokenMultiString; + state.startQuote = quoteMatch[0]; + return tokenMultiString(stream, state); + } else if (stream.eol()) { + return 'error'; + } else if (stream.peek().match(/[({]/)) { + return 'punctuation'; + } else if (stream.peek().match(varNames)) { + // splatted variable + return tokenVariable(stream, state); + } + } + return 'error'; + } + + function tokenSingleQuoteString(stream, state) { + var ch; + while ((ch = stream.peek()) != null) { + stream.next(); + + if (ch === "'" && !stream.eat("'")) { + state.tokenize = tokenBase; + return 'string'; + } + } + + return 'error'; + } + + function tokenDoubleQuoteString(stream, state) { + var ch; + while ((ch = stream.peek()) != null) { + if (ch === '$') { + state.tokenize = tokenStringInterpolation; + return 'string'; + } + + stream.next(); + if (ch === '`') { + stream.next(); + continue; + } + + if (ch === '"' && !stream.eat('"')) { + state.tokenize = tokenBase; + return 'string'; + } + } + + return 'error'; + } + + function tokenStringInterpolation(stream, state) { + return tokenInterpolation(stream, state, tokenDoubleQuoteString); + } + + function tokenMultiStringReturn(stream, state) { + state.tokenize = tokenMultiString; + state.startQuote = '"' + return tokenMultiString(stream, state); + } + + function tokenHereStringInterpolation(stream, state) { + return tokenInterpolation(stream, state, tokenMultiStringReturn); + } + + function tokenInterpolation(stream, state, parentTokenize) { + if (stream.match('$(')) { + var savedBracketNesting = state.bracketNesting; + state.returnStack.push({ + /*jshint loopfunc:true */ + shouldReturnFrom: function(state) { + return state.bracketNesting === savedBracketNesting; + }, + tokenize: parentTokenize + }); + state.tokenize = tokenBase; + state.bracketNesting += 1; + return 'punctuation'; + } else { + stream.next(); + state.returnStack.push({ + shouldReturnFrom: function() { return true; }, + tokenize: parentTokenize + }); + state.tokenize = tokenVariable; + return state.tokenize(stream, state); + } + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == '>') { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch === '#'); + } + return 'comment'; + } + + function tokenVariable(stream, state) { + var ch = stream.peek(); + if (stream.eat('{')) { + state.tokenize = tokenVariableWithBraces; + return tokenVariableWithBraces(stream, state); + } else if (ch != undefined && ch.match(varNames)) { + stream.eatWhile(varNames); + state.tokenize = tokenBase; + return 'variable-2'; + } else { + state.tokenize = tokenBase; + return 'error'; + } + } + + function tokenVariableWithBraces(stream, state) { + var ch; + while ((ch = stream.next()) != null) { + if (ch === '}') { + state.tokenize = tokenBase; + break; + } + } + return 'variable-2'; + } + + function tokenMultiString(stream, state) { + var quote = state.startQuote; + if (stream.sol() && stream.match(new RegExp(quote + '@'))) { + state.tokenize = tokenBase; + } + else if (quote === '"') { + while (!stream.eol()) { + var ch = stream.peek(); + if (ch === '$') { + state.tokenize = tokenHereStringInterpolation; + return 'string'; + } + + stream.next(); + if (ch === '`') { + stream.next(); + } + } + } + else { + stream.skipToEnd(); + } + + return 'string'; + } + + var external = { + startState: function() { + return { + returnStack: [], + bracketNesting: 0, + tokenize: tokenBase + }; + }, + + token: function(stream, state) { + return state.tokenize(stream, state); + }, + + blockCommentStart: '<#', + blockCommentEnd: '#>', + lineComment: '#', + fold: 'brace' + }; + return external; +}); + +CodeMirror.defineMIME('application/x-powershell', 'powershell'); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/properties/properties.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/properties/properties.js new file mode 100644 index 0000000000..02fd7fe5eb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/properties/properties.js @@ -0,0 +1,78 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("properties", function() { + return { + token: function(stream, state) { + var sol = stream.sol() || state.afterSection; + var eol = stream.eol(); + + state.afterSection = false; + + if (sol) { + if (state.nextMultiline) { + state.inMultiline = true; + state.nextMultiline = false; + } else { + state.position = "def"; + } + } + + if (eol && ! state.nextMultiline) { + state.inMultiline = false; + state.position = "def"; + } + + if (sol) { + while(stream.eatSpace()) {} + } + + var ch = stream.next(); + + if (sol && (ch === "#" || ch === "!" || ch === ";")) { + state.position = "comment"; + stream.skipToEnd(); + return "comment"; + } else if (sol && ch === "[") { + state.afterSection = true; + stream.skipTo("]"); stream.eat("]"); + return "header"; + } else if (ch === "=" || ch === ":") { + state.position = "quote"; + return null; + } else if (ch === "\\" && state.position === "quote") { + if (stream.eol()) { // end of line? + // Multiline value + state.nextMultiline = true; + } + } + + return state.position; + }, + + startState: function() { + return { + position : "def", // Current position, "def", "quote" or "comment" + nextMultiline : false, // Is the next line multiline value + inMultiline : false, // Is the current line a multiline value + afterSection : false // Did we just open a section + }; + } + + }; +}); + +CodeMirror.defineMIME("text/x-properties", "properties"); +CodeMirror.defineMIME("text/x-ini", "properties"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/protobuf/protobuf.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/protobuf/protobuf.js new file mode 100644 index 0000000000..40b0842d47 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/protobuf/protobuf.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + }; + + var keywordArray = [ + "package", "message", "import", "syntax", + "required", "optional", "repeated", "reserved", "default", "extensions", "packed", + "bool", "bytes", "double", "enum", "float", "string", + "int32", "int64", "uint32", "uint64", "sint32", "sint64", "fixed32", "fixed64", "sfixed32", "sfixed64", + "option", "service", "rpc", "returns" + ]; + var keywords = wordRegexp(keywordArray); + + CodeMirror.registerHelper("hintWords", "protobuf", keywordArray); + + var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); + + function tokenBase(stream) { + // whitespaces + if (stream.eatSpace()) return null; + + // Handle one line Comments + if (stream.match("//")) { + stream.skipToEnd(); + return "comment"; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.+-]/, false)) { + if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) + return "number"; + if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) + return "number"; + if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) + return "number"; + } + + // Handle Strings + if (stream.match(/^"([^"]|(""))*"/)) { return "string"; } + if (stream.match(/^'([^']|(''))*'/)) { return "string"; } + + // Handle words + if (stream.match(keywords)) { return "keyword"; } + if (stream.match(identifiers)) { return "variable"; } ; + + // Handle non-detected items + stream.next(); + return null; + }; + + CodeMirror.defineMode("protobuf", function() { + return { + token: tokenBase, + fold: "brace" + }; + }); + + CodeMirror.defineMIME("text/x-protobuf", "protobuf"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pug/pug.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pug/pug.js new file mode 100644 index 0000000000..73e9ae2fc8 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/pug/pug.js @@ -0,0 +1,591 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../javascript/javascript"), require("../css/css"), require("../htmlmixed/htmlmixed")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../javascript/javascript", "../css/css", "../htmlmixed/htmlmixed"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("pug", function (config) { + // token types + var KEYWORD = 'keyword'; + var DOCTYPE = 'meta'; + var ID = 'builtin'; + var CLASS = 'qualifier'; + + var ATTRS_NEST = { + '{': '}', + '(': ')', + '[': ']' + }; + + var jsMode = CodeMirror.getMode(config, 'javascript'); + + function State() { + this.javaScriptLine = false; + this.javaScriptLineExcludesColon = false; + + this.javaScriptArguments = false; + this.javaScriptArgumentsDepth = 0; + + this.isInterpolating = false; + this.interpolationNesting = 0; + + this.jsState = CodeMirror.startState(jsMode); + + this.restOfLine = ''; + + this.isIncludeFiltered = false; + this.isEach = false; + + this.lastTag = ''; + this.scriptType = ''; + + // Attributes Mode + this.isAttrs = false; + this.attrsNest = []; + this.inAttributeName = true; + this.attributeIsType = false; + this.attrValue = ''; + + // Indented Mode + this.indentOf = Infinity; + this.indentToken = ''; + + this.innerMode = null; + this.innerState = null; + + this.innerModeForLine = false; + } + /** + * Safely copy a state + * + * @return {State} + */ + State.prototype.copy = function () { + var res = new State(); + res.javaScriptLine = this.javaScriptLine; + res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon; + res.javaScriptArguments = this.javaScriptArguments; + res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth; + res.isInterpolating = this.isInterpolating; + res.interpolationNesting = this.interpolationNesting; + + res.jsState = CodeMirror.copyState(jsMode, this.jsState); + + res.innerMode = this.innerMode; + if (this.innerMode && this.innerState) { + res.innerState = CodeMirror.copyState(this.innerMode, this.innerState); + } + + res.restOfLine = this.restOfLine; + + res.isIncludeFiltered = this.isIncludeFiltered; + res.isEach = this.isEach; + res.lastTag = this.lastTag; + res.scriptType = this.scriptType; + res.isAttrs = this.isAttrs; + res.attrsNest = this.attrsNest.slice(); + res.inAttributeName = this.inAttributeName; + res.attributeIsType = this.attributeIsType; + res.attrValue = this.attrValue; + res.indentOf = this.indentOf; + res.indentToken = this.indentToken; + + res.innerModeForLine = this.innerModeForLine; + + return res; + }; + + function javaScript(stream, state) { + if (stream.sol()) { + // if javaScriptLine was set at end of line, ignore it + state.javaScriptLine = false; + state.javaScriptLineExcludesColon = false; + } + if (state.javaScriptLine) { + if (state.javaScriptLineExcludesColon && stream.peek() === ':') { + state.javaScriptLine = false; + state.javaScriptLineExcludesColon = false; + return; + } + var tok = jsMode.token(stream, state.jsState); + if (stream.eol()) state.javaScriptLine = false; + return tok || true; + } + } + function javaScriptArguments(stream, state) { + if (state.javaScriptArguments) { + if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') { + state.javaScriptArguments = false; + return; + } + if (stream.peek() === '(') { + state.javaScriptArgumentsDepth++; + } else if (stream.peek() === ')') { + state.javaScriptArgumentsDepth--; + } + if (state.javaScriptArgumentsDepth === 0) { + state.javaScriptArguments = false; + return; + } + + var tok = jsMode.token(stream, state.jsState); + return tok || true; + } + } + + function yieldStatement(stream) { + if (stream.match(/^yield\b/)) { + return 'keyword'; + } + } + + function doctype(stream) { + if (stream.match(/^(?:doctype) *([^\n]+)?/)) { + return DOCTYPE; + } + } + + function interpolation(stream, state) { + if (stream.match('#{')) { + state.isInterpolating = true; + state.interpolationNesting = 0; + return 'punctuation'; + } + } + + function interpolationContinued(stream, state) { + if (state.isInterpolating) { + if (stream.peek() === '}') { + state.interpolationNesting--; + if (state.interpolationNesting < 0) { + stream.next(); + state.isInterpolating = false; + return 'punctuation'; + } + } else if (stream.peek() === '{') { + state.interpolationNesting++; + } + return jsMode.token(stream, state.jsState) || true; + } + } + + function caseStatement(stream, state) { + if (stream.match(/^case\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function when(stream, state) { + if (stream.match(/^when\b/)) { + state.javaScriptLine = true; + state.javaScriptLineExcludesColon = true; + return KEYWORD; + } + } + + function defaultStatement(stream) { + if (stream.match(/^default\b/)) { + return KEYWORD; + } + } + + function extendsStatement(stream, state) { + if (stream.match(/^extends?\b/)) { + state.restOfLine = 'string'; + return KEYWORD; + } + } + + function append(stream, state) { + if (stream.match(/^append\b/)) { + state.restOfLine = 'variable'; + return KEYWORD; + } + } + function prepend(stream, state) { + if (stream.match(/^prepend\b/)) { + state.restOfLine = 'variable'; + return KEYWORD; + } + } + function block(stream, state) { + if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) { + state.restOfLine = 'variable'; + return KEYWORD; + } + } + + function include(stream, state) { + if (stream.match(/^include\b/)) { + state.restOfLine = 'string'; + return KEYWORD; + } + } + + function includeFiltered(stream, state) { + if (stream.match(/^include:([a-zA-Z0-9\-]+)/, false) && stream.match('include')) { + state.isIncludeFiltered = true; + return KEYWORD; + } + } + + function includeFilteredContinued(stream, state) { + if (state.isIncludeFiltered) { + var tok = filter(stream, state); + state.isIncludeFiltered = false; + state.restOfLine = 'string'; + return tok; + } + } + + function mixin(stream, state) { + if (stream.match(/^mixin\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function call(stream, state) { + if (stream.match(/^\+([-\w]+)/)) { + if (!stream.match(/^\( *[-\w]+ *=/, false)) { + state.javaScriptArguments = true; + state.javaScriptArgumentsDepth = 0; + } + return 'variable'; + } + if (stream.match('+#{', false)) { + stream.next(); + state.mixinCallAfter = true; + return interpolation(stream, state); + } + } + function callArguments(stream, state) { + if (state.mixinCallAfter) { + state.mixinCallAfter = false; + if (!stream.match(/^\( *[-\w]+ *=/, false)) { + state.javaScriptArguments = true; + state.javaScriptArgumentsDepth = 0; + } + return true; + } + } + + function conditional(stream, state) { + if (stream.match(/^(if|unless|else if|else)\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function each(stream, state) { + if (stream.match(/^(- *)?(each|for)\b/)) { + state.isEach = true; + return KEYWORD; + } + } + function eachContinued(stream, state) { + if (state.isEach) { + if (stream.match(/^ in\b/)) { + state.javaScriptLine = true; + state.isEach = false; + return KEYWORD; + } else if (stream.sol() || stream.eol()) { + state.isEach = false; + } else if (stream.next()) { + while (!stream.match(/^ in\b/, false) && stream.next()); + return 'variable'; + } + } + } + + function whileStatement(stream, state) { + if (stream.match(/^while\b/)) { + state.javaScriptLine = true; + return KEYWORD; + } + } + + function tag(stream, state) { + var captures; + if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) { + state.lastTag = captures[1].toLowerCase(); + if (state.lastTag === 'script') { + state.scriptType = 'application/javascript'; + } + return 'tag'; + } + } + + function filter(stream, state) { + if (stream.match(/^:([\w\-]+)/)) { + var innerMode; + if (config && config.innerModes) { + innerMode = config.innerModes(stream.current().substring(1)); + } + if (!innerMode) { + innerMode = stream.current().substring(1); + } + if (typeof innerMode === 'string') { + innerMode = CodeMirror.getMode(config, innerMode); + } + setInnerMode(stream, state, innerMode); + return 'atom'; + } + } + + function code(stream, state) { + if (stream.match(/^(!?=|-)/)) { + state.javaScriptLine = true; + return 'punctuation'; + } + } + + function id(stream) { + if (stream.match(/^#([\w-]+)/)) { + return ID; + } + } + + function className(stream) { + if (stream.match(/^\.([\w-]+)/)) { + return CLASS; + } + } + + function attrs(stream, state) { + if (stream.peek() == '(') { + stream.next(); + state.isAttrs = true; + state.attrsNest = []; + state.inAttributeName = true; + state.attrValue = ''; + state.attributeIsType = false; + return 'punctuation'; + } + } + + function attrsContinued(stream, state) { + if (state.isAttrs) { + if (ATTRS_NEST[stream.peek()]) { + state.attrsNest.push(ATTRS_NEST[stream.peek()]); + } + if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) { + state.attrsNest.pop(); + } else if (stream.eat(')')) { + state.isAttrs = false; + return 'punctuation'; + } + if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) { + if (stream.peek() === '=' || stream.peek() === '!') { + state.inAttributeName = false; + state.jsState = CodeMirror.startState(jsMode); + if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') { + state.attributeIsType = true; + } else { + state.attributeIsType = false; + } + } + return 'attribute'; + } + + var tok = jsMode.token(stream, state.jsState); + if (state.attributeIsType && tok === 'string') { + state.scriptType = stream.current().toString(); + } + if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) { + try { + Function('', 'var x ' + state.attrValue.replace(/,\s*$/, '').replace(/^!/, '')); + state.inAttributeName = true; + state.attrValue = ''; + stream.backUp(stream.current().length); + return attrsContinued(stream, state); + } catch (ex) { + //not the end of an attribute + } + } + state.attrValue += stream.current(); + return tok || true; + } + } + + function attributesBlock(stream, state) { + if (stream.match(/^&attributes\b/)) { + state.javaScriptArguments = true; + state.javaScriptArgumentsDepth = 0; + return 'keyword'; + } + } + + function indent(stream) { + if (stream.sol() && stream.eatSpace()) { + return 'indent'; + } + } + + function comment(stream, state) { + if (stream.match(/^ *\/\/(-)?([^\n]*)/)) { + state.indentOf = stream.indentation(); + state.indentToken = 'comment'; + return 'comment'; + } + } + + function colon(stream) { + if (stream.match(/^: */)) { + return 'colon'; + } + } + + function text(stream, state) { + if (stream.match(/^(?:\| ?| )([^\n]+)/)) { + return 'string'; + } + if (stream.match(/^(<[^\n]*)/, false)) { + // html string + setInnerMode(stream, state, 'htmlmixed'); + state.innerModeForLine = true; + return innerMode(stream, state, true); + } + } + + function dot(stream, state) { + if (stream.eat('.')) { + var innerMode = null; + if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) { + innerMode = state.scriptType.toLowerCase().replace(/"|'/g, ''); + } else if (state.lastTag === 'style') { + innerMode = 'css'; + } + setInnerMode(stream, state, innerMode); + return 'dot'; + } + } + + function fail(stream) { + stream.next(); + return null; + } + + + function setInnerMode(stream, state, mode) { + mode = CodeMirror.mimeModes[mode] || mode; + mode = config.innerModes ? config.innerModes(mode) || mode : mode; + mode = CodeMirror.mimeModes[mode] || mode; + mode = CodeMirror.getMode(config, mode); + state.indentOf = stream.indentation(); + + if (mode && mode.name !== 'null') { + state.innerMode = mode; + } else { + state.indentToken = 'string'; + } + } + function innerMode(stream, state, force) { + if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) { + if (state.innerMode) { + if (!state.innerState) { + state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {}; + } + return stream.hideFirstChars(state.indentOf + 2, function () { + return state.innerMode.token(stream, state.innerState) || true; + }); + } else { + stream.skipToEnd(); + return state.indentToken; + } + } else if (stream.sol()) { + state.indentOf = Infinity; + state.indentToken = null; + state.innerMode = null; + state.innerState = null; + } + } + function restOfLine(stream, state) { + if (stream.sol()) { + // if restOfLine was set at end of line, ignore it + state.restOfLine = ''; + } + if (state.restOfLine) { + stream.skipToEnd(); + var tok = state.restOfLine; + state.restOfLine = ''; + return tok; + } + } + + + function startState() { + return new State(); + } + function copyState(state) { + return state.copy(); + } + /** + * Get the next token in the stream + * + * @param {Stream} stream + * @param {State} state + */ + function nextToken(stream, state) { + var tok = innerMode(stream, state) + || restOfLine(stream, state) + || interpolationContinued(stream, state) + || includeFilteredContinued(stream, state) + || eachContinued(stream, state) + || attrsContinued(stream, state) + || javaScript(stream, state) + || javaScriptArguments(stream, state) + || callArguments(stream, state) + + || yieldStatement(stream) + || doctype(stream) + || interpolation(stream, state) + || caseStatement(stream, state) + || when(stream, state) + || defaultStatement(stream) + || extendsStatement(stream, state) + || append(stream, state) + || prepend(stream, state) + || block(stream, state) + || include(stream, state) + || includeFiltered(stream, state) + || mixin(stream, state) + || call(stream, state) + || conditional(stream, state) + || each(stream, state) + || whileStatement(stream, state) + || tag(stream, state) + || filter(stream, state) + || code(stream, state) + || id(stream) + || className(stream) + || attrs(stream, state) + || attributesBlock(stream, state) + || indent(stream) + || text(stream, state) + || comment(stream, state) + || colon(stream) + || dot(stream, state) + || fail(stream); + + return tok === true ? null : tok; + } + return { + startState: startState, + copyState: copyState, + token: nextToken + }; +}, 'javascript', 'css', 'htmlmixed'); + +CodeMirror.defineMIME('text/x-pug', 'pug'); +CodeMirror.defineMIME('text/x-jade', 'pug'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/puppet/puppet.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/puppet/puppet.js new file mode 100644 index 0000000000..a92ca1107b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/puppet/puppet.js @@ -0,0 +1,220 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("puppet", function () { + // Stores the words from the define method + var words = {}; + // Taken, mostly, from the Puppet official variable standards regex + var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/; + + // Takes a string of words separated by spaces and adds them as + // keys with the value of the first argument 'style' + function define(style, string) { + var split = string.split(' '); + for (var i = 0; i < split.length; i++) { + words[split[i]] = style; + } + } + + // Takes commonly known puppet types/words and classifies them to a style + define('keyword', 'class define site node include import inherits'); + define('keyword', 'case if else in and elsif default or'); + define('atom', 'false true running present absent file directory undef'); + define('builtin', 'action augeas burst chain computer cron destination dport exec ' + + 'file filebucket group host icmp iniface interface jump k5login limit log_level ' + + 'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' + + 'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' + + 'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' + + 'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' + + 'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' + + 'resources router schedule scheduled_task selboolean selmodule service source ' + + 'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' + + 'user vlan yumrepo zfs zone zpool'); + + // After finding a start of a string ('|") this function attempts to find the end; + // If a variable is encountered along the way, we display it differently when it + // is encapsulated in a double-quoted string. + function tokenString(stream, state) { + var current, prev, found_var = false; + while (!stream.eol() && (current = stream.next()) != state.pending) { + if (current === '$' && prev != '\\' && state.pending == '"') { + found_var = true; + break; + } + prev = current; + } + if (found_var) { + stream.backUp(1); + } + if (current == state.pending) { + state.continueString = false; + } else { + state.continueString = true; + } + return "string"; + } + + // Main function + function tokenize(stream, state) { + // Matches one whole word + var word = stream.match(/[\w]+/, false); + // Matches attributes (i.e. ensure => present ; 'ensure' would be matched) + var attribute = stream.match(/(\s+)?\w+\s+=>.*/, false); + // Matches non-builtin resource declarations + // (i.e. "apache::vhost {" or "mycustomclasss {" would be matched) + var resource = stream.match(/(\s+)?[\w:_]+(\s+)?{/, false); + // Matches virtual and exported resources (i.e. @@user { ; and the like) + var special_resource = stream.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/, false); + + // Finally advance the stream + var ch = stream.next(); + + // Have we found a variable? + if (ch === '$') { + if (stream.match(variable_regex)) { + // If so, and its in a string, assign it a different color + return state.continueString ? 'variable-2' : 'variable'; + } + // Otherwise return an invalid variable + return "error"; + } + // Should we still be looking for the end of a string? + if (state.continueString) { + // If so, go through the loop again + stream.backUp(1); + return tokenString(stream, state); + } + // Are we in a definition (class, node, define)? + if (state.inDefinition) { + // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched) + if (stream.match(/(\s+)?[\w:_]+(\s+)?/)) { + return 'def'; + } + // Match the rest it the next time around + stream.match(/\s+{/); + state.inDefinition = false; + } + // Are we in an 'include' statement? + if (state.inInclude) { + // Match and return the included class + stream.match(/(\s+)?\S+(\s+)?/); + state.inInclude = false; + return 'def'; + } + // Do we just have a function on our hands? + // In 'ensure_resource("myclass")', 'ensure_resource' is matched + if (stream.match(/(\s+)?\w+\(/)) { + stream.backUp(1); + return 'def'; + } + // Have we matched the prior attribute regex? + if (attribute) { + stream.match(/(\s+)?\w+/); + return 'tag'; + } + // Do we have Puppet specific words? + if (word && words.hasOwnProperty(word)) { + // Negates the initial next() + stream.backUp(1); + // rs move the stream + stream.match(/[\w]+/); + // We want to process these words differently + // do to the importance they have in Puppet + if (stream.match(/\s+\S+\s+{/, false)) { + state.inDefinition = true; + } + if (word == 'include') { + state.inInclude = true; + } + // Returns their value as state in the prior define methods + return words[word]; + } + // Is there a match on a reference? + if (/(^|\s+)[A-Z][\w:_]+/.test(word)) { + // Negate the next() + stream.backUp(1); + // Match the full reference + stream.match(/(^|\s+)[A-Z][\w:_]+/); + return 'def'; + } + // Have we matched the prior resource regex? + if (resource) { + stream.match(/(\s+)?[\w:_]+/); + return 'def'; + } + // Have we matched the prior special_resource regex? + if (special_resource) { + stream.match(/(\s+)?[@]{1,2}/); + return 'special'; + } + // Match all the comments. All of them. + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + // Have we found a string? + if (ch == "'" || ch == '"') { + // Store the type (single or double) + state.pending = ch; + // Perform the looping function to find the end + return tokenString(stream, state); + } + // Match all the brackets + if (ch == '{' || ch == '}') { + return 'bracket'; + } + // Match characters that we are going to assume + // are trying to be regex + if (ch == '/') { + stream.match(/^[^\/]*\//); + return 'variable-3'; + } + // Match all the numbers + if (ch.match(/[0-9]/)) { + stream.eatWhile(/[0-9]+/); + return 'number'; + } + // Match the '=' and '=>' operators + if (ch == '=') { + if (stream.peek() == '>') { + stream.next(); + } + return "operator"; + } + // Keep advancing through all the rest + stream.eatWhile(/[\w-]/); + // Return a blank line for everything else + return null; + } + // Start it all + return { + startState: function () { + var state = {}; + state.inDefinition = false; + state.inInclude = false; + state.continueString = false; + state.pending = false; + return state; + }, + token: function (stream, state) { + // Strip the spaces, but regex will account for them eitherway + if (stream.eatSpace()) return null; + // Go through the main process + return tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME("text/x-puppet", "puppet"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/python/python.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/python/python.js new file mode 100644 index 0000000000..9e532ea1b3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/python/python.js @@ -0,0 +1,402 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var wordOperators = wordRegexp(["and", "or", "not", "is"]); + var commonKeywords = ["as", "assert", "break", "class", "continue", + "def", "del", "elif", "else", "except", "finally", + "for", "from", "global", "if", "import", + "lambda", "pass", "raise", "return", + "try", "while", "with", "yield", "in"]; + var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", + "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", + "enumerate", "eval", "filter", "float", "format", "frozenset", + "getattr", "globals", "hasattr", "hash", "help", "hex", "id", + "input", "int", "isinstance", "issubclass", "iter", "len", + "list", "locals", "map", "max", "memoryview", "min", "next", + "object", "oct", "open", "ord", "pow", "property", "range", + "repr", "reversed", "round", "set", "setattr", "slice", + "sorted", "staticmethod", "str", "sum", "super", "tuple", + "type", "vars", "zip", "__import__", "NotImplemented", + "Ellipsis", "__debug__"]; + CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); + + function top(state) { + return state.scopes[state.scopes.length - 1]; + } + + CodeMirror.defineMode("python", function(conf, parserConf) { + var ERRORCLASS = "error"; + + var delimiters = parserConf.delimiters || parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.\\]/; + // (Backwards-compatibility with old, cumbersome config system) + var operators = [parserConf.singleOperators, parserConf.doubleOperators, parserConf.doubleDelimiters, parserConf.tripleDelimiters, + parserConf.operators || /^([-+*/%\/&|^]=?|[<>=]+|\/\/=?|\*\*=?|!=|[~!@]|\.\.\.)/] + for (var i = 0; i < operators.length; i++) if (!operators[i]) operators.splice(i--, 1) + + var hangingIndent = parserConf.hangingIndent || conf.indentUnit; + + var myKeywords = commonKeywords, myBuiltins = commonBuiltins; + if (parserConf.extra_keywords != undefined) + myKeywords = myKeywords.concat(parserConf.extra_keywords); + + if (parserConf.extra_builtins != undefined) + myBuiltins = myBuiltins.concat(parserConf.extra_builtins); + + var py3 = !(parserConf.version && Number(parserConf.version) < 3) + if (py3) { + // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator + var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; + myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]); + myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); + var stringPrefixes = new RegExp("^(([rbuf]|(br)|(rb)|(fr)|(rf))?('{3}|\"{3}|['\"]))", "i"); + } else { + var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/; + myKeywords = myKeywords.concat(["exec", "print"]); + myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", + "file", "intern", "long", "raw_input", "reduce", "reload", + "unichr", "unicode", "xrange", "False", "True", "None"]); + var stringPrefixes = new RegExp("^(([rubf]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); + } + var keywords = wordRegexp(myKeywords); + var builtins = wordRegexp(myBuiltins); + + // tokenizers + function tokenBase(stream, state) { + var sol = stream.sol() && state.lastToken != "\\" + if (sol) state.indent = stream.indentation() + // Handle scope changes + if (sol && top(state).type == "py") { + var scopeOffset = top(state).offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) + pushPyScope(state); + else if (lineOffset < scopeOffset && dedent(stream, state) && stream.peek() != "#") + state.errorToken = true; + return null; + } else { + var style = tokenBaseInner(stream, state); + if (scopeOffset > 0 && dedent(stream, state)) + style += " " + ERRORCLASS; + return style; + } + } + return tokenBaseInner(stream, state); + } + + function tokenBaseInner(stream, state, inFormat) { + if (stream.eatSpace()) return null; + + // Handle Comments + if (!inFormat && stream.match(/^#.*/)) return "comment"; + + // Handle Number Literals + if (stream.match(/^[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^[\d_]*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } + if (stream.match(/^[\d_]+\.\d*/)) { floatLiteral = true; } + if (stream.match(/^\.\d+/)) { floatLiteral = true; } + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^0x[0-9a-f_]+/i)) intLiteral = true; + // Binary + if (stream.match(/^0b[01_]+/i)) intLiteral = true; + // Octal + if (stream.match(/^0o[0-7_]+/i)) intLiteral = true; + // Decimal + if (stream.match(/^[1-9][\d_]*(e[\+\-]?[\d_]+)?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^0(?![\dx])/i)) intLiteral = true; + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return "number"; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + var isFmtString = stream.current().toLowerCase().indexOf('f') !== -1; + if (!isFmtString) { + state.tokenize = tokenStringFactory(stream.current(), state.tokenize); + return state.tokenize(stream, state); + } else { + state.tokenize = formatStringFactory(stream.current(), state.tokenize); + return state.tokenize(stream, state); + } + } + + for (var i = 0; i < operators.length; i++) + if (stream.match(operators[i])) return "operator" + + if (stream.match(delimiters)) return "punctuation"; + + if (state.lastToken == "." && stream.match(identifiers)) + return "property"; + + if (stream.match(keywords) || stream.match(wordOperators)) + return "keyword"; + + if (stream.match(builtins)) + return "builtin"; + + if (stream.match(/^(self|cls)\b/)) + return "variable-2"; + + if (stream.match(identifiers)) { + if (state.lastToken == "def" || state.lastToken == "class") + return "def"; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return inFormat ? null :ERRORCLASS; + } + + function formatStringFactory(delimiter, tokenOuter) { + while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenNestedExpr(depth) { + return function(stream, state) { + var inner = tokenBaseInner(stream, state, true) + if (inner == "punctuation") { + if (stream.current() == "{") { + state.tokenize = tokenNestedExpr(depth + 1) + } else if (stream.current() == "}") { + if (depth > 1) state.tokenize = tokenNestedExpr(depth - 1) + else state.tokenize = tokenString + } + } + return inner + } + } + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\{\}\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenOuter; + return OUTCLASS; + } else if (stream.match('{{')) { + // ignore {{ in f-str + return OUTCLASS; + } else if (stream.match('{', false)) { + // switch to nested mode + state.tokenize = tokenNestedExpr(0) + if (stream.current()) return OUTCLASS; + else return state.tokenize(stream, state) + } else if (stream.match('}}')) { + return OUTCLASS; + } else if (stream.match('}')) { + // single } in f-string is an error + return ERRORCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenOuter; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function tokenStringFactory(delimiter, tokenOuter) { + while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenOuter; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenOuter; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function pushPyScope(state) { + while (top(state).type != "py") state.scopes.pop() + state.scopes.push({offset: top(state).offset + conf.indentUnit, + type: "py", + align: null}) + } + + function pushBracketScope(stream, state, type) { + var align = stream.match(/^[\s\[\{\(]*(?:#|$)/, false) ? null : stream.column() + 1 + state.scopes.push({offset: state.indent + hangingIndent, + type: type, + align: align}) + } + + function dedent(stream, state) { + var indented = stream.indentation(); + while (state.scopes.length > 1 && top(state).offset > indented) { + if (top(state).type != "py") return true; + state.scopes.pop(); + } + return top(state).offset != indented; + } + + function tokenLexer(stream, state) { + if (stream.sol()) { + state.beginningOfLine = true; + state.dedent = false; + } + + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle decorators + if (state.beginningOfLine && current == "@") + return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; + + if (/\S/.test(current)) state.beginningOfLine = false; + + if ((style == "variable" || style == "builtin") + && state.lastToken == "meta") + style = "meta"; + + // Handle scope changes. + if (current == "pass" || current == "return") + state.dedent = true; + + if (current == "lambda") state.lambda = true; + if (current == ":" && !state.lambda && top(state).type == "py" && stream.match(/^\s*(?:#|$)/, false)) + pushPyScope(state); + + if (current.length == 1 && !/string|comment/.test(style)) { + var delimiter_index = "[({".indexOf(current); + if (delimiter_index != -1) + pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + + delimiter_index = "])}".indexOf(current); + if (delimiter_index != -1) { + if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent + else return ERRORCLASS; + } + } + if (state.dedent && stream.eol() && top(state).type == "py" && state.scopes.length > 1) + state.scopes.pop(); + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{offset: basecolumn || 0, type: "py", align: null}], + indent: basecolumn || 0, + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var addErr = state.errorToken; + if (addErr) state.errorToken = false; + var style = tokenLexer(stream, state); + + if (style && style != "comment") + state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style; + if (style == "punctuation") style = null; + + if (stream.eol() && state.lambda) + state.lambda = false; + return addErr ? style + " " + ERRORCLASS : style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) + return state.tokenize.isString ? CodeMirror.Pass : 0; + + var scope = top(state) + var closing = scope.type == textAfter.charAt(0) || + scope.type == "py" && !state.dedent && /^(else:|elif |except |finally:)/.test(textAfter) + if (scope.align != null) + return scope.align - (closing ? 1 : 0) + else + return scope.offset - (closing ? hangingIndent : 0) + }, + + electricInput: /^\s*([\}\]\)]|else:|elif |except |finally:)$/, + closeBrackets: {triples: "'\""}, + lineComment: "#", + fold: "indent" + }; + return external; + }); + + CodeMirror.defineMIME("text/x-python", "python"); + + var words = function(str) { return str.split(" "); }; + + CodeMirror.defineMIME("text/x-cython", { + name: "python", + extra_keywords: words("by cdef cimport cpdef ctypedef enum except "+ + "extern gil include nogil property public "+ + "readonly struct union DEF IF ELIF ELSE") + }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/q/q.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/q/q.js new file mode 100644 index 0000000000..c016a6aa65 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/q/q.js @@ -0,0 +1,139 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("q",function(config){ + var indentUnit=config.indentUnit, + curPunc, + keywords=buildRE(["abs","acos","aj","aj0","all","and","any","asc","asin","asof","atan","attr","avg","avgs","bin","by","ceiling","cols","cor","cos","count","cov","cross","csv","cut","delete","deltas","desc","dev","differ","distinct","div","do","each","ej","enlist","eval","except","exec","exit","exp","fby","fills","first","fkeys","flip","floor","from","get","getenv","group","gtime","hclose","hcount","hdel","hopen","hsym","iasc","idesc","if","ij","in","insert","inter","inv","key","keys","last","like","list","lj","load","log","lower","lsq","ltime","ltrim","mavg","max","maxs","mcount","md5","mdev","med","meta","min","mins","mmax","mmin","mmu","mod","msum","neg","next","not","null","or","over","parse","peach","pj","plist","prd","prds","prev","prior","rand","rank","ratios","raze","read0","read1","reciprocal","reverse","rload","rotate","rsave","rtrim","save","scan","select","set","setenv","show","signum","sin","sqrt","ss","ssr","string","sublist","sum","sums","sv","system","tables","tan","til","trim","txf","type","uj","ungroup","union","update","upper","upsert","value","var","view","views","vs","wavg","where","where","while","within","wj","wj1","wsum","xasc","xbar","xcol","xcols","xdesc","xexp","xgroup","xkey","xlog","xprev","xrank"]), + E=/[|/&^!+:\\\-*%$=~#;@><,?_\'\"\[\(\]\)\s{}]/; + function buildRE(w){return new RegExp("^("+w.join("|")+")$");} + function tokenBase(stream,state){ + var sol=stream.sol(),c=stream.next(); + curPunc=null; + if(sol) + if(c=="/") + return(state.tokenize=tokenLineComment)(stream,state); + else if(c=="\\"){ + if(stream.eol()||/\s/.test(stream.peek())) + return stream.skipToEnd(),/^\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream):state.tokenize=tokenBase,"comment"; + else + return state.tokenize=tokenBase,"builtin"; + } + if(/\s/.test(c)) + return stream.peek()=="/"?(stream.skipToEnd(),"comment"):"whitespace"; + if(c=='"') + return(state.tokenize=tokenString)(stream,state); + if(c=='`') + return stream.eatWhile(/[A-Za-z\d_:\/.]/),"symbol"; + if(("."==c&&/\d/.test(stream.peek()))||/\d/.test(c)){ + var t=null; + stream.backUp(1); + if(stream.match(/^\d{4}\.\d{2}(m|\.\d{2}([DT](\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)?)?)/) + || stream.match(/^\d+D(\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)/) + || stream.match(/^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?/) + || stream.match(/^\d+[ptuv]{1}/)) + t="temporal"; + else if(stream.match(/^0[NwW]{1}/) + || stream.match(/^0x[\da-fA-F]*/) + || stream.match(/^[01]+[b]{1}/) + || stream.match(/^\d+[chijn]{1}/) + || stream.match(/-?\d*(\.\d*)?(e[+\-]?\d+)?(e|f)?/)) + t="number"; + return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),"error"); + } + if(/[A-Za-z]|\./.test(c)) + return stream.eatWhile(/[A-Za-z._\d]/),keywords.test(stream.current())?"keyword":"variable"; + if(/[|/&^!+:\\\-*%$=~#;@><\.,?_\']/.test(c)) + return null; + if(/[{}\(\[\]\)]/.test(c)) + return null; + return"error"; + } + function tokenLineComment(stream,state){ + return stream.skipToEnd(),/\/\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),"comment"; + } + function tokenBlockComment(stream,state){ + var f=stream.sol()&&stream.peek()=="\\"; + stream.skipToEnd(); + if(f&&/^\\\s*$/.test(stream.current())) + state.tokenize=tokenBase; + return"comment"; + } + function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";} + function tokenString(stream,state){ + var escaped=false,next,end=false; + while((next=stream.next())){ + if(next=="\""&&!escaped){end=true;break;} + escaped=!escaped&&next=="\\"; + } + if(end)state.tokenize=tokenBase; + return"string"; + } + function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};} + function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;} + return{ + startState:function(){ + return{tokenize:tokenBase, + context:null, + indent:0, + col:0}; + }, + token:function(stream,state){ + if(stream.sol()){ + if(state.context&&state.context.align==null) + state.context.align=false; + state.indent=stream.indentation(); + } + //if (stream.eatSpace()) return null; + var style=state.tokenize(stream,state); + if(style!="comment"&&state.context&&state.context.align==null&&state.context.type!="pattern"){ + state.context.align=true; + } + if(curPunc=="(")pushContext(state,")",stream.column()); + else if(curPunc=="[")pushContext(state,"]",stream.column()); + else if(curPunc=="{")pushContext(state,"}",stream.column()); + else if(/[\]\}\)]/.test(curPunc)){ + while(state.context&&state.context.type=="pattern")popContext(state); + if(state.context&&curPunc==state.context.type)popContext(state); + } + else if(curPunc=="."&&state.context&&state.context.type=="pattern")popContext(state); + else if(/atom|string|variable/.test(style)&&state.context){ + if(/[\}\]]/.test(state.context.type)) + pushContext(state,"pattern",stream.column()); + else if(state.context.type=="pattern"&&!state.context.align){ + state.context.align=true; + state.context.col=stream.column(); + } + } + return style; + }, + indent:function(state,textAfter){ + var firstChar=textAfter&&textAfter.charAt(0); + var context=state.context; + if(/[\]\}]/.test(firstChar)) + while (context&&context.type=="pattern")context=context.prev; + var closing=context&&firstChar==context.type; + if(!context) + return 0; + else if(context.type=="pattern") + return context.col; + else if(context.align) + return context.col+(closing?0:1); + else + return context.indent+(closing?0:indentUnit); + } + }; +}); +CodeMirror.defineMIME("text/x-q","q"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/r/r.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/r/r.js new file mode 100644 index 0000000000..de34c201bd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/r/r.js @@ -0,0 +1,190 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("wordChars", "r", /[\w.]/); + +CodeMirror.defineMode("r", function(config) { + function wordObj(words) { + var res = {}; + for (var i = 0; i < words.length; ++i) res[words[i]] = true; + return res; + } + var commonAtoms = ["NULL", "NA", "Inf", "NaN", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_", "TRUE", "FALSE"]; + var commonBuiltins = ["list", "quote", "bquote", "eval", "return", "call", "parse", "deparse"]; + var commonKeywords = ["if", "else", "repeat", "while", "function", "for", "in", "next", "break"]; + var commonBlockKeywords = ["if", "else", "repeat", "while", "function", "for"]; + + CodeMirror.registerHelper("hintWords", "r", commonAtoms.concat(commonBuiltins, commonKeywords)); + + var atoms = wordObj(commonAtoms); + var builtins = wordObj(commonBuiltins); + var keywords = wordObj(commonKeywords); + var blockkeywords = wordObj(commonBlockKeywords); + var opChars = /[+\-*\/^<>=!&|~$:]/; + var curPunc; + + function tokenBase(stream, state) { + curPunc = null; + var ch = stream.next(); + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } else if (ch == "0" && stream.eat("x")) { + stream.eatWhile(/[\da-f]/i); + return "number"; + } else if (ch == "." && stream.eat(/\d/)) { + stream.match(/\d*(?:e[+\-]?\d+)?/); + return "number"; + } else if (/\d/.test(ch)) { + stream.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/); + return "number"; + } else if (ch == "'" || ch == '"') { + state.tokenize = tokenString(ch); + return "string"; + } else if (ch == "`") { + stream.match(/[^`]+`/); + return "variable-3"; + } else if (ch == "." && stream.match(/.(?:[.]|\d+)/)) { + return "keyword"; + } else if (/[a-zA-Z\.]/.test(ch)) { + stream.eatWhile(/[\w\.]/); + var word = stream.current(); + if (atoms.propertyIsEnumerable(word)) return "atom"; + if (keywords.propertyIsEnumerable(word)) { + // Block keywords start new blocks, except 'else if', which only starts + // one new block for the 'if', no block for the 'else'. + if (blockkeywords.propertyIsEnumerable(word) && + !stream.match(/\s*if(\s+|$)/, false)) + curPunc = "block"; + return "keyword"; + } + if (builtins.propertyIsEnumerable(word)) return "builtin"; + return "variable"; + } else if (ch == "%") { + if (stream.skipTo("%")) stream.next(); + return "operator variable-2"; + } else if ( + (ch == "<" && stream.eat("-")) || + (ch == "<" && stream.match("<-")) || + (ch == "-" && stream.match(/>>?/)) + ) { + return "operator arrow"; + } else if (ch == "=" && state.ctx.argList) { + return "arg-is"; + } else if (opChars.test(ch)) { + if (ch == "$") return "operator dollar"; + stream.eatWhile(opChars); + return "operator"; + } else if (/[\(\){}\[\];]/.test(ch)) { + curPunc = ch; + if (ch == ";") return "semi"; + return null; + } else { + return null; + } + } + + function tokenString(quote) { + return function(stream, state) { + if (stream.eat("\\")) { + var ch = stream.next(); + if (ch == "x") stream.match(/^[a-f0-9]{2}/i); + else if ((ch == "u" || ch == "U") && stream.eat("{") && stream.skipTo("}")) stream.next(); + else if (ch == "u") stream.match(/^[a-f0-9]{4}/i); + else if (ch == "U") stream.match(/^[a-f0-9]{8}/i); + else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/); + return "string-2"; + } else { + var next; + while ((next = stream.next()) != null) { + if (next == quote) { state.tokenize = tokenBase; break; } + if (next == "\\") { stream.backUp(1); break; } + } + return "string"; + } + }; + } + + var ALIGN_YES = 1, ALIGN_NO = 2, BRACELESS = 4 + + function push(state, type, stream) { + state.ctx = {type: type, + indent: state.indent, + flags: 0, + column: stream.column(), + prev: state.ctx}; + } + function setFlag(state, flag) { + var ctx = state.ctx + state.ctx = {type: ctx.type, + indent: ctx.indent, + flags: ctx.flags | flag, + column: ctx.column, + prev: ctx.prev} + } + function pop(state) { + state.indent = state.ctx.indent; + state.ctx = state.ctx.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + ctx: {type: "top", + indent: -config.indentUnit, + flags: ALIGN_NO}, + indent: 0, + afterIdent: false}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if ((state.ctx.flags & 3) == 0) state.ctx.flags |= ALIGN_NO + if (state.ctx.flags & BRACELESS) pop(state) + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (style != "comment" && (state.ctx.flags & ALIGN_NO) == 0) setFlag(state, ALIGN_YES) + + if ((curPunc == ";" || curPunc == "{" || curPunc == "}") && state.ctx.type == "block") pop(state); + if (curPunc == "{") push(state, "}", stream); + else if (curPunc == "(") { + push(state, ")", stream); + if (state.afterIdent) state.ctx.argList = true; + } + else if (curPunc == "[") push(state, "]", stream); + else if (curPunc == "block") push(state, "block", stream); + else if (curPunc == state.ctx.type) pop(state); + else if (state.ctx.type == "block" && style != "comment") setFlag(state, BRACELESS) + state.afterIdent = style == "variable" || style == "keyword"; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx, + closing = firstChar == ctx.type; + if (ctx.flags & BRACELESS) ctx = ctx.prev + if (ctx.type == "block") return ctx.indent + (firstChar == "{" ? 0 : config.indentUnit); + else if (ctx.flags & ALIGN_YES) return ctx.column + (closing ? 0 : 1); + else return ctx.indent + (closing ? 0 : config.indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/x-rsrc", "r"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/changes/index.html b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/changes/index.html new file mode 100644 index 0000000000..9d244ecc85 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/changes/index.html @@ -0,0 +1,66 @@ + + +CodeMirror: RPM changes mode + + + + + + + + + + + +
    +

    RPM changes mode

    + +
    + + +

    MIME types defined: text/x-rpm-changes.

    +
    diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/rpm.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/rpm.js new file mode 100644 index 0000000000..bb9ec9ffad --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rpm/rpm.js @@ -0,0 +1,109 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("rpm-changes", function() { + var headerSeparator = /^-+$/; + var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /; + var simpleEmail = /^[\w+.-]+@[\w.-]+/; + + return { + token: function(stream) { + if (stream.sol()) { + if (stream.match(headerSeparator)) { return 'tag'; } + if (stream.match(headerLine)) { return 'tag'; } + } + if (stream.match(simpleEmail)) { return 'string'; } + stream.next(); + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-rpm-changes", "rpm-changes"); + +// Quick and dirty spec file highlighting + +CodeMirror.defineMode("rpm-spec", function() { + var arch = /^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/; + + var preamble = /^[a-zA-Z0-9()]+:/; + var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/; + var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros + var control_flow_simple = /^%(else|endif)/; // rpm control flow macros + var operators = /^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/; // operators in control flow macros + + return { + startState: function () { + return { + controlFlow: false, + macroParameters: false, + section: false + }; + }, + token: function (stream, state) { + var ch = stream.peek(); + if (ch == "#") { stream.skipToEnd(); return "comment"; } + + if (stream.sol()) { + if (stream.match(preamble)) { return "header"; } + if (stream.match(section)) { return "atom"; } + } + + if (stream.match(/^\$\w+/)) { return "def"; } // Variables like '$RPM_BUILD_ROOT' + if (stream.match(/^\$\{\w+\}/)) { return "def"; } // Variables like '${RPM_BUILD_ROOT}' + + if (stream.match(control_flow_simple)) { return "keyword"; } + if (stream.match(control_flow_complex)) { + state.controlFlow = true; + return "keyword"; + } + if (state.controlFlow) { + if (stream.match(operators)) { return "operator"; } + if (stream.match(/^(\d+)/)) { return "number"; } + if (stream.eol()) { state.controlFlow = false; } + } + + if (stream.match(arch)) { + if (stream.eol()) { state.controlFlow = false; } + return "number"; + } + + // Macros like '%make_install' or '%attr(0775,root,root)' + if (stream.match(/^%[\w]+/)) { + if (stream.match('(')) { state.macroParameters = true; } + return "keyword"; + } + if (state.macroParameters) { + if (stream.match(/^\d+/)) { return "number";} + if (stream.match(')')) { + state.macroParameters = false; + return "keyword"; + } + } + + // Macros like '%{defined fedora}' + if (stream.match(/^%\{\??[\w \-\:\!]+\}/)) { + if (stream.eol()) { state.controlFlow = false; } + return "def"; + } + + //TODO: Include bash script sub-parser (CodeMirror supports that) + stream.next(); + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-rpm-spec", "rpm-spec"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rst/rst.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rst/rst.js new file mode 100644 index 0000000000..f14eb270f9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rst/rst.js @@ -0,0 +1,557 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('rst', function (config, options) { + + var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/; + var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/; + var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/; + + var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/; + var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/; + var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/; + + var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://"; + var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})"; + var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*"; + var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path); + + var overlay = { + token: function (stream) { + + if (stream.match(rx_strong) && stream.match (/\W+|$/, false)) + return 'strong'; + if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false)) + return 'em'; + if (stream.match(rx_literal) && stream.match (/\W+|$/, false)) + return 'string-2'; + if (stream.match(rx_number)) + return 'number'; + if (stream.match(rx_positive)) + return 'positive'; + if (stream.match(rx_negative)) + return 'negative'; + if (stream.match(rx_uri)) + return 'link'; + + while (stream.next() != null) { + if (stream.match(rx_strong, false)) break; + if (stream.match(rx_emphasis, false)) break; + if (stream.match(rx_literal, false)) break; + if (stream.match(rx_number, false)) break; + if (stream.match(rx_positive, false)) break; + if (stream.match(rx_negative, false)) break; + if (stream.match(rx_uri, false)) break; + } + + return null; + } + }; + + var mode = CodeMirror.getMode( + config, options.backdrop || 'rst-base' + ); + + return CodeMirror.overlayMode(mode, overlay, true); // combine +}, 'python', 'stex'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +CodeMirror.defineMode('rst-base', function (config) { + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function format(string) { + var args = Array.prototype.slice.call(arguments, 1); + return string.replace(/{(\d+)}/g, function (match, n) { + return typeof args[n] != 'undefined' ? args[n] : match; + }); + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + var mode_python = CodeMirror.getMode(config, 'python'); + var mode_stex = CodeMirror.getMode(config, 'stex'); + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + var SEPA = "\\s+"; + var TAIL = "(?:\\s*|\\W|$)", + rx_TAIL = new RegExp(format('^{0}', TAIL)); + + var NAME = + "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)", + rx_NAME = new RegExp(format('^{0}', NAME)); + var NAME_WWS = + "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)"; + var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS); + + var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)"; + var TEXT2 = "(?:[^\\`]+)", + rx_TEXT2 = new RegExp(format('^{0}', TEXT2)); + + var rx_section = new RegExp( + "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"); + var rx_explicit = new RegExp( + format('^\\.\\.{0}', SEPA)); + var rx_link = new RegExp( + format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL)); + var rx_directive = new RegExp( + format('^{0}::{1}', REF_NAME, TAIL)); + var rx_substitution = new RegExp( + format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL)); + var rx_footnote = new RegExp( + format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL)); + var rx_citation = new RegExp( + format('^\\[{0}\\]{1}', REF_NAME, TAIL)); + + var rx_substitution_ref = new RegExp( + format('^\\|{0}\\|', TEXT1)); + var rx_footnote_ref = new RegExp( + format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME)); + var rx_citation_ref = new RegExp( + format('^\\[{0}\\]_', REF_NAME)); + var rx_link_ref1 = new RegExp( + format('^{0}__?', REF_NAME)); + var rx_link_ref2 = new RegExp( + format('^`{0}`_', TEXT2)); + + var rx_role_pre = new RegExp( + format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL)); + var rx_role_suf = new RegExp( + format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL)); + var rx_role = new RegExp( + format('^:{0}:{1}', NAME, TAIL)); + + var rx_directive_name = new RegExp(format('^{0}', REF_NAME)); + var rx_directive_tail = new RegExp(format('^::{0}', TAIL)); + var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1)); + var rx_substitution_sepa = new RegExp(format('^{0}', SEPA)); + var rx_substitution_name = new RegExp(format('^{0}', REF_NAME)); + var rx_substitution_tail = new RegExp(format('^::{0}', TAIL)); + var rx_link_head = new RegExp("^_"); + var rx_link_name = new RegExp(format('^{0}|_', REF_NAME)); + var rx_link_tail = new RegExp(format('^:{0}', TAIL)); + + var rx_verbatim = new RegExp('^::\\s*$'); + var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s'); + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_normal(stream, state) { + var token = null; + + if (stream.sol() && stream.match(rx_examples, false)) { + change(state, to_mode, { + mode: mode_python, local: CodeMirror.startState(mode_python) + }); + } else if (stream.sol() && stream.match(rx_explicit)) { + change(state, to_explicit); + token = 'meta'; + } else if (stream.sol() && stream.match(rx_section)) { + change(state, to_normal); + token = 'header'; + } else if (phase(state) == rx_role_pre || + stream.match(rx_role_pre, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role_pre, 1)); + stream.match(/^:/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role_pre, 2)); + stream.match(rx_NAME); + token = 'keyword'; + + if (stream.current().match(/^(?:math|latex)/)) { + state.tmp_stex = true; + } + break; + case 2: + change(state, to_normal, context(rx_role_pre, 3)); + stream.match(/^:`/); + token = 'meta'; + break; + case 3: + if (state.tmp_stex) { + state.tmp_stex = undefined; state.tmp = { + mode: mode_stex, local: CodeMirror.startState(mode_stex) + }; + } + + if (state.tmp) { + if (stream.peek() == '`') { + change(state, to_normal, context(rx_role_pre, 4)); + state.tmp = undefined; + break; + } + + token = state.tmp.mode.token(stream, state.tmp.local); + break; + } + + change(state, to_normal, context(rx_role_pre, 4)); + stream.match(rx_TEXT2); + token = 'string'; + break; + case 4: + change(state, to_normal, context(rx_role_pre, 5)); + stream.match(/^`/); + token = 'meta'; + break; + case 5: + change(state, to_normal, context(rx_role_pre, 6)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_role_suf || + stream.match(rx_role_suf, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role_suf, 1)); + stream.match(/^`/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role_suf, 2)); + stream.match(rx_TEXT2); + token = 'string'; + break; + case 2: + change(state, to_normal, context(rx_role_suf, 3)); + stream.match(/^`:/); + token = 'meta'; + break; + case 3: + change(state, to_normal, context(rx_role_suf, 4)); + stream.match(rx_NAME); + token = 'keyword'; + break; + case 4: + change(state, to_normal, context(rx_role_suf, 5)); + stream.match(/^:/); + token = 'meta'; + break; + case 5: + change(state, to_normal, context(rx_role_suf, 6)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_role || stream.match(rx_role, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_role, 1)); + stream.match(/^:/); + token = 'meta'; + break; + case 1: + change(state, to_normal, context(rx_role, 2)); + stream.match(rx_NAME); + token = 'keyword'; + break; + case 2: + change(state, to_normal, context(rx_role, 3)); + stream.match(/^:/); + token = 'meta'; + break; + case 3: + change(state, to_normal, context(rx_role, 4)); + stream.match(rx_TAIL); + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_substitution_ref || + stream.match(rx_substitution_ref, false)) { + + switch (stage(state)) { + case 0: + change(state, to_normal, context(rx_substitution_ref, 1)); + stream.match(rx_substitution_text); + token = 'variable-2'; + break; + case 1: + change(state, to_normal, context(rx_substitution_ref, 2)); + if (stream.match(/^_?_?/)) token = 'link'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_footnote_ref)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_citation_ref)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_link_ref1)) { + change(state, to_normal); + if (!stream.peek() || stream.peek().match(/^\W$/)) { + token = 'link'; + } + } else if (phase(state) == rx_link_ref2 || + stream.match(rx_link_ref2, false)) { + + switch (stage(state)) { + case 0: + if (!stream.peek() || stream.peek().match(/^\W$/)) { + change(state, to_normal, context(rx_link_ref2, 1)); + } else { + stream.match(rx_link_ref2); + } + break; + case 1: + change(state, to_normal, context(rx_link_ref2, 2)); + stream.match(/^`/); + token = 'link'; + break; + case 2: + change(state, to_normal, context(rx_link_ref2, 3)); + stream.match(rx_TEXT2); + break; + case 3: + change(state, to_normal, context(rx_link_ref2, 4)); + stream.match(/^`_/); + token = 'link'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_verbatim)) { + change(state, to_verbatim); + } + + else { + if (stream.next()) change(state, to_normal); + } + + return token; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_explicit(stream, state) { + var token = null; + + if (phase(state) == rx_substitution || + stream.match(rx_substitution, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_substitution, 1)); + stream.match(rx_substitution_text); + token = 'variable-2'; + break; + case 1: + change(state, to_explicit, context(rx_substitution, 2)); + stream.match(rx_substitution_sepa); + break; + case 2: + change(state, to_explicit, context(rx_substitution, 3)); + stream.match(rx_substitution_name); + token = 'keyword'; + break; + case 3: + change(state, to_explicit, context(rx_substitution, 4)); + stream.match(rx_substitution_tail); + token = 'meta'; + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_directive || + stream.match(rx_directive, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_directive, 1)); + stream.match(rx_directive_name); + token = 'keyword'; + + if (stream.current().match(/^(?:math|latex)/)) + state.tmp_stex = true; + else if (stream.current().match(/^python/)) + state.tmp_py = true; + break; + case 1: + change(state, to_explicit, context(rx_directive, 2)); + stream.match(rx_directive_tail); + token = 'meta'; + + if (stream.match(/^latex\s*$/) || state.tmp_stex) { + state.tmp_stex = undefined; change(state, to_mode, { + mode: mode_stex, local: CodeMirror.startState(mode_stex) + }); + } + break; + case 2: + change(state, to_explicit, context(rx_directive, 3)); + if (stream.match(/^python\s*$/) || state.tmp_py) { + state.tmp_py = undefined; change(state, to_mode, { + mode: mode_python, local: CodeMirror.startState(mode_python) + }); + } + break; + default: + change(state, to_normal); + } + } else if (phase(state) == rx_link || stream.match(rx_link, false)) { + + switch (stage(state)) { + case 0: + change(state, to_explicit, context(rx_link, 1)); + stream.match(rx_link_head); + stream.match(rx_link_name); + token = 'link'; + break; + case 1: + change(state, to_explicit, context(rx_link, 2)); + stream.match(rx_link_tail); + token = 'meta'; + break; + default: + change(state, to_normal); + } + } else if (stream.match(rx_footnote)) { + change(state, to_normal); + token = 'quote'; + } else if (stream.match(rx_citation)) { + change(state, to_normal); + token = 'quote'; + } + + else { + stream.eatSpace(); + if (stream.eol()) { + change(state, to_normal); + } else { + stream.skipToEnd(); + change(state, to_comment); + token = 'comment'; + } + } + + return token; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_comment(stream, state) { + return as_block(stream, state, 'comment'); + } + + function to_verbatim(stream, state) { + return as_block(stream, state, 'meta'); + } + + function as_block(stream, state, token) { + if (stream.eol() || stream.eatSpace()) { + stream.skipToEnd(); + return token; + } else { + change(state, to_normal); + return null; + } + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function to_mode(stream, state) { + + if (state.ctx.mode && state.ctx.local) { + + if (stream.sol()) { + if (!stream.eatSpace()) change(state, to_normal); + return null; + } + + return state.ctx.mode.token(stream, state.ctx.local); + } + + change(state, to_normal); + return null; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + function context(phase, stage, mode, local) { + return {phase: phase, stage: stage, mode: mode, local: local}; + } + + function change(state, tok, ctx) { + state.tok = tok; + state.ctx = ctx || {}; + } + + function stage(state) { + return state.ctx.stage || 0; + } + + function phase(state) { + return state.ctx.phase; + } + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + return { + startState: function () { + return {tok: to_normal, ctx: context(undefined, 0)}; + }, + + copyState: function (state) { + var ctx = state.ctx, tmp = state.tmp; + if (ctx.local) + ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)}; + if (tmp) + tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)}; + return {tok: state.tok, ctx: ctx, tmp: tmp}; + }, + + innerMode: function (state) { + return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode} + : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode} + : null; + }, + + token: function (stream, state) { + return state.tok(stream, state); + } + }; +}, 'python', 'stex'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +CodeMirror.defineMIME('text/x-rst', 'rst'); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ruby/ruby.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ruby/ruby.js new file mode 100644 index 0000000000..85bbfc657f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ruby/ruby.js @@ -0,0 +1,303 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function wordObj(words) { + var o = {}; + for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; + return o; +} + +var keywordList = [ + "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else", + "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or", + "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", + "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc", + "caller", "lambda", "proc", "public", "protected", "private", "require", "load", + "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__" +], keywords = wordObj(keywordList); + +var indentWords = wordObj(["def", "class", "case", "for", "while", "until", "module", "then", + "catch", "loop", "proc", "begin"]); +var dedentWords = wordObj(["end", "until"]); +var opening = {"[": "]", "{": "}", "(": ")"}; +var closing = {"]": "[", "}": "{", ")": "("}; + +CodeMirror.defineMode("ruby", function(config) { + var curPunc; + + function chain(newtok, stream, state) { + state.tokenize.push(newtok); + return newtok(stream, state); + } + + function tokenBase(stream, state) { + if (stream.sol() && stream.match("=begin") && stream.eol()) { + state.tokenize.push(readBlockComment); + return "comment"; + } + if (stream.eatSpace()) return null; + var ch = stream.next(), m; + if (ch == "`" || ch == "'" || ch == '"') { + return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state); + } else if (ch == "/") { + if (regexpAhead(stream)) + return chain(readQuoted(ch, "string-2", true), stream, state); + else + return "operator"; + } else if (ch == "%") { + var style = "string", embed = true; + if (stream.eat("s")) style = "atom"; + else if (stream.eat(/[WQ]/)) style = "string"; + else if (stream.eat(/[r]/)) style = "string-2"; + else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; } + var delim = stream.eat(/[^\w\s=]/); + if (!delim) return "operator"; + if (opening.propertyIsEnumerable(delim)) delim = opening[delim]; + return chain(readQuoted(delim, style, embed, true), stream, state); + } else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } else if (ch == "<" && (m = stream.match(/^<([-~])[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) { + return chain(readHereDoc(m[2], m[1]), stream, state); + } else if (ch == "0") { + if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/); + else if (stream.eat("b")) stream.eatWhile(/[01]/); + else stream.eatWhile(/[0-7]/); + return "number"; + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/); + return "number"; + } else if (ch == "?") { + while (stream.match(/^\\[CM]-/)) {} + if (stream.eat("\\")) stream.eatWhile(/\w/); + else stream.next(); + return "string"; + } else if (ch == ":") { + if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state); + if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state); + + // :> :>> :< :<< are valid symbols + if (stream.eat(/[\<\>]/)) { + stream.eat(/[\<\>]/); + return "atom"; + } + + // :+ :- :/ :* :| :& :! are valid symbols + if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) { + return "atom"; + } + + // Symbols can't start by a digit + if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) { + stream.eatWhile(/[\w$\xa1-\uffff]/); + // Only one ? ! = is allowed and only as the last character + stream.eat(/[\?\!\=]/); + return "atom"; + } + return "operator"; + } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) { + stream.eat("@"); + stream.eatWhile(/[\w\xa1-\uffff]/); + return "variable-2"; + } else if (ch == "$") { + if (stream.eat(/[a-zA-Z_]/)) { + stream.eatWhile(/[\w]/); + } else if (stream.eat(/\d/)) { + stream.eat(/\d/); + } else { + stream.next(); // Must be a special global like $: or $! + } + return "variable-3"; + } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) { + stream.eatWhile(/[\w\xa1-\uffff]/); + stream.eat(/[\?\!]/); + if (stream.eat(":")) return "atom"; + return "ident"; + } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) { + curPunc = "|"; + return null; + } else if (/[\(\)\[\]{}\\;]/.test(ch)) { + curPunc = ch; + return null; + } else if (ch == "-" && stream.eat(">")) { + return "arrow"; + } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) { + var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/); + if (ch == "." && !more) curPunc = "."; + return "operator"; + } else { + return null; + } + } + + function regexpAhead(stream) { + var start = stream.pos, depth = 0, next, found = false, escaped = false + while ((next = stream.next()) != null) { + if (!escaped) { + if ("[{(".indexOf(next) > -1) { + depth++ + } else if ("]})".indexOf(next) > -1) { + depth-- + if (depth < 0) break + } else if (next == "/" && depth == 0) { + found = true + break + } + escaped = next == "\\" + } else { + escaped = false + } + } + stream.backUp(stream.pos - start) + return found + } + + function tokenBaseUntilBrace(depth) { + if (!depth) depth = 1; + return function(stream, state) { + if (stream.peek() == "}") { + if (depth == 1) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } else { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1); + } + } else if (stream.peek() == "{") { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1); + } + return tokenBase(stream, state); + }; + } + function tokenBaseOnce() { + var alreadyCalled = false; + return function(stream, state) { + if (alreadyCalled) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } + alreadyCalled = true; + return tokenBase(stream, state); + }; + } + function readQuoted(quote, style, embed, unescaped) { + return function(stream, state) { + var escaped = false, ch; + + if (state.context.type === 'read-quoted-paused') { + state.context = state.context.prev; + stream.eat("}"); + } + + while ((ch = stream.next()) != null) { + if (ch == quote && (unescaped || !escaped)) { + state.tokenize.pop(); + break; + } + if (embed && ch == "#" && !escaped) { + if (stream.eat("{")) { + if (quote == "}") { + state.context = {prev: state.context, type: 'read-quoted-paused'}; + } + state.tokenize.push(tokenBaseUntilBrace()); + break; + } else if (/[@\$]/.test(stream.peek())) { + state.tokenize.push(tokenBaseOnce()); + break; + } + } + escaped = !escaped && ch == "\\"; + } + return style; + }; + } + function readHereDoc(phrase, mayIndent) { + return function(stream, state) { + if (mayIndent) stream.eatSpace() + if (stream.match(phrase)) state.tokenize.pop(); + else stream.skipToEnd(); + return "string"; + }; + } + function readBlockComment(stream, state) { + if (stream.sol() && stream.match("=end") && stream.eol()) + state.tokenize.pop(); + stream.skipToEnd(); + return "comment"; + } + + return { + startState: function() { + return {tokenize: [tokenBase], + indented: 0, + context: {type: "top", indented: -config.indentUnit}, + continuedLine: false, + lastTok: null, + varList: false}; + }, + + token: function(stream, state) { + curPunc = null; + if (stream.sol()) state.indented = stream.indentation(); + var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype; + var thisTok = curPunc; + if (style == "ident") { + var word = stream.current(); + style = state.lastTok == "." ? "property" + : keywords.propertyIsEnumerable(stream.current()) ? "keyword" + : /^[A-Z]/.test(word) ? "tag" + : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def" + : "variable"; + if (style == "keyword") { + thisTok = word; + if (indentWords.propertyIsEnumerable(word)) kwtype = "indent"; + else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent"; + else if ((word == "if" || word == "unless") && stream.column() == stream.indentation()) + kwtype = "indent"; + else if (word == "do" && state.context.indented < state.indented) + kwtype = "indent"; + } + } + if (curPunc || (style && style != "comment")) state.lastTok = thisTok; + if (curPunc == "|") state.varList = !state.varList; + + if (kwtype == "indent" || /[\(\[\{]/.test(curPunc)) + state.context = {prev: state.context, type: curPunc || style, indented: state.indented}; + else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev) + state.context = state.context.prev; + + if (stream.eol()) + state.continuedLine = (curPunc == "\\" || style == "operator"); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize[state.tokenize.length-1] != tokenBase) return CodeMirror.Pass; + var firstChar = textAfter && textAfter.charAt(0); + var ct = state.context; + var closed = ct.type == closing[firstChar] || + ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter); + return ct.indented + (closed ? 0 : config.indentUnit) + + (state.continuedLine ? config.indentUnit : 0); + }, + + electricInput: /^\s*(?:end|rescue|elsif|else|\})$/, + lineComment: "#", + fold: "indent" + }; +}); + +CodeMirror.defineMIME("text/x-ruby", "ruby"); + +CodeMirror.registerHelper("hintWords", "ruby", keywordList); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rust/rust.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rust/rust.js new file mode 100644 index 0000000000..f95f320d08 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/rust/rust.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/simple"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineSimpleMode("rust",{ + start: [ + // string and byte string + {regex: /b?"/, token: "string", next: "string"}, + // raw string and raw byte string + {regex: /b?r"/, token: "string", next: "string_raw"}, + {regex: /b?r#+"/, token: "string", next: "string_raw_hash"}, + // character + {regex: /'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/, token: "string-2"}, + // byte + {regex: /b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/, token: "string-2"}, + + {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/, + token: "number"}, + {regex: /(let(?:\s+mut)?|fn|enum|mod|struct|type|union)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: ["keyword", null, "def"]}, + {regex: /(?:abstract|alignof|as|async|await|box|break|continue|const|crate|do|dyn|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/, token: "keyword"}, + {regex: /\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/, token: "atom"}, + {regex: /\b(?:true|false|Some|None|Ok|Err)\b/, token: "builtin"}, + {regex: /\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, + token: ["keyword", null ,"def"]}, + {regex: /#!?\[.*\]/, token: "meta"}, + {regex: /\/\/.*/, token: "comment"}, + {regex: /\/\*/, token: "comment", next: "comment"}, + {regex: /[-+\/*=<>!]+/, token: "operator"}, + {regex: /[a-zA-Z_]\w*!/,token: "variable-3"}, + {regex: /[a-zA-Z_]\w*/, token: "variable"}, + {regex: /[\{\[\(]/, indent: true}, + {regex: /[\}\]\)]/, dedent: true} + ], + string: [ + {regex: /"/, token: "string", next: "start"}, + {regex: /(?:[^\\"]|\\(?:.|$))*/, token: "string"} + ], + string_raw: [ + {regex: /"/, token: "string", next: "start"}, + {regex: /[^"]*/, token: "string"} + ], + string_raw_hash: [ + {regex: /"#+/, token: "string", next: "start"}, + {regex: /(?:[^"]|"(?!#))*/, token: "string"} + ], + comment: [ + {regex: /.*?\*\//, token: "comment", next: "start"}, + {regex: /.*/, token: "comment"} + ], + meta: { + dontIndentStates: ["comment"], + electricInput: /^\s*\}$/, + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "brace" + } +}); + + +CodeMirror.defineMIME("text/x-rustsrc", "rust"); +CodeMirror.defineMIME("text/rust", "rust"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sas/sas.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sas/sas.js new file mode 100644 index 0000000000..49b96b66de --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sas/sas.js @@ -0,0 +1,303 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + + +// SAS mode copyright (c) 2016 Jared Dean, SAS Institute +// Created by Jared Dean + +// TODO +// indent and de-indent +// identify macro variables + + +//Definitions +// comment -- text within * ; or /* */ +// keyword -- SAS language variable +// variable -- macro variables starts with '&' or variable formats +// variable-2 -- DATA Step, proc, or macro names +// string -- text within ' ' or " " +// operator -- numeric operator + / - * ** le eq ge ... and so on +// builtin -- proc %macro data run mend +// atom +// def + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("sas", function () { + var words = {}; + var isDoubleOperatorSym = { + eq: 'operator', + lt: 'operator', + le: 'operator', + gt: 'operator', + ge: 'operator', + "in": 'operator', + ne: 'operator', + or: 'operator' + }; + var isDoubleOperatorChar = /(<=|>=|!=|<>)/; + var isSingleOperatorChar = /[=\(:\),{}.*<>+\-\/^\[\]]/; + + // Takes a string of words separated by spaces and adds them as + // keys with the value of the first argument 'style' + function define(style, string, context) { + if (context) { + var split = string.split(' '); + for (var i = 0; i < split.length; i++) { + words[split[i]] = {style: style, state: context}; + } + } + } + //datastep + define('def', 'stack pgm view source debug nesting nolist', ['inDataStep']); + define('def', 'if while until for do do; end end; then else cancel', ['inDataStep']); + define('def', 'label format _n_ _error_', ['inDataStep']); + define('def', 'ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME', ['inDataStep']); + define('def', 'filevar finfo finv fipname fipnamel fipstate first firstobs floor', ['inDataStep']); + define('def', 'varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday', ['inDataStep']); + define('def', 'zipfips zipname zipnamel zipstate', ['inDataStep']); + define('def', 'put putc putn', ['inDataStep']); + define('builtin', 'data run', ['inDataStep']); + + + //proc + define('def', 'data', ['inProc']); + + // flow control for macros + define('def', '%if %end %end; %else %else; %do %do; %then', ['inMacro']); + + //everywhere + define('builtin', 'proc run; quit; libname filename %macro %mend option options', ['ALL']); + + define('def', 'footnote title libname ods', ['ALL']); + define('def', '%let %put %global %sysfunc %eval ', ['ALL']); + // automatic macro variables http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a003167023.htm + define('variable', '&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext', ['ALL']); + + //footnote[1-9]? title[1-9]? + + //options statement + define('def', 'source2 nosource2 page pageno pagesize', ['ALL']); + + //proc and datastep + define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddfm ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref fmterr fmtsearch fnonct fnote font fontalias fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs on open order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2 paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps pw pwreq qtr quote r ranbin rancau random ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni rcorr read recfm register regr remote remove rename repeat repeated replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover sub subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq min max', ['inDataStep', 'inProc']); + define('operator', 'and not ', ['inDataStep', 'inProc']); + + // Main function + function tokenize(stream, state) { + // Finally advance the stream + var ch = stream.next(); + + // BLOCKCOMMENT + if (ch === '/' && stream.eat('*')) { + state.continueComment = true; + return "comment"; + } else if (state.continueComment === true) { // in comment block + //comment ends at the beginning of the line + if (ch === '*' && stream.peek() === '/') { + stream.next(); + state.continueComment = false; + } else if (stream.skipTo('*')) { //comment is potentially later in line + stream.skipTo('*'); + stream.next(); + if (stream.eat('/')) + state.continueComment = false; + } else { + stream.skipToEnd(); + } + return "comment"; + } + + if (ch == "*" && stream.column() == stream.indentation()) { + stream.skipToEnd() + return "comment" + } + + // DoubleOperator match + var doubleOperator = ch + stream.peek(); + + if ((ch === '"' || ch === "'") && !state.continueString) { + state.continueString = ch + return "string" + } else if (state.continueString) { + if (state.continueString == ch) { + state.continueString = null; + } else if (stream.skipTo(state.continueString)) { + // quote found on this line + stream.next(); + state.continueString = null; + } else { + stream.skipToEnd(); + } + return "string"; + } else if (state.continueString !== null && stream.eol()) { + stream.skipTo(state.continueString) || stream.skipToEnd(); + return "string"; + } else if (/[\d\.]/.test(ch)) { //find numbers + if (ch === ".") + stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); + else if (ch === "0") + stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); + else + stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); + return "number"; + } else if (isDoubleOperatorChar.test(ch + stream.peek())) { // TWO SYMBOL TOKENS + stream.next(); + return "operator"; + } else if (isDoubleOperatorSym.hasOwnProperty(doubleOperator)) { + stream.next(); + if (stream.peek() === ' ') + return isDoubleOperatorSym[doubleOperator.toLowerCase()]; + } else if (isSingleOperatorChar.test(ch)) { // SINGLE SYMBOL TOKENS + return "operator"; + } + + // Matches one whole word -- even if the word is a character + var word; + if (stream.match(/[%&;\w]+/, false) != null) { + word = ch + stream.match(/[%&;\w]+/, true); + if (/&/.test(word)) return 'variable' + } else { + word = ch; + } + // the word after DATA PROC or MACRO + if (state.nextword) { + stream.match(/[\w]+/); + // match memname.libname + if (stream.peek() === '.') stream.skipTo(' '); + state.nextword = false; + return 'variable-2'; + } + + word = word.toLowerCase() + // Are we in a DATA Step? + if (state.inDataStep) { + if (word === 'run;' || stream.match(/run\s;/)) { + state.inDataStep = false; + return 'builtin'; + } + // variable formats + if ((word) && stream.next() === '.') { + //either a format or libname.memname + if (/\w/.test(stream.peek())) return 'variable-2'; + else return 'variable'; + } + // do we have a DATA Step keyword + if (word && words.hasOwnProperty(word) && + (words[word].state.indexOf("inDataStep") !== -1 || + words[word].state.indexOf("ALL") !== -1)) { + //backup to the start of the word + if (stream.start < stream.pos) + stream.backUp(stream.pos - stream.start); + //advance the length of the word and return + for (var i = 0; i < word.length; ++i) stream.next(); + return words[word].style; + } + } + // Are we in an Proc statement? + if (state.inProc) { + if (word === 'run;' || word === 'quit;') { + state.inProc = false; + return 'builtin'; + } + // do we have a proc keyword + if (word && words.hasOwnProperty(word) && + (words[word].state.indexOf("inProc") !== -1 || + words[word].state.indexOf("ALL") !== -1)) { + stream.match(/[\w]+/); + return words[word].style; + } + } + // Are we in a Macro statement? + if (state.inMacro) { + if (word === '%mend') { + if (stream.peek() === ';') stream.next(); + state.inMacro = false; + return 'builtin'; + } + if (word && words.hasOwnProperty(word) && + (words[word].state.indexOf("inMacro") !== -1 || + words[word].state.indexOf("ALL") !== -1)) { + stream.match(/[\w]+/); + return words[word].style; + } + + return 'atom'; + } + // Do we have Keywords specific words? + if (word && words.hasOwnProperty(word)) { + // Negates the initial next() + stream.backUp(1); + // Actually move the stream + stream.match(/[\w]+/); + if (word === 'data' && /=/.test(stream.peek()) === false) { + state.inDataStep = true; + state.nextword = true; + return 'builtin'; + } + if (word === 'proc') { + state.inProc = true; + state.nextword = true; + return 'builtin'; + } + if (word === '%macro') { + state.inMacro = true; + state.nextword = true; + return 'builtin'; + } + if (/title[1-9]/.test(word)) return 'def'; + + if (word === 'footnote') { + stream.eat(/[1-9]/); + return 'def'; + } + + // Returns their value as state in the prior define methods + if (state.inDataStep === true && words[word].state.indexOf("inDataStep") !== -1) + return words[word].style; + if (state.inProc === true && words[word].state.indexOf("inProc") !== -1) + return words[word].style; + if (state.inMacro === true && words[word].state.indexOf("inMacro") !== -1) + return words[word].style; + if (words[word].state.indexOf("ALL") !== -1) + return words[word].style; + return null; + } + // Unrecognized syntax + return null; + } + + return { + startState: function () { + return { + inDataStep: false, + inProc: false, + inMacro: false, + nextword: false, + continueString: null, + continueComment: false + }; + }, + token: function (stream, state) { + // Strip the spaces, but regex will account for them either way + if (stream.eatSpace()) return null; + // Go through the main process + return tokenize(stream, state); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/" + }; + + }); + + CodeMirror.defineMIME("text/x-sas", "sas"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sass/sass.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sass/sass.js new file mode 100644 index 0000000000..d8427bff57 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sass/sass.js @@ -0,0 +1,459 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../css/css")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../css/css"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sass", function(config) { + var cssMode = CodeMirror.mimeModes["text/css"]; + var propertyKeywords = cssMode.propertyKeywords || {}, + colorKeywords = cssMode.colorKeywords || {}, + valueKeywords = cssMode.valueKeywords || {}, + fontProperties = cssMode.fontProperties || {}; + + function tokenRegexp(words) { + return new RegExp("^" + words.join("|")); + } + + var keywords = ["true", "false", "null", "auto"]; + var keywordsRegexp = new RegExp("^" + keywords.join("|")); + + var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", + "\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"]; + var opRegexp = tokenRegexp(operators); + + var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/; + + var word; + + function isEndLine(stream) { + return !stream.peek() || stream.match(/\s+$/, false); + } + + function urlTokens(stream, state) { + var ch = stream.peek(); + + if (ch === ")") { + stream.next(); + state.tokenizer = tokenBase; + return "operator"; + } else if (ch === "(") { + stream.next(); + stream.eatSpace(); + + return "operator"; + } else if (ch === "'" || ch === '"') { + state.tokenizer = buildStringTokenizer(stream.next()); + return "string"; + } else { + state.tokenizer = buildStringTokenizer(")", false); + return "string"; + } + } + function comment(indentation, multiLine) { + return function(stream, state) { + if (stream.sol() && stream.indentation() <= indentation) { + state.tokenizer = tokenBase; + return tokenBase(stream, state); + } + + if (multiLine && stream.skipTo("*/")) { + stream.next(); + stream.next(); + state.tokenizer = tokenBase; + } else { + stream.skipToEnd(); + } + + return "comment"; + }; + } + + function buildStringTokenizer(quote, greedy) { + if (greedy == null) { greedy = true; } + + function stringTokenizer(stream, state) { + var nextChar = stream.next(); + var peekChar = stream.peek(); + var previousChar = stream.string.charAt(stream.pos-2); + + var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\")); + + if (endingString) { + if (nextChar !== quote && greedy) { stream.next(); } + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + state.tokenizer = tokenBase; + return "string"; + } else if (nextChar === "#" && peekChar === "{") { + state.tokenizer = buildInterpolationTokenizer(stringTokenizer); + stream.next(); + return "operator"; + } else { + return "string"; + } + } + + return stringTokenizer; + } + + function buildInterpolationTokenizer(currentTokenizer) { + return function(stream, state) { + if (stream.peek() === "}") { + stream.next(); + state.tokenizer = currentTokenizer; + return "operator"; + } else { + return tokenBase(stream, state); + } + }; + } + + function indent(state) { + if (state.indentCount == 0) { + state.indentCount++; + var lastScopeOffset = state.scopes[0].offset; + var currentOffset = lastScopeOffset + config.indentUnit; + state.scopes.unshift({ offset:currentOffset }); + } + } + + function dedent(state) { + if (state.scopes.length == 1) return; + + state.scopes.shift(); + } + + function tokenBase(stream, state) { + var ch = stream.peek(); + + // Comment + if (stream.match("/*")) { + state.tokenizer = comment(stream.indentation(), true); + return state.tokenizer(stream, state); + } + if (stream.match("//")) { + state.tokenizer = comment(stream.indentation(), false); + return state.tokenizer(stream, state); + } + + // Interpolation + if (stream.match("#{")) { + state.tokenizer = buildInterpolationTokenizer(tokenBase); + return "operator"; + } + + // Strings + if (ch === '"' || ch === "'") { + stream.next(); + state.tokenizer = buildStringTokenizer(ch); + return "string"; + } + + if(!state.cursorHalf){// state.cursorHalf === 0 + // first half i.e. before : for key-value pairs + // including selectors + + if (ch === "-") { + if (stream.match(/^-\w+-/)) { + return "meta"; + } + } + + if (ch === ".") { + stream.next(); + if (stream.match(/^[\w-]+/)) { + indent(state); + return "qualifier"; + } else if (stream.peek() === "#") { + indent(state); + return "tag"; + } + } + + if (ch === "#") { + stream.next(); + // ID selectors + if (stream.match(/^[\w-]+/)) { + indent(state); + return "builtin"; + } + if (stream.peek() === "#") { + indent(state); + return "tag"; + } + } + + // Variables + if (ch === "$") { + stream.next(); + stream.eatWhile(/[\w-]/); + return "variable-2"; + } + + // Numbers + if (stream.match(/^-?[0-9\.]+/)) + return "number"; + + // Units + if (stream.match(/^(px|em|in)\b/)) + return "unit"; + + if (stream.match(keywordsRegexp)) + return "keyword"; + + if (stream.match(/^url/) && stream.peek() === "(") { + state.tokenizer = urlTokens; + return "atom"; + } + + if (ch === "=") { + // Match shortcut mixin definition + if (stream.match(/^=[\w-]+/)) { + indent(state); + return "meta"; + } + } + + if (ch === "+") { + // Match shortcut mixin definition + if (stream.match(/^\+[\w-]+/)){ + return "variable-3"; + } + } + + if(ch === "@"){ + if(stream.match('@extend')){ + if(!stream.match(/\s*[\w]/)) + dedent(state); + } + } + + + // Indent Directives + if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) { + indent(state); + return "def"; + } + + // Other Directives + if (ch === "@") { + stream.next(); + stream.eatWhile(/[\w-]/); + return "def"; + } + + if (stream.eatWhile(/[\w-]/)){ + if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){ + word = stream.current().toLowerCase(); + var prop = state.prevProp + "-" + word; + if (propertyKeywords.hasOwnProperty(prop)) { + return "property"; + } else if (propertyKeywords.hasOwnProperty(word)) { + state.prevProp = word; + return "property"; + } else if (fontProperties.hasOwnProperty(word)) { + return "property"; + } + return "tag"; + } + else if(stream.match(/ *:/,false)){ + indent(state); + state.cursorHalf = 1; + state.prevProp = stream.current().toLowerCase(); + return "property"; + } + else if(stream.match(/ *,/,false)){ + return "tag"; + } + else{ + indent(state); + return "tag"; + } + } + + if(ch === ":"){ + if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element + return "variable-3"; + } + stream.next(); + state.cursorHalf=1; + return "operator"; + } + + } // cursorHalf===0 ends here + else{ + + if (ch === "#") { + stream.next(); + // Hex numbers + if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "number"; + } + } + + // Numbers + if (stream.match(/^-?[0-9\.]+/)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "number"; + } + + // Units + if (stream.match(/^(px|em|in)\b/)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "unit"; + } + + if (stream.match(keywordsRegexp)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "keyword"; + } + + if (stream.match(/^url/) && stream.peek() === "(") { + state.tokenizer = urlTokens; + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "atom"; + } + + // Variables + if (ch === "$") { + stream.next(); + stream.eatWhile(/[\w-]/); + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "variable-2"; + } + + // bang character for !important, !default, etc. + if (ch === "!") { + stream.next(); + state.cursorHalf = 0; + return stream.match(/^[\w]+/) ? "keyword": "operator"; + } + + if (stream.match(opRegexp)){ + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + return "operator"; + } + + // attributes + if (stream.eatWhile(/[\w-]/)) { + if (isEndLine(stream)) { + state.cursorHalf = 0; + } + word = stream.current().toLowerCase(); + if (valueKeywords.hasOwnProperty(word)) { + return "atom"; + } else if (colorKeywords.hasOwnProperty(word)) { + return "keyword"; + } else if (propertyKeywords.hasOwnProperty(word)) { + state.prevProp = stream.current().toLowerCase(); + return "property"; + } else { + return "tag"; + } + } + + //stream.eatSpace(); + if (isEndLine(stream)) { + state.cursorHalf = 0; + return null; + } + + } // else ends here + + if (stream.match(opRegexp)) + return "operator"; + + // If we haven't returned by now, we move 1 character + // and return an error + stream.next(); + return null; + } + + function tokenLexer(stream, state) { + if (stream.sol()) state.indentCount = 0; + var style = state.tokenizer(stream, state); + var current = stream.current(); + + if (current === "@return" || current === "}"){ + dedent(state); + } + + if (style !== null) { + var startOfToken = stream.pos - current.length; + + var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount); + + var newScopes = []; + + for (var i = 0; i < state.scopes.length; i++) { + var scope = state.scopes[i]; + + if (scope.offset <= withCurrentIndent) + newScopes.push(scope); + } + + state.scopes = newScopes; + } + + + return style; + } + + return { + startState: function() { + return { + tokenizer: tokenBase, + scopes: [{offset: 0, type: "sass"}], + indentCount: 0, + cursorHalf: 0, // cursor half tells us if cursor lies after (1) + // or before (0) colon (well... more or less) + definedVars: [], + definedMixins: [] + }; + }, + token: function(stream, state) { + var style = tokenLexer(stream, state); + + state.lastToken = { style: style, content: stream.current() }; + + return style; + }, + + indent: function(state) { + return state.scopes[0].offset; + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "indent" + }; +}, "css"); + +CodeMirror.defineMIME("text/x-sass", "sass"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/scheme/scheme.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/scheme/scheme.js new file mode 100644 index 0000000000..d11a132df3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/scheme/scheme.js @@ -0,0 +1,284 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Author: Koh Zi Han, based on implementation by Koh Zi Chun + * Improved by: Jakub T. Jankiewicz + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("scheme", function () { + var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", + SYMBOL = "symbol", ATOM = "atom", NUMBER = "number", BRACKET = "bracket"; + var INDENT_WORD_SKIP = 2; + + function makeKeywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = makeKeywords("λ case-lambda call/cc class cond-expand define-class define-values exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax define-macro defmacro delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"); + var indentKeys = makeKeywords("define let letrec let* lambda define-macro defmacro let-syntax letrec-syntax let-values let*-values define-syntax syntax-rules define-values when unless"); + + function stateStack(indent, type, prev) { // represents a state stack object + this.indent = indent; + this.type = type; + this.prev = prev; + } + + function pushStack(state, indent, type) { + state.indentStack = new stateStack(indent, type, state.indentStack); + } + + function popStack(state) { + state.indentStack = state.indentStack.prev; + } + + var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i); + var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i); + var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i); + var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i); + + function isBinaryNumber (stream) { + return stream.match(binaryMatcher); + } + + function isOctalNumber (stream) { + return stream.match(octalMatcher); + } + + function isDecimalNumber (stream, backup) { + if (backup === true) { + stream.backUp(1); + } + return stream.match(decimalMatcher); + } + + function isHexNumber (stream) { + return stream.match(hexMatcher); + } + + function processEscapedSequence(stream, options) { + var next, escaped = false; + while ((next = stream.next()) != null) { + if (next == options.token && !escaped) { + + options.state.mode = false; + break; + } + escaped = !escaped && next == "\\"; + } + } + + return { + startState: function () { + return { + indentStack: null, + indentation: 0, + mode: false, + sExprComment: false, + sExprQuote: false + }; + }, + + token: function (stream, state) { + if (state.indentStack == null && stream.sol()) { + // update indentation, but only if indentStack is empty + state.indentation = stream.indentation(); + } + + // skip spaces + if (stream.eatSpace()) { + return null; + } + var returnType = null; + + switch(state.mode){ + case "string": // multi-line string parsing mode + processEscapedSequence(stream, { + token: "\"", + state: state + }); + returnType = STRING; // continue on in scheme-string mode + break; + case "symbol": // escape symbol + processEscapedSequence(stream, { + token: "|", + state: state + }); + returnType = SYMBOL; // continue on in scheme-symbol mode + break; + case "comment": // comment parsing mode + var next, maybeEnd = false; + while ((next = stream.next()) != null) { + if (next == "#" && maybeEnd) { + + state.mode = false; + break; + } + maybeEnd = (next == "|"); + } + returnType = COMMENT; + break; + case "s-expr-comment": // s-expr commenting mode + state.mode = false; + if(stream.peek() == "(" || stream.peek() == "["){ + // actually start scheme s-expr commenting mode + state.sExprComment = 0; + }else{ + // if not we just comment the entire of the next token + stream.eatWhile(/[^\s\(\)\[\]]/); // eat symbol atom + returnType = COMMENT; + break; + } + default: // default parsing mode + var ch = stream.next(); + + if (ch == "\"") { + state.mode = "string"; + returnType = STRING; + + } else if (ch == "'") { + if (stream.peek() == "(" || stream.peek() == "["){ + if (typeof state.sExprQuote != "number") { + state.sExprQuote = 0; + } // else already in a quoted expression + returnType = ATOM; + } else { + stream.eatWhile(/[\w_\-!$%&*+\.\/:<=>?@\^~]/); + returnType = ATOM; + } + } else if (ch == '|') { + state.mode = "symbol"; + returnType = SYMBOL; + } else if (ch == '#') { + if (stream.eat("|")) { // Multi-line comment + state.mode = "comment"; // toggle to comment mode + returnType = COMMENT; + } else if (stream.eat(/[tf]/i)) { // #t/#f (atom) + returnType = ATOM; + } else if (stream.eat(';')) { // S-Expr comment + state.mode = "s-expr-comment"; + returnType = COMMENT; + } else { + var numTest = null, hasExactness = false, hasRadix = true; + if (stream.eat(/[ei]/i)) { + hasExactness = true; + } else { + stream.backUp(1); // must be radix specifier + } + if (stream.match(/^#b/i)) { + numTest = isBinaryNumber; + } else if (stream.match(/^#o/i)) { + numTest = isOctalNumber; + } else if (stream.match(/^#x/i)) { + numTest = isHexNumber; + } else if (stream.match(/^#d/i)) { + numTest = isDecimalNumber; + } else if (stream.match(/^[-+0-9.]/, false)) { + hasRadix = false; + numTest = isDecimalNumber; + // re-consume the initial # if all matches failed + } else if (!hasExactness) { + stream.eat('#'); + } + if (numTest != null) { + if (hasRadix && !hasExactness) { + // consume optional exactness after radix + stream.match(/^#[ei]/i); + } + if (numTest(stream)) + returnType = NUMBER; + } + } + } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal + returnType = NUMBER; + } else if (ch == ";") { // comment + stream.skipToEnd(); // rest of the line is a comment + returnType = COMMENT; + } else if (ch == "(" || ch == "[") { + var keyWord = ''; var indentTemp = stream.column(), letter; + /** + Either + (indent-word .. + (non-indent-word .. + (;something else, bracket, etc. + */ + + while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) { + keyWord += letter; + } + + if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word + + pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); + } else { // non-indent word + // we continue eating the spaces + stream.eatSpace(); + if (stream.eol() || stream.peek() == ";") { + // nothing significant after + // we restart indentation 1 space after + pushStack(state, indentTemp + 1, ch); + } else { + pushStack(state, indentTemp + stream.current().length, ch); // else we match + } + } + stream.backUp(stream.current().length - 1); // undo all the eating + + if(typeof state.sExprComment == "number") state.sExprComment++; + if(typeof state.sExprQuote == "number") state.sExprQuote++; + + returnType = BRACKET; + } else if (ch == ")" || ch == "]") { + returnType = BRACKET; + if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) { + popStack(state); + + if(typeof state.sExprComment == "number"){ + if(--state.sExprComment == 0){ + returnType = COMMENT; // final closing bracket + state.sExprComment = false; // turn off s-expr commenting mode + } + } + if(typeof state.sExprQuote == "number"){ + if(--state.sExprQuote == 0){ + returnType = ATOM; // final closing bracket + state.sExprQuote = false; // turn off s-expr quote mode + } + } + } + } else { + stream.eatWhile(/[\w_\-!$%&*+\.\/:<=>?@\^~]/); + + if (keywords && keywords.propertyIsEnumerable(stream.current())) { + returnType = BUILTIN; + } else returnType = "variable"; + } + } + return (typeof state.sExprComment == "number") ? COMMENT : ((typeof state.sExprQuote == "number") ? ATOM : returnType); + }, + + indent: function (state) { + if (state.indentStack == null) return state.indentation; + return state.indentStack.indent; + }, + + fold: "brace-paren", + closeBrackets: {pairs: "()[]{}\"\""}, + lineComment: ";;" + }; +}); + +CodeMirror.defineMIME("text/x-scheme", "scheme"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/shell/shell.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/shell/shell.js new file mode 100644 index 0000000000..8271485f5f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/shell/shell.js @@ -0,0 +1,168 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('shell', function() { + + var words = {}; + function define(style, dict) { + for(var i = 0; i < dict.length; i++) { + words[dict[i]] = style; + } + }; + + var commonAtoms = ["true", "false"]; + var commonKeywords = ["if", "then", "do", "else", "elif", "while", "until", "for", "in", "esac", "fi", + "fin", "fil", "done", "exit", "set", "unset", "export", "function"]; + var commonCommands = ["ab", "awk", "bash", "beep", "cat", "cc", "cd", "chown", "chmod", "chroot", "clear", + "cp", "curl", "cut", "diff", "echo", "find", "gawk", "gcc", "get", "git", "grep", "hg", "kill", "killall", + "ln", "ls", "make", "mkdir", "openssl", "mv", "nc", "nl", "node", "npm", "ping", "ps", "restart", "rm", + "rmdir", "sed", "service", "sh", "shopt", "shred", "source", "sort", "sleep", "ssh", "start", "stop", + "su", "sudo", "svn", "tee", "telnet", "top", "touch", "vi", "vim", "wall", "wc", "wget", "who", "write", + "yes", "zsh"]; + + CodeMirror.registerHelper("hintWords", "shell", commonAtoms.concat(commonKeywords, commonCommands)); + + define('atom', commonAtoms); + define('keyword', commonKeywords); + define('builtin', commonCommands); + + function tokenBase(stream, state) { + if (stream.eatSpace()) return null; + + var sol = stream.sol(); + var ch = stream.next(); + + if (ch === '\\') { + stream.next(); + return null; + } + if (ch === '\'' || ch === '"' || ch === '`') { + state.tokens.unshift(tokenString(ch, ch === "`" ? "quote" : "string")); + return tokenize(stream, state); + } + if (ch === '#') { + if (sol && stream.eat('!')) { + stream.skipToEnd(); + return 'meta'; // 'comment'? + } + stream.skipToEnd(); + return 'comment'; + } + if (ch === '$') { + state.tokens.unshift(tokenDollar); + return tokenize(stream, state); + } + if (ch === '+' || ch === '=') { + return 'operator'; + } + if (ch === '-') { + stream.eat('-'); + stream.eatWhile(/\w/); + return 'attribute'; + } + if (ch == "<") { + if (stream.match("<<")) return "operator" + var heredoc = stream.match(/^<-?\s*['"]?([^'"]*)['"]?/) + if (heredoc) { + state.tokens.unshift(tokenHeredoc(heredoc[1])) + return 'string-2' + } + } + if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + if(stream.eol() || !/\w/.test(stream.peek())) { + return 'number'; + } + } + stream.eatWhile(/[\w-]/); + var cur = stream.current(); + if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; + return words.hasOwnProperty(cur) ? words[cur] : null; + } + + function tokenString(quote, style) { + var close = quote == "(" ? ")" : quote == "{" ? "}" : quote + return function(stream, state) { + var next, escaped = false; + while ((next = stream.next()) != null) { + if (next === close && !escaped) { + state.tokens.shift(); + break; + } else if (next === '$' && !escaped && quote !== "'" && stream.peek() != close) { + escaped = true; + stream.backUp(1); + state.tokens.unshift(tokenDollar); + break; + } else if (!escaped && quote !== close && next === quote) { + state.tokens.unshift(tokenString(quote, style)) + return tokenize(stream, state) + } else if (!escaped && /['"]/.test(next) && !/['"]/.test(quote)) { + state.tokens.unshift(tokenStringStart(next, "string")); + stream.backUp(1); + break; + } + escaped = !escaped && next === '\\'; + } + return style; + }; + }; + + function tokenStringStart(quote, style) { + return function(stream, state) { + state.tokens[0] = tokenString(quote, style) + stream.next() + return tokenize(stream, state) + } + } + + var tokenDollar = function(stream, state) { + if (state.tokens.length > 1) stream.eat('$'); + var ch = stream.next() + if (/['"({]/.test(ch)) { + state.tokens[0] = tokenString(ch, ch == "(" ? "quote" : ch == "{" ? "def" : "string"); + return tokenize(stream, state); + } + if (!/\d/.test(ch)) stream.eatWhile(/\w/); + state.tokens.shift(); + return 'def'; + }; + + function tokenHeredoc(delim) { + return function(stream, state) { + if (stream.sol() && stream.string == delim) state.tokens.shift() + stream.skipToEnd() + return "string-2" + } + } + + function tokenize(stream, state) { + return (state.tokens[0] || tokenBase) (stream, state); + }; + + return { + startState: function() {return {tokens:[]};}, + token: function(stream, state) { + return tokenize(stream, state); + }, + closeBrackets: "()[]{}''\"\"``", + lineComment: '#', + fold: "brace" + }; +}); + +CodeMirror.defineMIME('text/x-sh', 'shell'); +// Apache uses a slightly different Media Type for Shell scripts +// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +CodeMirror.defineMIME('application/x-sh', 'shell'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sieve/sieve.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sieve/sieve.js new file mode 100644 index 0000000000..b7236401a7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sieve/sieve.js @@ -0,0 +1,193 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sieve", function(config) { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = words("if elsif else stop require"); + var atoms = words("true false not"); + var indentUnit = config.indentUnit; + + function tokenBase(stream, state) { + + var ch = stream.next(); + if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + + if (ch === '#') { + stream.skipToEnd(); + return "comment"; + } + + if (ch == "\"") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + + if (ch == "(") { + state._indent.push("("); + // add virtual angel wings so that editor behaves... + // ...more sane in case of broken brackets + state._indent.push("{"); + return null; + } + + if (ch === "{") { + state._indent.push("{"); + return null; + } + + if (ch == ")") { + state._indent.pop(); + state._indent.pop(); + } + + if (ch === "}") { + state._indent.pop(); + return null; + } + + if (ch == ",") + return null; + + if (ch == ";") + return null; + + + if (/[{}\(\),;]/.test(ch)) + return null; + + // 1*DIGIT "K" / "M" / "G" + if (/\d/.test(ch)) { + stream.eatWhile(/[\d]/); + stream.eat(/[KkMmGg]/); + return "number"; + } + + // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_") + if (ch == ":") { + stream.eatWhile(/[a-zA-Z_]/); + stream.eatWhile(/[a-zA-Z0-9_]/); + + return "operator"; + } + + stream.eatWhile(/\w/); + var cur = stream.current(); + + // "text:" *(SP / HTAB) (hash-comment / CRLF) + // *(multiline-literal / multiline-dotstart) + // "." CRLF + if ((cur == "text") && stream.eat(":")) + { + state.tokenize = tokenMultiLineString; + return "string"; + } + + if (keywords.propertyIsEnumerable(cur)) + return "keyword"; + + if (atoms.propertyIsEnumerable(cur)) + return "atom"; + + return null; + } + + function tokenMultiLineString(stream, state) + { + state._multiLineString = true; + // the first line is special it may contain a comment + if (!stream.sol()) { + stream.eatSpace(); + + if (stream.peek() == "#") { + stream.skipToEnd(); + return "comment"; + } + + stream.skipToEnd(); + return "string"; + } + + if ((stream.next() == ".") && (stream.eol())) + { + state._multiLineString = false; + state.tokenize = tokenBase; + } + + return "string"; + } + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) + break; + escaped = !escaped && ch == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return "string"; + }; + } + + return { + startState: function(base) { + return {tokenize: tokenBase, + baseIndent: base || 0, + _indent: []}; + }, + + token: function(stream, state) { + if (stream.eatSpace()) + return null; + + return (state.tokenize || tokenBase)(stream, state); + }, + + indent: function(state, _textAfter) { + var length = state._indent.length; + if (_textAfter && (_textAfter[0] == "}")) + length--; + + if (length <0) + length = 0; + + return length * indentUnit; + }, + + electricChars: "}" + }; +}); + +CodeMirror.defineMIME("application/sieve", "sieve"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/slim/slim.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/slim/slim.js new file mode 100644 index 0000000000..b8ccb1381f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/slim/slim.js @@ -0,0 +1,575 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + + CodeMirror.defineMode("slim", function(config) { + var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); + var rubyMode = CodeMirror.getMode(config, "ruby"); + var modes = { html: htmlMode, ruby: rubyMode }; + var embedded = { + ruby: "ruby", + javascript: "javascript", + css: "text/css", + sass: "text/x-sass", + scss: "text/x-scss", + less: "text/x-less", + styl: "text/x-styl", // no highlighting so far + coffee: "coffeescript", + asciidoc: "text/x-asciidoc", + markdown: "text/x-markdown", + textile: "text/x-textile", // no highlighting so far + creole: "text/x-creole", // no highlighting so far + wiki: "text/x-wiki", // no highlighting so far + mediawiki: "text/x-mediawiki", // no highlighting so far + rdoc: "text/x-rdoc", // no highlighting so far + builder: "text/x-builder", // no highlighting so far + nokogiri: "text/x-nokogiri", // no highlighting so far + erb: "application/x-erb" + }; + var embeddedRegexp = function(map){ + var arr = []; + for(var key in map) arr.push(key); + return new RegExp("^("+arr.join('|')+"):"); + }(embedded); + + var styleMap = { + "commentLine": "comment", + "slimSwitch": "operator special", + "slimTag": "tag", + "slimId": "attribute def", + "slimClass": "attribute qualifier", + "slimAttribute": "attribute", + "slimSubmode": "keyword special", + "closeAttributeTag": null, + "slimDoctype": null, + "lineContinuation": null + }; + var closing = { + "{": "}", + "[": "]", + "(": ")" + }; + + var nameStartChar = "_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"; + var nameChar = nameStartChar + "\\-0-9\xB7\u0300-\u036F\u203F-\u2040"; + var nameRegexp = new RegExp("^[:"+nameStartChar+"](?::["+nameChar+"]|["+nameChar+"]*)"); + var attributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*(?=\\s*=)"); + var wrappedAttributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*"); + var classNameRegexp = /^\.-?[_a-zA-Z]+[\w\-]*/; + var classIdRegexp = /^#[_a-zA-Z]+[\w\-]*/; + + function backup(pos, tokenize, style) { + var restore = function(stream, state) { + state.tokenize = tokenize; + if (stream.pos < pos) { + stream.pos = pos; + return style; + } + return state.tokenize(stream, state); + }; + return function(stream, state) { + state.tokenize = restore; + return tokenize(stream, state); + }; + } + + function maybeBackup(stream, state, pat, offset, style) { + var cur = stream.current(); + var idx = cur.search(pat); + if (idx > -1) { + state.tokenize = backup(stream.pos, state.tokenize, style); + stream.backUp(cur.length - idx - offset); + } + return style; + } + + function continueLine(state, column) { + state.stack = { + parent: state.stack, + style: "continuation", + indented: column, + tokenize: state.line + }; + state.line = state.tokenize; + } + function finishContinue(state) { + if (state.line == state.tokenize) { + state.line = state.stack.tokenize; + state.stack = state.stack.parent; + } + } + + function lineContinuable(column, tokenize) { + return function(stream, state) { + finishContinue(state); + if (stream.match(/^\\$/)) { + continueLine(state, column); + return "lineContinuation"; + } + var style = tokenize(stream, state); + if (stream.eol() && stream.current().match(/(?:^|[^\\])(?:\\\\)*\\$/)) { + stream.backUp(1); + } + return style; + }; + } + function commaContinuable(column, tokenize) { + return function(stream, state) { + finishContinue(state); + var style = tokenize(stream, state); + if (stream.eol() && stream.current().match(/,$/)) { + continueLine(state, column); + } + return style; + }; + } + + function rubyInQuote(endQuote, tokenize) { + // TODO: add multi line support + return function(stream, state) { + var ch = stream.peek(); + if (ch == endQuote && state.rubyState.tokenize.length == 1) { + // step out of ruby context as it seems to complete processing all the braces + stream.next(); + state.tokenize = tokenize; + return "closeAttributeTag"; + } else { + return ruby(stream, state); + } + }; + } + function startRubySplat(tokenize) { + var rubyState; + var runSplat = function(stream, state) { + if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) { + stream.backUp(1); + if (stream.eatSpace()) { + state.rubyState = rubyState; + state.tokenize = tokenize; + return tokenize(stream, state); + } + stream.next(); + } + return ruby(stream, state); + }; + return function(stream, state) { + rubyState = state.rubyState; + state.rubyState = CodeMirror.startState(rubyMode); + state.tokenize = runSplat; + return ruby(stream, state); + }; + } + + function ruby(stream, state) { + return rubyMode.token(stream, state.rubyState); + } + + function htmlLine(stream, state) { + if (stream.match(/^\\$/)) { + return "lineContinuation"; + } + return html(stream, state); + } + function html(stream, state) { + if (stream.match(/^#\{/)) { + state.tokenize = rubyInQuote("}", state.tokenize); + return null; + } + return maybeBackup(stream, state, /[^\\]#\{/, 1, htmlMode.token(stream, state.htmlState)); + } + + function startHtmlLine(lastTokenize) { + return function(stream, state) { + var style = htmlLine(stream, state); + if (stream.eol()) state.tokenize = lastTokenize; + return style; + }; + } + + function startHtmlMode(stream, state, offset) { + state.stack = { + parent: state.stack, + style: "html", + indented: stream.column() + offset, // pipe + space + tokenize: state.line + }; + state.line = state.tokenize = html; + return null; + } + + function comment(stream, state) { + stream.skipToEnd(); + return state.stack.style; + } + + function commentMode(stream, state) { + state.stack = { + parent: state.stack, + style: "comment", + indented: state.indented + 1, + tokenize: state.line + }; + state.line = comment; + return comment(stream, state); + } + + function attributeWrapper(stream, state) { + if (stream.eat(state.stack.endQuote)) { + state.line = state.stack.line; + state.tokenize = state.stack.tokenize; + state.stack = state.stack.parent; + return null; + } + if (stream.match(wrappedAttributeNameRegexp)) { + state.tokenize = attributeWrapperAssign; + return "slimAttribute"; + } + stream.next(); + return null; + } + function attributeWrapperAssign(stream, state) { + if (stream.match(/^==?/)) { + state.tokenize = attributeWrapperValue; + return null; + } + return attributeWrapper(stream, state); + } + function attributeWrapperValue(stream, state) { + var ch = stream.peek(); + if (ch == '"' || ch == "\'") { + state.tokenize = readQuoted(ch, "string", true, false, attributeWrapper); + stream.next(); + return state.tokenize(stream, state); + } + if (ch == '[') { + return startRubySplat(attributeWrapper)(stream, state); + } + if (stream.match(/^(true|false|nil)\b/)) { + state.tokenize = attributeWrapper; + return "keyword"; + } + return startRubySplat(attributeWrapper)(stream, state); + } + + function startAttributeWrapperMode(state, endQuote, tokenize) { + state.stack = { + parent: state.stack, + style: "wrapper", + indented: state.indented + 1, + tokenize: tokenize, + line: state.line, + endQuote: endQuote + }; + state.line = state.tokenize = attributeWrapper; + return null; + } + + function sub(stream, state) { + if (stream.match(/^#\{/)) { + state.tokenize = rubyInQuote("}", state.tokenize); + return null; + } + var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize); + subStream.pos = stream.pos - state.stack.indented; + subStream.start = stream.start - state.stack.indented; + subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented; + subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented; + var style = state.subMode.token(subStream, state.subState); + stream.pos = subStream.pos + state.stack.indented; + return style; + } + function firstSub(stream, state) { + state.stack.indented = stream.column(); + state.line = state.tokenize = sub; + return state.tokenize(stream, state); + } + + function createMode(mode) { + var query = embedded[mode]; + var spec = CodeMirror.mimeModes[query]; + if (spec) { + return CodeMirror.getMode(config, spec); + } + var factory = CodeMirror.modes[query]; + if (factory) { + return factory(config, {name: query}); + } + return CodeMirror.getMode(config, "null"); + } + + function getMode(mode) { + if (!modes.hasOwnProperty(mode)) { + return modes[mode] = createMode(mode); + } + return modes[mode]; + } + + function startSubMode(mode, state) { + var subMode = getMode(mode); + var subState = CodeMirror.startState(subMode); + + state.subMode = subMode; + state.subState = subState; + + state.stack = { + parent: state.stack, + style: "sub", + indented: state.indented + 1, + tokenize: state.line + }; + state.line = state.tokenize = firstSub; + return "slimSubmode"; + } + + function doctypeLine(stream, _state) { + stream.skipToEnd(); + return "slimDoctype"; + } + + function startLine(stream, state) { + var ch = stream.peek(); + if (ch == '<') { + return (state.tokenize = startHtmlLine(state.tokenize))(stream, state); + } + if (stream.match(/^[|']/)) { + return startHtmlMode(stream, state, 1); + } + if (stream.match(/^\/(!|\[\w+])?/)) { + return commentMode(stream, state); + } + if (stream.match(/^(-|==?[<>]?)/)) { + state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby)); + return "slimSwitch"; + } + if (stream.match(/^doctype\b/)) { + state.tokenize = doctypeLine; + return "keyword"; + } + + var m = stream.match(embeddedRegexp); + if (m) { + return startSubMode(m[1], state); + } + + return slimTag(stream, state); + } + + function slim(stream, state) { + if (state.startOfLine) { + return startLine(stream, state); + } + return slimTag(stream, state); + } + + function slimTag(stream, state) { + if (stream.eat('*')) { + state.tokenize = startRubySplat(slimTagExtras); + return null; + } + if (stream.match(nameRegexp)) { + state.tokenize = slimTagExtras; + return "slimTag"; + } + return slimClass(stream, state); + } + function slimTagExtras(stream, state) { + if (stream.match(/^(<>?|> state.indented && state.last != "slimSubmode") { + state.line = state.tokenize = state.stack.tokenize; + state.stack = state.stack.parent; + state.subMode = null; + state.subState = null; + } + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + state.startOfLine = false; + if (style) state.last = style; + return styleMap.hasOwnProperty(style) ? styleMap[style] : style; + }, + + blankLine: function(state) { + if (state.subMode && state.subMode.blankLine) { + return state.subMode.blankLine(state.subState); + } + }, + + innerMode: function(state) { + if (state.subMode) return {state: state.subState, mode: state.subMode}; + return {state: state, mode: mode}; + } + + //indent: function(state) { + // return state.indented; + //} + }; + return mode; + }, "htmlmixed", "ruby"); + + CodeMirror.defineMIME("text/x-slim", "slim"); + CodeMirror.defineMIME("application/x-slim", "slim"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smalltalk/smalltalk.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smalltalk/smalltalk.js new file mode 100644 index 0000000000..5039fe2d15 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smalltalk/smalltalk.js @@ -0,0 +1,168 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('smalltalk', function(config) { + + var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/; + var keywords = /true|false|nil|self|super|thisContext/; + + var Context = function(tokenizer, parent) { + this.next = tokenizer; + this.parent = parent; + }; + + var Token = function(name, context, eos) { + this.name = name; + this.context = context; + this.eos = eos; + }; + + var State = function() { + this.context = new Context(next, null); + this.expectVariable = true; + this.indentation = 0; + this.userIndentationDelta = 0; + }; + + State.prototype.userIndent = function(indentation) { + this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0; + }; + + var next = function(stream, context, state) { + var token = new Token(null, context, false); + var aChar = stream.next(); + + if (aChar === '"') { + token = nextComment(stream, new Context(nextComment, context)); + + } else if (aChar === '\'') { + token = nextString(stream, new Context(nextString, context)); + + } else if (aChar === '#') { + if (stream.peek() === '\'') { + stream.next(); + token = nextSymbol(stream, new Context(nextSymbol, context)); + } else { + if (stream.eatWhile(/[^\s.{}\[\]()]/)) + token.name = 'string-2'; + else + token.name = 'meta'; + } + + } else if (aChar === '$') { + if (stream.next() === '<') { + stream.eatWhile(/[^\s>]/); + stream.next(); + } + token.name = 'string-2'; + + } else if (aChar === '|' && state.expectVariable) { + token.context = new Context(nextTemporaries, context); + + } else if (/[\[\]{}()]/.test(aChar)) { + token.name = 'bracket'; + token.eos = /[\[{(]/.test(aChar); + + if (aChar === '[') { + state.indentation++; + } else if (aChar === ']') { + state.indentation = Math.max(0, state.indentation - 1); + } + + } else if (specialChars.test(aChar)) { + stream.eatWhile(specialChars); + token.name = 'operator'; + token.eos = aChar !== ';'; // ; cascaded message expression + + } else if (/\d/.test(aChar)) { + stream.eatWhile(/[\w\d]/); + token.name = 'number'; + + } else if (/[\w_]/.test(aChar)) { + stream.eatWhile(/[\w\d_]/); + token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null; + + } else { + token.eos = state.expectVariable; + } + + return token; + }; + + var nextComment = function(stream, context) { + stream.eatWhile(/[^"]/); + return new Token('comment', stream.eat('"') ? context.parent : context, true); + }; + + var nextString = function(stream, context) { + stream.eatWhile(/[^']/); + return new Token('string', stream.eat('\'') ? context.parent : context, false); + }; + + var nextSymbol = function(stream, context) { + stream.eatWhile(/[^']/); + return new Token('string-2', stream.eat('\'') ? context.parent : context, false); + }; + + var nextTemporaries = function(stream, context) { + var token = new Token(null, context, false); + var aChar = stream.next(); + + if (aChar === '|') { + token.context = context.parent; + token.eos = true; + + } else { + stream.eatWhile(/[^|]/); + token.name = 'variable'; + } + + return token; + }; + + return { + startState: function() { + return new State; + }, + + token: function(stream, state) { + state.userIndent(stream.indentation()); + + if (stream.eatSpace()) { + return null; + } + + var token = state.context.next(stream, state.context, state); + state.context = token.context; + state.expectVariable = token.eos; + + return token.name; + }, + + blankLine: function(state) { + state.userIndent(0); + }, + + indent: function(state, textAfter) { + var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta; + return (state.indentation + i) * config.indentUnit; + }, + + electricChars: ']' + }; + +}); + +CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smarty/smarty.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smarty/smarty.js new file mode 100644 index 0000000000..57852feb0e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/smarty/smarty.js @@ -0,0 +1,225 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/** + * Smarty 2 and 3 mode. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("smarty", function(config, parserConf) { + var rightDelimiter = parserConf.rightDelimiter || "}"; + var leftDelimiter = parserConf.leftDelimiter || "{"; + var version = parserConf.version || 2; + var baseMode = CodeMirror.getMode(config, parserConf.baseMode || "null"); + + var keyFunctions = ["debug", "extends", "function", "include", "literal"]; + var regs = { + operatorChars: /[+\-*&%=<>!?]/, + validIdentifier: /[a-zA-Z0-9_]/, + stringChar: /['"]/ + }; + + var last; + function cont(style, lastType) { + last = lastType; + return style; + } + + function chain(stream, state, parser) { + state.tokenize = parser; + return parser(stream, state); + } + + // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode + function doesNotCount(stream, pos) { + if (pos == null) pos = stream.pos; + return version === 3 && leftDelimiter == "{" && + (pos == stream.string.length || /\s/.test(stream.string.charAt(pos))); + } + + function tokenTop(stream, state) { + var string = stream.string; + for (var scan = stream.pos;;) { + var nextMatch = string.indexOf(leftDelimiter, scan); + scan = nextMatch + leftDelimiter.length; + if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break; + } + if (nextMatch == stream.pos) { + stream.match(leftDelimiter); + if (stream.eat("*")) { + return chain(stream, state, tokenBlock("comment", "*" + rightDelimiter)); + } else { + state.depth++; + state.tokenize = tokenSmarty; + last = "startTag"; + return "tag"; + } + } + + if (nextMatch > -1) stream.string = string.slice(0, nextMatch); + var token = baseMode.token(stream, state.base); + if (nextMatch > -1) stream.string = string; + return token; + } + + // parsing Smarty content + function tokenSmarty(stream, state) { + if (stream.match(rightDelimiter, true)) { + if (version === 3) { + state.depth--; + if (state.depth <= 0) { + state.tokenize = tokenTop; + } + } else { + state.tokenize = tokenTop; + } + return cont("tag", null); + } + + if (stream.match(leftDelimiter, true)) { + state.depth++; + return cont("tag", "startTag"); + } + + var ch = stream.next(); + if (ch == "$") { + stream.eatWhile(regs.validIdentifier); + return cont("variable-2", "variable"); + } else if (ch == "|") { + return cont("operator", "pipe"); + } else if (ch == ".") { + return cont("operator", "property"); + } else if (regs.stringChar.test(ch)) { + state.tokenize = tokenAttribute(ch); + return cont("string", "string"); + } else if (regs.operatorChars.test(ch)) { + stream.eatWhile(regs.operatorChars); + return cont("operator", "operator"); + } else if (ch == "[" || ch == "]") { + return cont("bracket", "bracket"); + } else if (ch == "(" || ch == ")") { + return cont("bracket", "operator"); + } else if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + return cont("number", "number"); + } else { + + if (state.last == "variable") { + if (ch == "@") { + stream.eatWhile(regs.validIdentifier); + return cont("property", "property"); + } else if (ch == "|") { + stream.eatWhile(regs.validIdentifier); + return cont("qualifier", "modifier"); + } + } else if (state.last == "pipe") { + stream.eatWhile(regs.validIdentifier); + return cont("qualifier", "modifier"); + } else if (state.last == "whitespace") { + stream.eatWhile(regs.validIdentifier); + return cont("attribute", "modifier"); + } if (state.last == "property") { + stream.eatWhile(regs.validIdentifier); + return cont("property", null); + } else if (/\s/.test(ch)) { + last = "whitespace"; + return null; + } + + var str = ""; + if (ch != "/") { + str += ch; + } + var c = null; + while (c = stream.eat(regs.validIdentifier)) { + str += c; + } + for (var i=0, j=keyFunctions.length; i]=?)/)) { + // Tokenize filter, binary, null propagator, and equality operators. + return "operator"; + } else if (match = stream.match(/^\$([\w]+)/)) { + return ref(state.variables, match[1], !state.lookupVariables); + } else if (match = stream.match(/^\w+/)) { + return /^(?:as|and|or|not|in|if)$/.test(match[0]) ? "keyword" : null; + } + + stream.next(); + return null; + } + + return { + startState: function() { + return { + soyState: [], + variables: prepend(null, 'ij'), + scopes: null, + indent: 0, + quoteKind: null, + context: null, + lookupVariables: true, // Is unknown variables considered an error + localStates: [{ + mode: modes.html, + state: CodeMirror.startState(modes.html) + }] + }; + }, + + copyState: function(state) { + return { + tag: state.tag, // Last seen Soy tag. + soyState: state.soyState.concat([]), + variables: state.variables, + context: state.context, + indent: state.indent, // Indentation of the following line. + quoteKind: state.quoteKind, + lookupVariables: state.lookupVariables, + localStates: state.localStates.map(function(localState) { + return { + mode: localState.mode, + state: CodeMirror.copyState(localState.mode, localState.state) + }; + }) + }; + }, + + token: function(stream, state) { + var match; + + switch (last(state.soyState)) { + case "comment": + if (stream.match(/^.*?\*\//)) { + state.soyState.pop(); + } else { + stream.skipToEnd(); + } + if (!state.context || !state.context.scope) { + var paramRe = /@param\??\s+(\S+)/g; + var current = stream.current(); + for (var match; (match = paramRe.exec(current)); ) { + state.variables = prepend(state.variables, match[1]); + } + } + return "comment"; + + case "string": + var match = stream.match(/^.*?(["']|\\[\s\S])/); + if (!match) { + stream.skipToEnd(); + } else if (match[1] == state.quoteKind) { + state.quoteKind = null; + state.soyState.pop(); + } + return "string"; + } + + if (!state.soyState.length || last(state.soyState) != "literal") { + if (stream.match(/^\/\*/)) { + state.soyState.push("comment"); + return "comment"; + } else if (stream.match(stream.sol() ? /^\s*\/\/.*/ : /^\s+\/\/.*/)) { + return "comment"; + } + } + + switch (last(state.soyState)) { + case "templ-def": + if (match = stream.match(/^\.?([\w]+(?!\.[\w]+)*)/)) { + state.soyState.pop(); + return "def"; + } + stream.next(); + return null; + + case "templ-ref": + if (match = stream.match(/(\.?[a-zA-Z_][a-zA-Z_0-9]+)+/)) { + state.soyState.pop(); + // If the first character is '.', it can only be a local template. + if (match[0][0] == '.') { + return "variable-2" + } + // Otherwise + return "variable"; + } + if (match = stream.match(/^\$([\w]+)/)) { + state.soyState.pop(); + return ref(state.variables, match[1], !state.lookupVariables); + } + + stream.next(); + return null; + + case "namespace-def": + if (match = stream.match(/^\.?([\w\.]+)/)) { + state.soyState.pop(); + return "variable"; + } + stream.next(); + return null; + + case "param-def": + if (match = stream.match(/^\*/)) { + state.soyState.pop(); + state.soyState.push("param-type"); + return "type"; + } + if (match = stream.match(/^\w+/)) { + state.variables = prepend(state.variables, match[0]); + state.soyState.pop(); + state.soyState.push("param-type"); + return "def"; + } + stream.next(); + return null; + + case "param-ref": + if (match = stream.match(/^\w+/)) { + state.soyState.pop(); + return "property"; + } + stream.next(); + return null; + + case "open-parentheses": + if (stream.match(/[)]/)) { + state.soyState.pop(); + return null; + } + return expression(stream, state); + + case "param-type": + var peekChar = stream.peek(); + if ("}]=>,".indexOf(peekChar) != -1) { + state.soyState.pop(); + return null; + } else if (peekChar == "[") { + state.soyState.push('param-type-record'); + return null; + } else if (peekChar == "(") { + state.soyState.push('param-type-template'); + return null; + } else if (peekChar == "<") { + state.soyState.push('param-type-parameter'); + return null; + } else if (match = stream.match(/^([\w]+|[?])/)) { + return "type"; + } + stream.next(); + return null; + + case "param-type-record": + var peekChar = stream.peek(); + if (peekChar == "]") { + state.soyState.pop(); + return null; + } + if (stream.match(/^\w+/)) { + state.soyState.push('param-type'); + return "property"; + } + stream.next(); + return null; + + case "param-type-parameter": + if (stream.match(/^[>]/)) { + state.soyState.pop(); + return null; + } + if (stream.match(/^[<,]/)) { + state.soyState.push('param-type'); + return null; + } + stream.next(); + return null; + + case "param-type-template": + if (stream.match(/[>]/)) { + state.soyState.pop(); + state.soyState.push('param-type'); + return null; + } + if (stream.match(/^\w+/)) { + state.soyState.push('param-type'); + return "def"; + } + stream.next(); + return null; + + case "var-def": + if (match = stream.match(/^\$([\w]+)/)) { + state.variables = prepend(state.variables, match[1]); + state.soyState.pop(); + return "def"; + } + stream.next(); + return null; + + case "for-loop": + if (stream.match(/\bin\b/)) { + state.soyState.pop(); + return "keyword"; + } + if (stream.peek() == "$") { + state.soyState.push('var-def'); + return null; + } + stream.next(); + return null; + + case "record-literal": + if (stream.match(/^[)]/)) { + state.soyState.pop(); + return null; + } + if (stream.match(/[(,]/)) { + state.soyState.push("map-value") + state.soyState.push("record-key") + return null; + } + stream.next() + return null; + + case "map-literal": + if (stream.match(/^[)]/)) { + state.soyState.pop(); + return null; + } + if (stream.match(/[(,]/)) { + state.soyState.push("map-value") + state.soyState.push("map-value") + return null; + } + stream.next() + return null; + + case "list-literal": + if (stream.match(']')) { + state.soyState.pop(); + state.lookupVariables = true; + popcontext(state); + return null; + } + if (stream.match(/\bfor\b/)) { + state.lookupVariables = true; + state.soyState.push('for-loop'); + return "keyword"; + } + return expression(stream, state); + + case "record-key": + if (stream.match(/[\w]+/)) { + return "property"; + } + if (stream.match(/^[:]/)) { + state.soyState.pop(); + return null; + } + stream.next(); + return null; + + case "map-value": + if (stream.peek() == ")" || stream.peek() == "," || stream.match(/^[:)]/)) { + state.soyState.pop(); + return null; + } + return expression(stream, state); + + case "import": + if (stream.eat(";")) { + state.soyState.pop(); + state.indent -= 2 * config.indentUnit; + return null; + } + if (stream.match(/\w+(?=\s+as\b)/)) { + return "variable"; + } + if (match = stream.match(/\w+/)) { + return /\b(from|as)\b/.test(match[0]) ? "keyword" : "def"; + } + if (match = stream.match(/^["']/)) { + state.soyState.push("string"); + state.quoteKind = match[0]; + return "string"; + } + stream.next(); + return null; + + case "tag": + var endTag; + var tagName; + if (state.tag === undefined) { + endTag = true; + tagName = ''; + } else { + endTag = state.tag[0] == "/"; + tagName = endTag ? state.tag.substring(1) : state.tag; + } + var tag = tags[tagName]; + if (stream.match(/^\/?}/)) { + var selfClosed = stream.current() == "/}"; + if (selfClosed && !endTag) { + popcontext(state); + } + if (state.tag == "/template" || state.tag == "/deltemplate") { + state.variables = prepend(null, 'ij'); + state.indent = 0; + } else { + state.indent -= config.indentUnit * + (selfClosed || indentingTags.indexOf(state.tag) == -1 ? 2 : 1); + } + state.soyState.pop(); + return "keyword"; + } else if (stream.match(/^([\w?]+)(?==)/)) { + if (state.context && state.context.tag == tagName && stream.current() == "kind" && (match = stream.match(/^="([^"]+)/, false))) { + var kind = match[1]; + state.context.kind = kind; + var mode = modes[kind] || modes.html; + var localState = last(state.localStates); + if (localState.mode.indent) { + state.indent += localState.mode.indent(localState.state, "", ""); + } + state.localStates.push({ + mode: mode, + state: CodeMirror.startState(mode) + }); + } + return "attribute"; + } + return expression(stream, state); + + case "template-call-expression": + if (stream.match(/^([\w-?]+)(?==)/)) { + return "attribute"; + } else if (stream.eat('>')) { + state.soyState.pop(); + return "keyword"; + } else if (stream.eat('/>')) { + state.soyState.pop(); + return "keyword"; + } + return expression(stream, state); + case "literal": + if (stream.match('{/literal}', false)) { + state.soyState.pop(); + return this.token(stream, state); + } + return tokenUntil(stream, state, /\{\/literal}/); + case "export": + if (match = stream.match(/\w+/)) { + state.soyState.pop(); + if (match == "const") { + state.soyState.push("const-def") + return "keyword"; + } else if (match == "extern") { + state.soyState.push("param-def") + return "keyword"; + } + } else { + stream.next(); + } + return null; + case "const-def": + if (stream.match(/^\w+/)) { + state.soyState.pop(); + return "def"; + } + stream.next(); + return null; + } + + if (stream.match('{literal}')) { + state.indent += config.indentUnit; + state.soyState.push("literal"); + state.context = new Context(state.context, "literal", state.variables); + return "keyword"; + + // A tag-keyword must be followed by whitespace, comment or a closing tag. + } else if (match = stream.match(/^\{([/@\\]?\w+\??)(?=$|[\s}]|\/[/*])/)) { + var prevTag = state.tag; + state.tag = match[1]; + var endTag = state.tag[0] == "/"; + var indentingTag = !!tags[state.tag]; + var tagName = endTag ? state.tag.substring(1) : state.tag; + var tag = tags[tagName]; + if (state.tag != "/switch") + state.indent += ((endTag || tag && tag.reduceIndent) && prevTag != "switch" ? 1 : 2) * config.indentUnit; + + state.soyState.push("tag"); + var tagError = false; + if (tag) { + if (!endTag) { + if (tag.soyState) state.soyState.push(tag.soyState); + } + // If a new tag, open a new context. + if (!tag.noEndTag && (indentingTag || !endTag)) { + state.context = new Context(state.context, state.tag, tag.variableScope ? state.variables : null); + // Otherwise close the current context. + } else if (endTag) { + var isBalancedForExtern = tagName == 'extern' && (state.context && state.context.tag == 'export'); + if (!state.context || ((state.context.tag != tagName) && !isBalancedForExtern)) { + tagError = true; + } else if (state.context) { + if (state.context.kind) { + state.localStates.pop(); + var localState = last(state.localStates); + if (localState.mode.indent) { + state.indent -= localState.mode.indent(localState.state, "", ""); + } + } + popcontext(state); + } + } + } else if (endTag) { + // Assume all tags with a closing tag are defined in the config. + tagError = true; + } + return (tagError ? "error " : "") + "keyword"; + + // Not a tag-keyword; it's an implicit print tag. + } else if (stream.eat('{')) { + state.tag = "print"; + state.indent += 2 * config.indentUnit; + state.soyState.push("tag"); + return "keyword"; + } else if (!state.context && stream.sol() && stream.match(/import\b/)) { + state.soyState.push("import"); + state.indent += 2 * config.indentUnit; + return "keyword"; + } else if (match = stream.match('<{')) { + state.soyState.push("template-call-expression"); + state.indent += 2 * config.indentUnit; + state.soyState.push("tag"); + return "keyword"; + } else if (match = stream.match('')) { + state.indent -= 1 * config.indentUnit; + return "keyword"; + } + + return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/); + }, + + indent: function(state, textAfter, line) { + var indent = state.indent, top = last(state.soyState); + if (top == "comment") return CodeMirror.Pass; + + if (top == "literal") { + if (/^\{\/literal}/.test(textAfter)) indent -= config.indentUnit; + } else { + if (/^\s*\{\/(template|deltemplate)\b/.test(textAfter)) return 0; + if (/^\{(\/|(fallbackmsg|elseif|else|ifempty)\b)/.test(textAfter)) indent -= config.indentUnit; + if (state.tag != "switch" && /^\{(case|default)\b/.test(textAfter)) indent -= config.indentUnit; + if (/^\{\/switch\b/.test(textAfter)) indent -= config.indentUnit; + } + var localState = last(state.localStates); + if (indent && localState.mode.indent) { + indent += localState.mode.indent(localState.state, textAfter, line); + } + return indent; + }, + + innerMode: function(state) { + if (state.soyState.length && last(state.soyState) != "literal") return null; + else return last(state.localStates); + }, + + electricInput: /^\s*\{(\/|\/template|\/deltemplate|\/switch|fallbackmsg|elseif|else|case|default|ifempty|\/literal\})$/, + lineComment: "//", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + useInnerComments: false, + fold: "indent" + }; + }, "htmlmixed"); + + CodeMirror.registerHelper("wordChars", "soy", /[\w$]/); + + CodeMirror.registerHelper("hintWords", "soy", Object.keys(tags).concat( + ["css", "debugger"])); + + CodeMirror.defineMIME("text/x-soy", "soy"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sparql/sparql.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sparql/sparql.js new file mode 100644 index 0000000000..6d1d24464b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sparql/sparql.js @@ -0,0 +1,190 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sparql", function(config) { + var indentUnit = config.indentUnit; + var curPunc; + + function wordRegexp(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri", + "iri", "uri", "bnode", "count", "sum", "min", "max", "avg", "sample", + "group_concat", "rand", "abs", "ceil", "floor", "round", "concat", "substr", "strlen", + "replace", "ucase", "lcase", "encode_for_uri", "contains", "strstarts", "strends", + "strbefore", "strafter", "year", "month", "day", "hours", "minutes", "seconds", + "timezone", "tz", "now", "uuid", "struuid", "md5", "sha1", "sha256", "sha384", + "sha512", "coalesce", "if", "strlang", "strdt", "isnumeric", "regex", "exists", + "isblank", "isliteral", "a", "bind"]); + var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe", + "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional", + "graph", "by", "asc", "desc", "as", "having", "undef", "values", "group", + "minus", "in", "not", "service", "silent", "using", "insert", "delete", "union", + "true", "false", "with", + "data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]); + var operatorChars = /[*+\-<>=&|\^\/!\?]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + curPunc = null; + if (ch == "$" || ch == "?") { + if(ch == "?" && stream.match(/\s/, false)){ + return "operator"; + } + stream.match(/^[A-Za-z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][A-Za-z0-9_\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]*/); + return "variable-2"; + } + else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { + stream.match(/^[^\s\u00a0>]*>?/); + return "atom"; + } + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } + else if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return "bracket"; + } + else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + else if (ch === "^") { + ch = stream.peek(); + if (ch === "^") stream.eat("^"); + else stream.eatWhile(operatorChars); + return "operator"; + } + else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return "operator"; + } + else if (ch == ":") { + eatPnLocal(stream); + return "atom"; + } + else if (ch == "@") { + stream.eatWhile(/[a-z\d\-]/i); + return "meta"; + } + else { + stream.eatWhile(/[_\w\d]/); + if (stream.eat(":")) { + eatPnLocal(stream); + return "atom"; + } + var word = stream.current(); + if (ops.test(word)) + return "builtin"; + else if (keywords.test(word)) + return "keyword"; + else + return "variable"; + } + } + + function eatPnLocal(stream) { + stream.match(/(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])+/i); + } + + function tokenLiteral(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return "string"; + }; + } + + function pushContext(state, type, col) { + state.context = {prev: state.context, indent: state.indent, col: col, type: type}; + } + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + context: null, + indent: 0, + col: 0}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) state.context.align = false; + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { + state.context.align = true; + } + + if (curPunc == "(") pushContext(state, ")", stream.column()); + else if (curPunc == "[") pushContext(state, "]", stream.column()); + else if (curPunc == "{") pushContext(state, "}", stream.column()); + else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type == "pattern") popContext(state); + if (state.context && curPunc == state.context.type) { + popContext(state); + if (curPunc == "}" && state.context && state.context.type == "pattern") + popContext(state); + } + } + else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); + else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) + pushContext(state, "pattern", stream.column()); + else if (state.context.type == "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + + return style; + }, + + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) + while (context && context.type == "pattern") context = context.prev; + + var closing = context && firstChar == context.type; + if (!context) + return 0; + else if (context.type == "pattern") + return context.col; + else if (context.align) + return context.col + (closing ? 0 : 1); + else + return context.indent + (closing ? 0 : indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("application/sparql-query", "sparql"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/spreadsheet/spreadsheet.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/spreadsheet/spreadsheet.js new file mode 100644 index 0000000000..d87f988d35 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/spreadsheet/spreadsheet.js @@ -0,0 +1,112 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("spreadsheet", function () { + return { + startState: function () { + return { + stringType: null, + stack: [] + }; + }, + token: function (stream, state) { + if (!stream) return; + + //check for state changes + if (state.stack.length === 0) { + //strings + if ((stream.peek() == '"') || (stream.peek() == "'")) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.stack.unshift("string"); + } + } + + //return state + //stack has + switch (state.stack[0]) { + case "string": + while (state.stack[0] === "string" && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.stack.shift(); // Clear flag + } else if (stream.peek() === "\\") { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return "string"; + + case "characterClass": + while (state.stack[0] === "characterClass" && !stream.eol()) { + if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) + state.stack.shift(); + } + return "operator"; + } + + var peek = stream.peek(); + + //no stack + switch (peek) { + case "[": + stream.next(); + state.stack.unshift("characterClass"); + return "bracket"; + case ":": + stream.next(); + return "operator"; + case "\\": + if (stream.match(/\\[a-z]+/)) return "string-2"; + else { + stream.next(); + return "atom"; + } + case ".": + case ",": + case ";": + case "*": + case "-": + case "+": + case "^": + case "<": + case "/": + case "=": + stream.next(); + return "atom"; + case "$": + stream.next(); + return "builtin"; + } + + if (stream.match(/\d+/)) { + if (stream.match(/^\w+/)) return "error"; + return "number"; + } else if (stream.match(/^[a-zA-Z_]\w*/)) { + if (stream.match(/(?=[\(.])/, false)) return "keyword"; + return "variable-2"; + } else if (["[", "]", "(", ")", "{", "}"].indexOf(peek) != -1) { + stream.next(); + return "bracket"; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; + }); + + CodeMirror.defineMIME("text/x-spreadsheet", "spreadsheet"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sql/sql.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sql/sql.js new file mode 100644 index 0000000000..cd8b757bb6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/sql/sql.js @@ -0,0 +1,503 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("sql", function(config, parserConfig) { + var client = parserConfig.client || {}, + atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, + builtin = parserConfig.builtin || set(defaultBuiltin), + keywords = parserConfig.keywords || set(sqlKeywords), + operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^\/]/, + support = parserConfig.support || {}, + hooks = parserConfig.hooks || {}, + dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}, + backslashStringEscapes = parserConfig.backslashStringEscapes !== false, + brackets = parserConfig.brackets || /^[\{}\(\)\[\]]/, + punctuation = parserConfig.punctuation || /^[;.,:]/ + + function tokenBase(stream, state) { + var ch = stream.next(); + + // call hooks from the mime type + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + + if (support.hexNumber && + ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) + || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { + // hex + // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html + return "number"; + } else if (support.binaryNumber && + (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) + || (ch == "0" && stream.match(/^b[01]+/)))) { + // bitstring + // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html + return "number"; + } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { + // numbers + // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html + stream.match(/^[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?/); + support.decimallessFloat && stream.match(/^\.(?!\.)/); + return "number"; + } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { + // placeholders + return "variable-3"; + } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { + // strings + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } else if ((((support.nCharCast && (ch == "n" || ch == "N")) + || (support.charsetCast && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) + && (stream.peek() == "'" || stream.peek() == '"'))) { + // charset casting: _utf8'str', N'str', n'str' + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + return "keyword"; + } else if (support.escapeConstant && (ch == "e" || ch == "E") + && (stream.peek() == "'" || (stream.peek() == '"' && support.doubleQuote))) { + // escape constant: E'str', e'str' + // ref: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE + state.tokenize = function(stream, state) { + return (state.tokenize = tokenLiteral(stream.next(), true))(stream, state); + } + return "keyword"; + } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { + // 1-line comment + stream.skipToEnd(); + return "comment"; + } else if ((support.commentHash && ch == "#") + || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { + // 1-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + stream.skipToEnd(); + return "comment"; + } else if (ch == "/" && stream.eat("*")) { + // multi-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + state.tokenize = tokenComment(1); + return state.tokenize(stream, state); + } else if (ch == ".") { + // .1 for 0.1 + if (support.zerolessFloat && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) + return "number"; + if (stream.match(/^\.+/)) + return null + // .table_name (ODBC) + // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + if (support.ODBCdotTable && stream.match(/^[\w\d_$#]+/)) + return "variable-2"; + } else if (operatorChars.test(ch)) { + // operators + stream.eatWhile(operatorChars); + return "operator"; + } else if (brackets.test(ch)) { + // brackets + return "bracket"; + } else if (punctuation.test(ch)) { + // punctuation + stream.eatWhile(punctuation); + return "punctuation"; + } else if (ch == '{' && + (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { + // dates (weird ODBC syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + return "number"; + } else { + stream.eatWhile(/^[_\w\d]/); + var word = stream.current().toLowerCase(); + // dates (standard SQL syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) + return "number"; + if (atoms.hasOwnProperty(word)) return "atom"; + if (builtin.hasOwnProperty(word)) return "type"; + if (keywords.hasOwnProperty(word)) return "keyword"; + if (client.hasOwnProperty(word)) return "builtin"; + return null; + } + } + + // 'string', with char specified in quote escaped by '\' + function tokenLiteral(quote, backslashEscapes) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = (backslashStringEscapes || backslashEscapes) && !escaped && ch == "\\"; + } + return "string"; + }; + } + function tokenComment(depth) { + return function(stream, state) { + var m = stream.match(/^.*?(\/\*|\*\/)/) + if (!m) stream.skipToEnd() + else if (m[1] == "/*") state.tokenize = tokenComment(depth + 1) + else if (depth > 1) state.tokenize = tokenComment(depth - 1) + else state.tokenize = tokenBase + return "comment" + } + } + + function pushContext(stream, state, type) { + state.context = { + prev: state.context, + indent: stream.indentation(), + col: stream.column(), + type: type + }; + } + + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, context: null}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) + state.context.align = false; + } + if (state.tokenize == tokenBase && stream.eatSpace()) return null; + + var style = state.tokenize(stream, state); + if (style == "comment") return style; + + if (state.context && state.context.align == null) + state.context.align = true; + + var tok = stream.current(); + if (tok == "(") + pushContext(stream, state, ")"); + else if (tok == "[") + pushContext(stream, state, "]"); + else if (state.context && state.context.type == tok) + popContext(state); + return style; + }, + + indent: function(state, textAfter) { + var cx = state.context; + if (!cx) return CodeMirror.Pass; + var closing = textAfter.charAt(0) == cx.type; + if (cx.align) return cx.col + (closing ? 0 : 1); + else return cx.indent + (closing ? 0 : config.indentUnit); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : "--", + closeBrackets: "()[]{}''\"\"``" + }; +}); + + // `identifier` + function hookIdentifier(stream) { + // MySQL/MariaDB identifiers + // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + var ch; + while ((ch = stream.next()) != null) { + if (ch == "`" && !stream.eat("`")) return "variable-2"; + } + stream.backUp(stream.current().length - 1); + return stream.eatWhile(/\w/) ? "variable-2" : null; + } + + // "identifier" + function hookIdentifierDoublequote(stream) { + // Standard SQL /SQLite identifiers + // ref: http://web.archive.org/web/20160813185132/http://savage.net.au/SQL/sql-99.bnf.html#delimited%20identifier + // ref: http://sqlite.org/lang_keywords.html + var ch; + while ((ch = stream.next()) != null) { + if (ch == "\"" && !stream.eat("\"")) return "variable-2"; + } + stream.backUp(stream.current().length - 1); + return stream.eatWhile(/\w/) ? "variable-2" : null; + } + + // variable token + function hookVar(stream) { + // variables + // @@prefix.varName @varName + // varName can be quoted with ` or ' or " + // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html + if (stream.eat("@")) { + stream.match('session.'); + stream.match('local.'); + stream.match('global.'); + } + + if (stream.eat("'")) { + stream.match(/^.*'/); + return "variable-2"; + } else if (stream.eat('"')) { + stream.match(/^.*"/); + return "variable-2"; + } else if (stream.eat("`")) { + stream.match(/^.*`/); + return "variable-2"; + } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { + return "variable-2"; + } + return null; + }; + + // short client keyword token + function hookClient(stream) { + // \N means NULL + // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html + if (stream.eat("N")) { + return "atom"; + } + // \g, etc + // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html + return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; + } + + // these keywords are used by all SQL dialects (however, a mode can still overwrite it) + var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit "; + + // turn a space-separated list into an array + function set(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var defaultBuiltin = "bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric" + + // A generic SQL Mode. It's not a standard, it just try to support what is generally supported + CodeMirror.defineMIME("text/x-sql", { + name: "sql", + keywords: set(sqlKeywords + "begin"), + builtin: set(defaultBuiltin), + atoms: set("false true null unknown"), + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); + + CodeMirror.defineMIME("text/x-mssql", { + name: "sql", + client: set("$partition binary_checksum checksum connectionproperty context_info current_request_id error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big xact_state object_id"), + keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare exec go if use index holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot tablock tablockx updlock with"), + builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), + atoms: set("is not null like and or in left right between inner outer join all any some cross unpivot pivot exists"), + operatorChars: /^[*+\-%<>!=^\&|\/]/, + brackets: /^[\{}\(\)]/, + punctuation: /^[;.,:/]/, + backslashStringEscapes: false, + dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), + hooks: { + "@": hookVar + } + }); + + CodeMirror.defineMIME("text/x-mysql", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + CodeMirror.defineMIME("text/x-mariadb", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group group_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + // provided by the phpLiteAdmin project - phpliteadmin.org + CodeMirror.defineMIME("text/x-sqlite", { + name: "sql", + // commands of the official SQLite client, ref: https://www.sqlite.org/cli.html#dotcmd + client: set("auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width"), + // ref: http://sqlite.org/lang_keywords.html + keywords: set(sqlKeywords + "abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without"), + // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real"), + // ref: http://sqlite.org/syntax/literal-value.html + atoms: set("null current_date current_time current_timestamp"), + // ref: http://sqlite.org/lang_expr.html#binaryops + operatorChars: /^[*+\-%<>!=&|/~]/, + // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. + dateSQL: set("date time timestamp datetime"), + support: set("decimallessFloat zerolessFloat"), + identifierQuote: "\"", //ref: http://sqlite.org/lang_keywords.html + hooks: { + // bind-parameters ref:http://sqlite.org/lang_expr.html#varparam + "@": hookVar, + ":": hookVar, + "?": hookVar, + "$": hookVar, + // The preferred way to escape Identifiers is using double quotes, ref: http://sqlite.org/lang_keywords.html + "\"": hookIdentifierDoublequote, + // there is also support for backticks, ref: http://sqlite.org/lang_keywords.html + "`": hookIdentifier + } + }); + + // the query language used by Apache Cassandra is called CQL, but this mime type + // is called Cassandra to avoid confusion with Contextual Query Language + CodeMirror.defineMIME("text/x-cassandra", { + name: "sql", + client: { }, + keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"), + builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"), + atoms: set("false true infinity NaN"), + operatorChars: /^[<>=]/, + dateSQL: { }, + support: set("commentSlashSlash decimallessFloat"), + hooks: { } + }); + + // this is based on Peter Raganitsch's 'plsql' mode + CodeMirror.defineMIME("text/x-plsql", { + name: "sql", + client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), + keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), + builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), + operatorChars: /^[*\/+\-%<>!=~]/, + dateSQL: set("date time timestamp"), + support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") + }); + + // Created to support specific hive keywords + CodeMirror.defineMIME("text/x-hive", { + name: "sql", + keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year"), + builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=]/, + dateSQL: set("date timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); + + CodeMirror.defineMIME("text/x-pgsql", { + name: "sql", + client: set("source"), + // For PostgreSQL - https://www.postgresql.org/docs/11/sql-keywords-appendix.html + // For pl/pgsql lang - https://github.com/postgres/postgres/blob/REL_11_2/src/pl/plpgsql/src/pl_scanner.c + keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone"), + // https://www.postgresql.org/docs/11/datatype.html + builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), + atoms: set("false true null unknown"), + operatorChars: /^[*\/+\-%<>!=&|^\/#@?~]/, + backslashStringEscapes: false, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant") + }); + + // Google's SQL-like query language, GQL + CodeMirror.defineMIME("text/x-gql", { + name: "sql", + keywords: set("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"), + atoms: set("false true"), + builtin: set("blob datetime first key __key__ string integer double boolean null"), + operatorChars: /^[*+\-%<>!=]/ + }); + + // Greenplum + CodeMirror.defineMIME("text/x-gpsql", { + name: "sql", + client: set("source"), + //https://github.com/greenplum-db/gpdb/blob/master/src/include/parser/kwlist.h + keywords: set("abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone"), + builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast") + }); + + // Spark SQL + CodeMirror.defineMIME("text/x-sparksql", { + name: "sql", + keywords: set("add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with"), + builtin: set("abs acos acosh add_months aggregate and any approx_count_distinct approx_percentile array array_contains array_distinct array_except array_intersect array_join array_max array_min array_position array_remove array_repeat array_sort array_union arrays_overlap arrays_zip ascii asin asinh assert_true atan atan2 atanh avg base64 between bigint bin binary bit_and bit_count bit_get bit_length bit_or bit_xor bool_and bool_or boolean bround btrim cardinality case cast cbrt ceil ceiling char char_length character_length chr coalesce collect_list collect_set concat concat_ws conv corr cos cosh cot count count_if count_min_sketch covar_pop covar_samp crc32 cume_dist current_catalog current_database current_date current_timestamp current_timezone current_user date date_add date_format date_from_unix_date date_part date_sub date_trunc datediff day dayofmonth dayofweek dayofyear decimal decode degrees delimited dense_rank div double e element_at elt encode every exists exp explode explode_outer expm1 extract factorial filter find_in_set first first_value flatten float floor forall format_number format_string from_csv from_json from_unixtime from_utc_timestamp get_json_object getbit greatest grouping grouping_id hash hex hour hypot if ifnull in initcap inline inline_outer input_file_block_length input_file_block_start input_file_name inputformat instr int isnan isnotnull isnull java_method json_array_length json_object_keys json_tuple kurtosis lag last last_day last_value lcase lead least left length levenshtein like ln locate log log10 log1p log2 lower lpad ltrim make_date make_dt_interval make_interval make_timestamp make_ym_interval map map_concat map_entries map_filter map_from_arrays map_from_entries map_keys map_values map_zip_with max max_by md5 mean min min_by minute mod monotonically_increasing_id month months_between named_struct nanvl negative next_day not now nth_value ntile nullif nvl nvl2 octet_length or outputformat overlay parse_url percent_rank percentile percentile_approx pi pmod posexplode posexplode_outer position positive pow power printf quarter radians raise_error rand randn random rank rcfile reflect regexp regexp_extract regexp_extract_all regexp_like regexp_replace repeat replace reverse right rint rlike round row_number rpad rtrim schema_of_csv schema_of_json second sentences sequence sequencefile serde session_window sha sha1 sha2 shiftleft shiftright shiftrightunsigned shuffle sign signum sin sinh size skewness slice smallint some sort_array soundex space spark_partition_id split sqrt stack std stddev stddev_pop stddev_samp str_to_map string struct substr substring substring_index sum tan tanh textfile timestamp timestamp_micros timestamp_millis timestamp_seconds tinyint to_csv to_date to_json to_timestamp to_unix_timestamp to_utc_timestamp transform transform_keys transform_values translate trim trunc try_add try_divide typeof ucase unbase64 unhex uniontype unix_date unix_micros unix_millis unix_seconds unix_timestamp upper uuid var_pop var_samp variance version weekday weekofyear when width_bucket window xpath xpath_boolean xpath_double xpath_float xpath_int xpath_long xpath_number xpath_short xpath_string xxhash64 year zip_with"), + atoms: set("false true null"), + operatorChars: /^[*\/+\-%<>!=~&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable doubleQuote zerolessFloat") + }); + + // Esper + CodeMirror.defineMIME("text/x-esper", { + name: "sql", + client: set("source"), + // http://www.espertech.com/esper/release-5.5.0/esper-reference/html/appendix_keywords.html + keywords: set("alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window"), + builtin: {}, + atoms: set("false true null"), + operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, + dateSQL: set("time"), + support: set("decimallessFloat zerolessFloat binaryNumber hexNumber") + }); +}); + +/* + How Properties of Mime Types are used by SQL Mode + ================================================= + + keywords: + A list of keywords you want to be highlighted. + builtin: + A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). + operatorChars: + All characters that must be handled as operators. + client: + Commands parsed and executed by the client (not the server). + support: + A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. + * ODBCdotTable: .tableName + * zerolessFloat: .1 + * doubleQuote + * nCharCast: N'string' + * charsetCast: _utf8'string' + * commentHash: use # char for comments + * commentSlashSlash: use // for comments + * commentSpaceRequired: require a space after -- for comments + atoms: + Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: + UNKNOWN, INFINITY, UNDERFLOW, NaN... + dateSQL: + Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. +*/ diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stex/stex.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stex/stex.js new file mode 100644 index 0000000000..20c3bc7a18 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stex/stex.js @@ -0,0 +1,264 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* + * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de) + * Licence: MIT + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("stex", function(_config, parserConfig) { + "use strict"; + + function pushCommand(state, command) { + state.cmdState.push(command); + } + + function peekCommand(state) { + if (state.cmdState.length > 0) { + return state.cmdState[state.cmdState.length - 1]; + } else { + return null; + } + } + + function popCommand(state) { + var plug = state.cmdState.pop(); + if (plug) { + plug.closeBracket(); + } + } + + // returns the non-default plugin closest to the end of the list + function getMostPowerful(state) { + var context = state.cmdState; + for (var i = context.length - 1; i >= 0; i--) { + var plug = context[i]; + if (plug.name == "DEFAULT") { + continue; + } + return plug; + } + return { styleIdentifier: function() { return null; } }; + } + + function addPluginPattern(pluginName, cmdStyle, styles) { + return function () { + this.name = pluginName; + this.bracketNo = 0; + this.style = cmdStyle; + this.styles = styles; + this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin + + this.styleIdentifier = function() { + return this.styles[this.bracketNo - 1] || null; + }; + this.openBracket = function() { + this.bracketNo++; + return "bracket"; + }; + this.closeBracket = function() {}; + }; + } + + var plugins = {}; + + plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]); + plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]); + plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]); + plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]); + plugins["end"] = addPluginPattern("end", "tag", ["atom"]); + + plugins["label" ] = addPluginPattern("label" , "tag", ["atom"]); + plugins["ref" ] = addPluginPattern("ref" , "tag", ["atom"]); + plugins["eqref" ] = addPluginPattern("eqref" , "tag", ["atom"]); + plugins["cite" ] = addPluginPattern("cite" , "tag", ["atom"]); + plugins["bibitem" ] = addPluginPattern("bibitem" , "tag", ["atom"]); + plugins["Bibitem" ] = addPluginPattern("Bibitem" , "tag", ["atom"]); + plugins["RBibitem" ] = addPluginPattern("RBibitem" , "tag", ["atom"]); + + plugins["DEFAULT"] = function () { + this.name = "DEFAULT"; + this.style = "tag"; + + this.styleIdentifier = this.openBracket = this.closeBracket = function() {}; + }; + + function setState(state, f) { + state.f = f; + } + + // called when in a normal (no environment) context + function normal(source, state) { + var plug; + // Do we look like '\command' ? If so, attempt to apply the plugin 'command' + if (source.match(/^\\[a-zA-Z@]+/)) { + var cmdName = source.current().slice(1); + plug = plugins.hasOwnProperty(cmdName) ? plugins[cmdName] : plugins["DEFAULT"]; + plug = new plug(); + pushCommand(state, plug); + setState(state, beginParams); + return plug.style; + } + + // escape characters + if (source.match(/^\\[$&%#{}_]/)) { + return "tag"; + } + + // white space control characters + if (source.match(/^\\[,;!\/\\]/)) { + return "tag"; + } + + // find if we're starting various math modes + if (source.match("\\[")) { + setState(state, function(source, state){ return inMathMode(source, state, "\\]"); }); + return "keyword"; + } + if (source.match("\\(")) { + setState(state, function(source, state){ return inMathMode(source, state, "\\)"); }); + return "keyword"; + } + if (source.match("$$")) { + setState(state, function(source, state){ return inMathMode(source, state, "$$"); }); + return "keyword"; + } + if (source.match("$")) { + setState(state, function(source, state){ return inMathMode(source, state, "$"); }); + return "keyword"; + } + + var ch = source.next(); + if (ch == "%") { + source.skipToEnd(); + return "comment"; + } else if (ch == '}' || ch == ']') { + plug = peekCommand(state); + if (plug) { + plug.closeBracket(ch); + setState(state, beginParams); + } else { + return "error"; + } + return "bracket"; + } else if (ch == '{' || ch == '[') { + plug = plugins["DEFAULT"]; + plug = new plug(); + pushCommand(state, plug); + return "bracket"; + } else if (/\d/.test(ch)) { + source.eatWhile(/[\w.%]/); + return "atom"; + } else { + source.eatWhile(/[\w\-_]/); + plug = getMostPowerful(state); + if (plug.name == 'begin') { + plug.argument = source.current(); + } + return plug.styleIdentifier(); + } + } + + function inMathMode(source, state, endModeSeq) { + if (source.eatSpace()) { + return null; + } + if (endModeSeq && source.match(endModeSeq)) { + setState(state, normal); + return "keyword"; + } + if (source.match(/^\\[a-zA-Z@]+/)) { + return "tag"; + } + if (source.match(/^[a-zA-Z]+/)) { + return "variable-2"; + } + // escape characters + if (source.match(/^\\[$&%#{}_]/)) { + return "tag"; + } + // white space control characters + if (source.match(/^\\[,;!\/]/)) { + return "tag"; + } + // special math-mode characters + if (source.match(/^[\^_&]/)) { + return "tag"; + } + // non-special characters + if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) { + return null; + } + if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) { + return "number"; + } + var ch = source.next(); + if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") { + return "bracket"; + } + + if (ch == "%") { + source.skipToEnd(); + return "comment"; + } + return "error"; + } + + function beginParams(source, state) { + var ch = source.peek(), lastPlug; + if (ch == '{' || ch == '[') { + lastPlug = peekCommand(state); + lastPlug.openBracket(ch); + source.eat(ch); + setState(state, normal); + return "bracket"; + } + if (/[ \t\r]/.test(ch)) { + source.eat(ch); + return null; + } + setState(state, normal); + popCommand(state); + + return normal(source, state); + } + + return { + startState: function() { + var f = parserConfig.inMathMode ? function(source, state){ return inMathMode(source, state); } : normal; + return { + cmdState: [], + f: f + }; + }, + copyState: function(s) { + return { + cmdState: s.cmdState.slice(), + f: s.f + }; + }, + token: function(stream, state) { + return state.f(stream, state); + }, + blankLine: function(state) { + state.f = normal; + state.cmdState.length = 0; + }, + lineComment: "%" + }; + }); + + CodeMirror.defineMIME("text/x-stex", "stex"); + CodeMirror.defineMIME("text/x-latex", "stex"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stylus/stylus.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stylus/stylus.js new file mode 100644 index 0000000000..978696bddd --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/stylus/stylus.js @@ -0,0 +1,775 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Stylus mode created by Dmitry Kiselyov http://git.io/AaRB + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("stylus", function(config) { + var indentUnit = config.indentUnit, + indentUnitString = '', + tagKeywords = keySet(tagKeywords_), + tagVariablesRegexp = /^(a|b|i|s|col|em)$/i, + propertyKeywords = keySet(propertyKeywords_), + nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_), + valueKeywords = keySet(valueKeywords_), + colorKeywords = keySet(colorKeywords_), + documentTypes = keySet(documentTypes_), + documentTypesRegexp = wordRegexp(documentTypes_), + mediaFeatures = keySet(mediaFeatures_), + mediaTypes = keySet(mediaTypes_), + fontProperties = keySet(fontProperties_), + operatorsRegexp = /^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/, + wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_), + blockKeywords = keySet(blockKeywords_), + vendorPrefixesRegexp = new RegExp(/^\-(moz|ms|o|webkit)-/i), + commonAtoms = keySet(commonAtoms_), + firstWordMatch = "", + states = {}, + ch, + style, + type, + override; + + while (indentUnitString.length < indentUnit) indentUnitString += ' '; + + /** + * Tokenizers + */ + function tokenBase(stream, state) { + firstWordMatch = stream.string.match(/(^[\w-]+\s*=\s*$)|(^\s*[\w-]+\s*=\s*[\w-])|(^\s*(\.|#|@|\$|\&|\[|\d|\+|::?|\{|\>|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/); + state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\s*/, "") : ""; + state.context.line.indent = stream.indentation(); + ch = stream.peek(); + + // Line comment + if (stream.match("//")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } + // Block comment + if (stream.match("/*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + // String + if (ch == "\"" || ch == "'") { + stream.next(); + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + // Def + if (ch == "@") { + stream.next(); + stream.eatWhile(/[\w\\-]/); + return ["def", stream.current()]; + } + // ID selector or Hex color + if (ch == "#") { + stream.next(); + // Hex color + if (stream.match(/^[0-9a-f]{3}([0-9a-f]([0-9a-f]{2}){0,2})?\b(?!-)/i)) { + return ["atom", "atom"]; + } + // ID selector + if (stream.match(/^[a-z][\w-]*/i)) { + return ["builtin", "hash"]; + } + } + // Vendor prefixes + if (stream.match(vendorPrefixesRegexp)) { + return ["meta", "vendor-prefixes"]; + } + // Numbers + if (stream.match(/^-?[0-9]?\.?[0-9]/)) { + stream.eatWhile(/[a-z%]/i); + return ["number", "unit"]; + } + // !important|optional + if (ch == "!") { + stream.next(); + return [stream.match(/^(important|optional)/i) ? "keyword": "operator", "important"]; + } + // Class + if (ch == "." && stream.match(/^\.[a-z][\w-]*/i)) { + return ["qualifier", "qualifier"]; + } + // url url-prefix domain regexp + if (stream.match(documentTypesRegexp)) { + if (stream.peek() == "(") state.tokenize = tokenParenthesized; + return ["property", "word"]; + } + // Mixins / Functions + if (stream.match(/^[a-z][\w-]*\(/i)) { + stream.backUp(1); + return ["keyword", "mixin"]; + } + // Block mixins + if (stream.match(/^(\+|-)[a-z][\w-]*\(/i)) { + stream.backUp(1); + return ["keyword", "block-mixin"]; + } + // Parent Reference BEM naming + if (stream.string.match(/^\s*&/) && stream.match(/^[-_]+[a-z][\w-]*/)) { + return ["qualifier", "qualifier"]; + } + // / Root Reference & Parent Reference + if (stream.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)) { + stream.backUp(1); + return ["variable-3", "reference"]; + } + if (stream.match(/^&{1}\s*$/)) { + return ["variable-3", "reference"]; + } + // Word operator + if (stream.match(wordOperatorKeywordsRegexp)) { + return ["operator", "operator"]; + } + // Word + if (stream.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)) { + // Variable + if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) { + if (!wordIsTag(stream.current())) { + stream.match('.'); + return ["variable-2", "variable-name"]; + } + } + return ["variable-2", "word"]; + } + // Operators + if (stream.match(operatorsRegexp)) { + return ["operator", stream.current()]; + } + // Delimiters + if (/[:;,{}\[\]\(\)]/.test(ch)) { + stream.next(); + return [null, ch]; + } + // Non-detected items + stream.next(); + return [null, null]; + } + + /** + * Token comment + */ + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return ["comment", "comment"]; + } + + /** + * Token string + */ + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + if (quote == ")") stream.backUp(1); + break; + } + escaped = !escaped && ch == "\\"; + } + if (ch == quote || !escaped && quote != ")") state.tokenize = null; + return ["string", "string"]; + }; + } + + /** + * Token parenthesized + */ + function tokenParenthesized(stream, state) { + stream.next(); // Must be "(" + if (!stream.match(/\s*[\"\')]/, false)) + state.tokenize = tokenString(")"); + else + state.tokenize = null; + return [null, "("]; + } + + /** + * Context management + */ + function Context(type, indent, prev, line) { + this.type = type; + this.indent = indent; + this.prev = prev; + this.line = line || {firstWord: "", indent: 0}; + } + + function pushContext(state, stream, type, indent) { + indent = indent >= 0 ? indent : indentUnit; + state.context = new Context(type, stream.indentation() + indent, state.context); + return type; + } + + function popContext(state, currentIndent) { + var contextIndent = state.context.indent - indentUnit; + currentIndent = currentIndent || false; + state.context = state.context.prev; + if (currentIndent) state.context.indent = contextIndent; + return state.context.type; + } + + function pass(type, stream, state) { + return states[state.context.type](type, stream, state); + } + + function popAndPass(type, stream, state, n) { + for (var i = n || 1; i > 0; i--) + state.context = state.context.prev; + return pass(type, stream, state); + } + + + /** + * Parser + */ + function wordIsTag(word) { + return word.toLowerCase() in tagKeywords; + } + + function wordIsProperty(word) { + word = word.toLowerCase(); + return word in propertyKeywords || word in fontProperties; + } + + function wordIsBlock(word) { + return word.toLowerCase() in blockKeywords; + } + + function wordIsVendorPrefix(word) { + return word.toLowerCase().match(vendorPrefixesRegexp); + } + + function wordAsValue(word) { + var wordLC = word.toLowerCase(); + var override = "variable-2"; + if (wordIsTag(word)) override = "tag"; + else if (wordIsBlock(word)) override = "block-keyword"; + else if (wordIsProperty(word)) override = "property"; + else if (wordLC in valueKeywords || wordLC in commonAtoms) override = "atom"; + else if (wordLC == "return" || wordLC in colorKeywords) override = "keyword"; + + // Font family + else if (word.match(/^[A-Z]/)) override = "string"; + return override; + } + + function typeIsBlock(type, stream) { + return ((endOfLine(stream) && (type == "{" || type == "]" || type == "hash" || type == "qualifier")) || type == "block-mixin"); + } + + function typeIsInterpolation(type, stream) { + return type == "{" && stream.match(/^\s*\$?[\w-]+/i, false); + } + + function typeIsPseudo(type, stream) { + return type == ":" && stream.match(/^[a-z-]+/, false); + } + + function startOfLine(stream) { + return stream.sol() || stream.string.match(new RegExp("^\\s*" + escapeRegExp(stream.current()))); + } + + function endOfLine(stream) { + return stream.eol() || stream.match(/^\s*$/, false); + } + + function firstWordOfLine(line) { + var re = /^\s*[-_]*[a-z0-9]+[\w-]*/i; + var result = typeof line == "string" ? line.match(re) : line.string.match(re); + return result ? result[0].replace(/^\s*/, "") : ""; + } + + + /** + * Block + */ + states.block = function(type, stream, state) { + if ((type == "comment" && startOfLine(stream)) || + (type == "," && endOfLine(stream)) || + type == "mixin") { + return pushContext(state, stream, "block", 0); + } + if (typeIsInterpolation(type, stream)) { + return pushContext(state, stream, "interpolation"); + } + if (endOfLine(stream) && type == "]") { + if (!/^\s*(\.|#|:|\[|\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) { + return pushContext(state, stream, "block", 0); + } + } + if (typeIsBlock(type, stream)) { + return pushContext(state, stream, "block"); + } + if (type == "}" && endOfLine(stream)) { + return pushContext(state, stream, "block", 0); + } + if (type == "variable-name") { + if (stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/) || wordIsBlock(firstWordOfLine(stream))) { + return pushContext(state, stream, "variableName"); + } + else { + return pushContext(state, stream, "variableName", 0); + } + } + if (type == "=") { + if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) { + return pushContext(state, stream, "block", 0); + } + return pushContext(state, stream, "block"); + } + if (type == "*") { + if (endOfLine(stream) || stream.match(/\s*(,|\.|#|\[|:|{)/,false)) { + override = "tag"; + return pushContext(state, stream, "block"); + } + } + if (typeIsPseudo(type, stream)) { + return pushContext(state, stream, "pseudo"); + } + if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { + return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); + } + if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { + return pushContext(state, stream, "keyframes"); + } + if (/@extends?/.test(type)) { + return pushContext(state, stream, "extend", 0); + } + if (type && type.charAt(0) == "@") { + + // Property Lookup + if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) { + override = "variable-2"; + return "block"; + } + if (/(@import|@require|@charset)/.test(type)) { + return pushContext(state, stream, "block", 0); + } + return pushContext(state, stream, "block"); + } + if (type == "reference" && endOfLine(stream)) { + return pushContext(state, stream, "block"); + } + if (type == "(") { + return pushContext(state, stream, "parens"); + } + + if (type == "vendor-prefixes") { + return pushContext(state, stream, "vendorPrefixes"); + } + if (type == "word") { + var word = stream.current(); + override = wordAsValue(word); + + if (override == "property") { + if (startOfLine(stream)) { + return pushContext(state, stream, "block", 0); + } else { + override = "atom"; + return "block"; + } + } + + if (override == "tag") { + + // tag is a css value + if (/embed|menu|pre|progress|sub|table/.test(word)) { + if (wordIsProperty(firstWordOfLine(stream))) { + override = "atom"; + return "block"; + } + } + + // tag is an attribute + if (stream.string.match(new RegExp("\\[\\s*" + word + "|" + word +"\\s*\\]"))) { + override = "atom"; + return "block"; + } + + // tag is a variable + if (tagVariablesRegexp.test(word)) { + if ((startOfLine(stream) && stream.string.match(/=/)) || + (!startOfLine(stream) && + !stream.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/) && + !wordIsTag(firstWordOfLine(stream)))) { + override = "variable-2"; + if (wordIsBlock(firstWordOfLine(stream))) return "block"; + return pushContext(state, stream, "block", 0); + } + } + + if (endOfLine(stream)) return pushContext(state, stream, "block"); + } + if (override == "block-keyword") { + override = "keyword"; + + // Postfix conditionals + if (stream.current(/(if|unless)/) && !startOfLine(stream)) { + return "block"; + } + return pushContext(state, stream, "block"); + } + if (word == "return") return pushContext(state, stream, "block", 0); + + // Placeholder selector + if (override == "variable-2" && stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)) { + return pushContext(state, stream, "block"); + } + } + return state.context.type; + }; + + + /** + * Parens + */ + states.parens = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "parens"); + if (type == ")") { + if (state.context.prev.type == "parens") { + return popContext(state); + } + if ((stream.string.match(/^[a-z][\w-]*\(/i) && endOfLine(stream)) || + wordIsBlock(firstWordOfLine(stream)) || + /(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(firstWordOfLine(stream)) || + (!stream.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/) && + wordIsTag(firstWordOfLine(stream)))) { + return pushContext(state, stream, "block"); + } + if (stream.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/) || + stream.string.match(/^\s*(\(|\)|[0-9])/) || + stream.string.match(/^\s+[a-z][\w-]*\(/i) || + stream.string.match(/^\s+[\$-]?[a-z]/i)) { + return pushContext(state, stream, "block", 0); + } + if (endOfLine(stream)) return pushContext(state, stream, "block"); + else return pushContext(state, stream, "block", 0); + } + if (type && type.charAt(0) == "@" && wordIsProperty(stream.current().slice(1))) { + override = "variable-2"; + } + if (type == "word") { + var word = stream.current(); + override = wordAsValue(word); + if (override == "tag" && tagVariablesRegexp.test(word)) { + override = "variable-2"; + } + if (override == "property" || word == "to") override = "atom"; + } + if (type == "variable-name") { + return pushContext(state, stream, "variableName"); + } + if (typeIsPseudo(type, stream)) { + return pushContext(state, stream, "pseudo"); + } + return state.context.type; + }; + + + /** + * Vendor prefixes + */ + states.vendorPrefixes = function(type, stream, state) { + if (type == "word") { + override = "property"; + return pushContext(state, stream, "block", 0); + } + return popContext(state); + }; + + + /** + * Pseudo + */ + states.pseudo = function(type, stream, state) { + if (!wordIsProperty(firstWordOfLine(stream.string))) { + stream.match(/^[a-z-]+/); + override = "variable-3"; + if (endOfLine(stream)) return pushContext(state, stream, "block"); + return popContext(state); + } + return popAndPass(type, stream, state); + }; + + + /** + * atBlock + */ + states.atBlock = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "atBlock_parens"); + if (typeIsBlock(type, stream)) { + return pushContext(state, stream, "block"); + } + if (typeIsInterpolation(type, stream)) { + return pushContext(state, stream, "interpolation"); + } + if (type == "word") { + var word = stream.current().toLowerCase(); + if (/^(only|not|and|or)$/.test(word)) + override = "keyword"; + else if (documentTypes.hasOwnProperty(word)) + override = "tag"; + else if (mediaTypes.hasOwnProperty(word)) + override = "attribute"; + else if (mediaFeatures.hasOwnProperty(word)) + override = "property"; + else if (nonStandardPropertyKeywords.hasOwnProperty(word)) + override = "string-2"; + else override = wordAsValue(stream.current()); + if (override == "tag" && endOfLine(stream)) { + return pushContext(state, stream, "block"); + } + } + if (type == "operator" && /^(not|and|or)$/.test(stream.current())) { + override = "keyword"; + } + return state.context.type; + }; + + states.atBlock_parens = function(type, stream, state) { + if (type == "{" || type == "}") return state.context.type; + if (type == ")") { + if (endOfLine(stream)) return pushContext(state, stream, "block"); + else return pushContext(state, stream, "atBlock"); + } + if (type == "word") { + var word = stream.current().toLowerCase(); + override = wordAsValue(word); + if (/^(max|min)/.test(word)) override = "property"; + if (override == "tag") { + tagVariablesRegexp.test(word) ? override = "variable-2" : override = "atom"; + } + return state.context.type; + } + return states.atBlock(type, stream, state); + }; + + + /** + * Keyframes + */ + states.keyframes = function(type, stream, state) { + if (stream.indentation() == "0" && ((type == "}" && startOfLine(stream)) || type == "]" || type == "hash" + || type == "qualifier" || wordIsTag(stream.current()))) { + return popAndPass(type, stream, state); + } + if (type == "{") return pushContext(state, stream, "keyframes"); + if (type == "}") { + if (startOfLine(stream)) return popContext(state, true); + else return pushContext(state, stream, "keyframes"); + } + if (type == "unit" && /^[0-9]+\%$/.test(stream.current())) { + return pushContext(state, stream, "keyframes"); + } + if (type == "word") { + override = wordAsValue(stream.current()); + if (override == "block-keyword") { + override = "keyword"; + return pushContext(state, stream, "keyframes"); + } + } + if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { + return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); + } + if (type == "mixin") { + return pushContext(state, stream, "block", 0); + } + return state.context.type; + }; + + + /** + * Interpolation + */ + states.interpolation = function(type, stream, state) { + if (type == "{") popContext(state) && pushContext(state, stream, "block"); + if (type == "}") { + if (stream.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i) || + (stream.string.match(/^\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) { + return pushContext(state, stream, "block"); + } + if (!stream.string.match(/^(\{|\s*\&)/) || + stream.match(/\s*[\w-]/,false)) { + return pushContext(state, stream, "block", 0); + } + return pushContext(state, stream, "block"); + } + if (type == "variable-name") { + return pushContext(state, stream, "variableName", 0); + } + if (type == "word") { + override = wordAsValue(stream.current()); + if (override == "tag") override = "atom"; + } + return state.context.type; + }; + + + /** + * Extend/s + */ + states.extend = function(type, stream, state) { + if (type == "[" || type == "=") return "extend"; + if (type == "]") return popContext(state); + if (type == "word") { + override = wordAsValue(stream.current()); + return "extend"; + } + return popContext(state); + }; + + + /** + * Variable name + */ + states.variableName = function(type, stream, state) { + if (type == "string" || type == "[" || type == "]" || stream.current().match(/^(\.|\$)/)) { + if (stream.current().match(/^\.[\w-]+/i)) override = "variable-2"; + return "variableName"; + } + return popAndPass(type, stream, state); + }; + + + return { + startState: function(base) { + return { + tokenize: null, + state: "block", + context: new Context("block", base || 0, null) + }; + }, + token: function(stream, state) { + if (!state.tokenize && stream.eatSpace()) return null; + style = (state.tokenize || tokenBase)(stream, state); + if (style && typeof style == "object") { + type = style[1]; + style = style[0]; + } + override = style; + state.state = states[state.state](type, stream, state); + return override; + }, + indent: function(state, textAfter, line) { + + var cx = state.context, + ch = textAfter && textAfter.charAt(0), + indent = cx.indent, + lineFirstWord = firstWordOfLine(textAfter), + lineIndent = line.match(/^\s*/)[0].replace(/\t/g, indentUnitString).length, + prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : "", + prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent; + + if (cx.prev && + (ch == "}" && (cx.type == "block" || cx.type == "atBlock" || cx.type == "keyframes") || + ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || + ch == "{" && (cx.type == "at"))) { + indent = cx.indent - indentUnit; + } else if (!(/(\})/.test(ch))) { + if (/@|\$|\d/.test(ch) || + /^\{/.test(textAfter) || +/^\s*\/(\/|\*)/.test(textAfter) || + /^\s*\/\*/.test(prevLineFirstWord) || + /^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(textAfter) || +/^(\+|-)?[a-z][\w-]*\(/i.test(textAfter) || +/^return/.test(textAfter) || + wordIsBlock(lineFirstWord)) { + indent = lineIndent; + } else if (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(ch) || wordIsTag(lineFirstWord)) { + if (/\,\s*$/.test(prevLineFirstWord)) { + indent = prevLineIndent; + } else if (/^\s+/.test(line) && (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) { + indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; + } else { + indent = lineIndent; + } + } else if (!/,\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) { + if (wordIsBlock(prevLineFirstWord)) { + indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; + } else if (/^\{/.test(prevLineFirstWord)) { + indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit; + } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) { + indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent; + } else if (/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(prevLineFirstWord) || + /=\s*$/.test(prevLineFirstWord) || + wordIsTag(prevLineFirstWord) || + /^\$[\w-\.\[\]\'\"]/.test(prevLineFirstWord)) { + indent = prevLineIndent + indentUnit; + } else { + indent = lineIndent; + } + } + } + return indent; + }, + electricChars: "}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: "//", + fold: "indent" + }; + }); + + // developer.mozilla.org/en-US/docs/Web/HTML/Element + var tagKeywords_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi", "bdo","bgsound","blockquote","body","br","button","canvas","caption","cite", "code","col","colgroup","data","datalist","dd","del","details","dfn","div", "dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1", "h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe", "img","input","ins","kbd","keygen","label","legend","li","link","main","map", "mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes", "noscript","object","ol","optgroup","option","output","p","param","pre", "progress","q","rp","rt","ruby","s","samp","script","section","select", "small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track", "u","ul","var","video"]; + + // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js + // Note, "url-prefix" should precede "url" in order to match correctly in documentTypesRegexp + var documentTypes_ = ["domain", "regexp", "url-prefix", "url"]; + var mediaTypes_ = ["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"]; + var mediaFeatures_ = ["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","dynamic-range","video-dynamic-range"]; + var propertyKeywords_ = ["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"]; + var nonStandardPropertyKeywords_ = ["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"]; + var fontProperties_ = ["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]; + var colorKeywords_ = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; + var valueKeywords_ = ["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","conic-gradient","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","high","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeating-conic-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","standard","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around", "unset"]; + + var wordOperatorKeywords_ = ["in","and","or","not","is not","is a","is","isnt","defined","if unless"], + blockKeywords_ = ["for","if","else","unless", "from", "to"], + commonAtoms_ = ["null","true","false","href","title","type","not-allowed","readonly","disabled"], + commonDef_ = ["@font-face", "@keyframes", "@media", "@viewport", "@page", "@host", "@supports", "@block", "@css"]; + + var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_, + propertyKeywords_,nonStandardPropertyKeywords_, + colorKeywords_,valueKeywords_,fontProperties_, + wordOperatorKeywords_,blockKeywords_, + commonAtoms_,commonDef_); + + function wordRegexp(words) { + words = words.sort(function(a,b){return b > a;}); + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + function keySet(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) keys[array[i]] = true; + return keys; + } + + function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + + CodeMirror.registerHelper("hintWords", "stylus", hintWords); + CodeMirror.defineMIME("text/x-styl", "stylus"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/swift/swift.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/swift/swift.js new file mode 100644 index 0000000000..55e31e2708 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/swift/swift.js @@ -0,0 +1,223 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Swift mode created by Michael Kaminsky https://github.com/mkaminsky11 + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod) + else + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + + function wordSet(words) { + var set = {} + for (var i = 0; i < words.length; i++) set[words[i]] = true + return set + } + + var keywords = wordSet(["_","var","let","class","enum","extension","import","protocol","struct","func","typealias","associatedtype", + "open","public","internal","fileprivate","private","deinit","init","new","override","self","subscript","super", + "convenience","dynamic","final","indirect","lazy","required","static","unowned","unowned(safe)","unowned(unsafe)","weak","as","is", + "break","case","continue","default","else","fallthrough","for","guard","if","in","repeat","switch","where","while", + "defer","return","inout","mutating","nonmutating","catch","do","rethrows","throw","throws","try","didSet","get","set","willSet", + "assignment","associativity","infix","left","none","operator","postfix","precedence","precedencegroup","prefix","right", + "Any","AnyObject","Type","dynamicType","Self","Protocol","__COLUMN__","__FILE__","__FUNCTION__","__LINE__"]) + var definingKeywords = wordSet(["var","let","class","enum","extension","import","protocol","struct","func","typealias","associatedtype","for"]) + var atoms = wordSet(["true","false","nil","self","super","_"]) + var types = wordSet(["Array","Bool","Character","Dictionary","Double","Float","Int","Int8","Int16","Int32","Int64","Never","Optional","Set","String", + "UInt8","UInt16","UInt32","UInt64","Void"]) + var operators = "+-/*%=|&<>~^?!" + var punc = ":;,.(){}[]" + var binary = /^\-?0b[01][01_]*/ + var octal = /^\-?0o[0-7][0-7_]*/ + var hexadecimal = /^\-?0x[\dA-Fa-f][\dA-Fa-f_]*(?:(?:\.[\dA-Fa-f][\dA-Fa-f_]*)?[Pp]\-?\d[\d_]*)?/ + var decimal = /^\-?\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee]\-?\d[\d_]*)?/ + var identifier = /^\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1/ + var property = /^\.(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/ + var instruction = /^\#[A-Za-z]+/ + var attribute = /^@(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/ + //var regexp = /^\/(?!\s)(?:\/\/)?(?:\\.|[^\/])+\// + + function tokenBase(stream, state, prev) { + if (stream.sol()) state.indented = stream.indentation() + if (stream.eatSpace()) return null + + var ch = stream.peek() + if (ch == "/") { + if (stream.match("//")) { + stream.skipToEnd() + return "comment" + } + if (stream.match("/*")) { + state.tokenize.push(tokenComment) + return tokenComment(stream, state) + } + } + if (stream.match(instruction)) return "builtin" + if (stream.match(attribute)) return "attribute" + if (stream.match(binary)) return "number" + if (stream.match(octal)) return "number" + if (stream.match(hexadecimal)) return "number" + if (stream.match(decimal)) return "number" + if (stream.match(property)) return "property" + if (operators.indexOf(ch) > -1) { + stream.next() + return "operator" + } + if (punc.indexOf(ch) > -1) { + stream.next() + stream.match("..") + return "punctuation" + } + var stringMatch + if (stringMatch = stream.match(/("""|"|')/)) { + var tokenize = tokenString.bind(null, stringMatch[0]) + state.tokenize.push(tokenize) + return tokenize(stream, state) + } + + if (stream.match(identifier)) { + var ident = stream.current() + if (types.hasOwnProperty(ident)) return "variable-2" + if (atoms.hasOwnProperty(ident)) return "atom" + if (keywords.hasOwnProperty(ident)) { + if (definingKeywords.hasOwnProperty(ident)) + state.prev = "define" + return "keyword" + } + if (prev == "define") return "def" + return "variable" + } + + stream.next() + return null + } + + function tokenUntilClosingParen() { + var depth = 0 + return function(stream, state, prev) { + var inner = tokenBase(stream, state, prev) + if (inner == "punctuation") { + if (stream.current() == "(") ++depth + else if (stream.current() == ")") { + if (depth == 0) { + stream.backUp(1) + state.tokenize.pop() + return state.tokenize[state.tokenize.length - 1](stream, state) + } + else --depth + } + } + return inner + } + } + + function tokenString(openQuote, stream, state) { + var singleLine = openQuote.length == 1 + var ch, escaped = false + while (ch = stream.peek()) { + if (escaped) { + stream.next() + if (ch == "(") { + state.tokenize.push(tokenUntilClosingParen()) + return "string" + } + escaped = false + } else if (stream.match(openQuote)) { + state.tokenize.pop() + return "string" + } else { + stream.next() + escaped = ch == "\\" + } + } + if (singleLine) { + state.tokenize.pop() + } + return "string" + } + + function tokenComment(stream, state) { + var ch + while (true) { + stream.match(/^[^/*]+/, true) + ch = stream.next() + if (!ch) break + if (ch === "/" && stream.eat("*")) { + state.tokenize.push(tokenComment) + } else if (ch === "*" && stream.eat("/")) { + state.tokenize.pop() + } + } + return "comment" + } + + function Context(prev, align, indented) { + this.prev = prev + this.align = align + this.indented = indented + } + + function pushContext(state, stream) { + var align = stream.match(/^\s*($|\/[\/\*])/, false) ? null : stream.column() + 1 + state.context = new Context(state.context, align, state.indented) + } + + function popContext(state) { + if (state.context) { + state.indented = state.context.indented + state.context = state.context.prev + } + } + + CodeMirror.defineMode("swift", function(config) { + return { + startState: function() { + return { + prev: null, + context: null, + indented: 0, + tokenize: [] + } + }, + + token: function(stream, state) { + var prev = state.prev + state.prev = null + var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase + var style = tokenize(stream, state, prev) + if (!style || style == "comment") state.prev = prev + else if (!state.prev) state.prev = style + + if (style == "punctuation") { + var bracket = /[\(\[\{]|([\]\)\}])/.exec(stream.current()) + if (bracket) (bracket[1] ? popContext : pushContext)(state, stream) + } + + return style + }, + + indent: function(state, textAfter) { + var cx = state.context + if (!cx) return 0 + var closing = /^[\]\}\)]/.test(textAfter) + if (cx.align != null) return cx.align - (closing ? 1 : 0) + return cx.indented + (closing ? 0 : config.indentUnit) + }, + + electricInput: /^\s*[\)\}\]]$/, + + lineComment: "//", + blockCommentStart: "/*", + blockCommentEnd: "*/", + fold: "brace", + closeBrackets: "()[]{}''\"\"``" + } + }) + + CodeMirror.defineMIME("text/x-swift","swift") +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tcl/tcl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tcl/tcl.js new file mode 100644 index 0000000000..dec0662a60 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tcl/tcl.js @@ -0,0 +1,140 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +//tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("tcl", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " + + "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " + + "binary break catch cd close concat continue dde eof encoding error " + + "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " + + "filename flush for foreach format gets glob global history http if " + + "incr info interp join lappend lindex linsert list llength load lrange " + + "lreplace lsearch lset lsort memory msgcat namespace open package parray " + + "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " + + "registry regsub rename resource return scan seek set socket source split " + + "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " + + "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " + + "tclvars tell time trace unknown unset update uplevel upvar variable " + + "vwait"); + var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); + var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + if ((ch == '"' || ch == "'") && state.inParams) { + return chain(stream, state, tokenString(ch)); + } else if (/[\[\]{}\(\),;\.]/.test(ch)) { + if (ch == "(" && beforeParams) state.inParams = true; + else if (ch == ")") state.inParams = false; + return null; + } else if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } else if (ch == "#") { + if (stream.eat("*")) + return chain(stream, state, tokenComment); + if (ch == "#" && stream.match(/ *\[ *\[/)) + return chain(stream, state, tokenUnparsed); + stream.skipToEnd(); + return "comment"; + } else if (ch == '"') { + stream.skipTo(/"/); + return "comment"; + } else if (ch == "$") { + stream.eatWhile(/[$_a-z0-9A-Z\.{:]/); + stream.eatWhile(/}/); + state.beforeParams = true; + return "builtin"; + } else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "comment"; + } else { + stream.eatWhile(/[\w\$_{}\xa1-\uffff]/); + var word = stream.current().toLowerCase(); + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + if (functions && functions.propertyIsEnumerable(word)) { + state.beforeParams = true; + return "keyword"; + } + return null; + } + } + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize = tokenBase; + return "string"; + }; + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == "]") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + lineComment: "#" + }; +}); +CodeMirror.defineMIME("text/x-tcl", "tcl"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/textile/textile.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/textile/textile.js new file mode 100644 index 0000000000..b378fb61f5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/textile/textile.js @@ -0,0 +1,469 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") { // CommonJS + mod(require("../../lib/codemirror")); + } else if (typeof define == "function" && define.amd) { // AMD + define(["../../lib/codemirror"], mod); + } else { // Plain browser env + mod(CodeMirror); + } +})(function(CodeMirror) { + "use strict"; + + var TOKEN_STYLES = { + addition: "positive", + attributes: "attribute", + bold: "strong", + cite: "keyword", + code: "atom", + definitionList: "number", + deletion: "negative", + div: "punctuation", + em: "em", + footnote: "variable", + footCite: "qualifier", + header: "header", + html: "comment", + image: "string", + italic: "em", + link: "link", + linkDefinition: "link", + list1: "variable-2", + list2: "variable-3", + list3: "keyword", + notextile: "string-2", + pre: "operator", + p: "property", + quote: "bracket", + span: "quote", + specialChar: "tag", + strong: "strong", + sub: "builtin", + sup: "builtin", + table: "variable-3", + tableHeading: "operator" + }; + + function startNewLine(stream, state) { + state.mode = Modes.newLayout; + state.tableHeading = false; + + if (state.layoutType === "definitionList" && state.spanningLayout && + stream.match(RE("definitionListEnd"), false)) + state.spanningLayout = false; + } + + function handlePhraseModifier(stream, state, ch) { + if (ch === "_") { + if (stream.eat("_")) + return togglePhraseModifier(stream, state, "italic", /__/, 2); + else + return togglePhraseModifier(stream, state, "em", /_/, 1); + } + + if (ch === "*") { + if (stream.eat("*")) { + return togglePhraseModifier(stream, state, "bold", /\*\*/, 2); + } + return togglePhraseModifier(stream, state, "strong", /\*/, 1); + } + + if (ch === "[") { + if (stream.match(/\d+\]/)) state.footCite = true; + return tokenStyles(state); + } + + if (ch === "(") { + var spec = stream.match(/^(r|tm|c)\)/); + if (spec) + return tokenStylesWith(state, TOKEN_STYLES.specialChar); + } + + if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/)) + return tokenStylesWith(state, TOKEN_STYLES.html); + + if (ch === "?" && stream.eat("?")) + return togglePhraseModifier(stream, state, "cite", /\?\?/, 2); + + if (ch === "=" && stream.eat("=")) + return togglePhraseModifier(stream, state, "notextile", /==/, 2); + + if (ch === "-" && !stream.eat("-")) + return togglePhraseModifier(stream, state, "deletion", /-/, 1); + + if (ch === "+") + return togglePhraseModifier(stream, state, "addition", /\+/, 1); + + if (ch === "~") + return togglePhraseModifier(stream, state, "sub", /~/, 1); + + if (ch === "^") + return togglePhraseModifier(stream, state, "sup", /\^/, 1); + + if (ch === "%") + return togglePhraseModifier(stream, state, "span", /%/, 1); + + if (ch === "@") + return togglePhraseModifier(stream, state, "code", /@/, 1); + + if (ch === "!") { + var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1); + stream.match(/^:\S+/); // optional Url portion + return type; + } + return tokenStyles(state); + } + + function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) { + var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null; + var charAfter = stream.peek(); + if (state[phraseModifier]) { + if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) { + var type = tokenStyles(state); + state[phraseModifier] = false; + return type; + } + } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) && + stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) { + state[phraseModifier] = true; + state.mode = Modes.attributes; + } + return tokenStyles(state); + }; + + function tokenStyles(state) { + var disabled = textileDisabled(state); + if (disabled) return disabled; + + var styles = []; + if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]); + + styles = styles.concat(activeStyles( + state, "addition", "bold", "cite", "code", "deletion", "em", "footCite", + "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading")); + + if (state.layoutType === "header") + styles.push(TOKEN_STYLES.header + "-" + state.header); + + return styles.length ? styles.join(" ") : null; + } + + function textileDisabled(state) { + var type = state.layoutType; + + switch(type) { + case "notextile": + case "code": + case "pre": + return TOKEN_STYLES[type]; + default: + if (state.notextile) + return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : ""); + return null; + } + } + + function tokenStylesWith(state, extraStyles) { + var disabled = textileDisabled(state); + if (disabled) return disabled; + + var type = tokenStyles(state); + if (extraStyles) + return type ? (type + " " + extraStyles) : extraStyles; + else + return type; + } + + function activeStyles(state) { + var styles = []; + for (var i = 1; i < arguments.length; ++i) { + if (state[arguments[i]]) + styles.push(TOKEN_STYLES[arguments[i]]); + } + return styles; + } + + function blankLine(state) { + var spanningLayout = state.spanningLayout, type = state.layoutType; + + for (var key in state) if (state.hasOwnProperty(key)) + delete state[key]; + + state.mode = Modes.newLayout; + if (spanningLayout) { + state.layoutType = type; + state.spanningLayout = true; + } + } + + var REs = { + cache: {}, + single: { + bc: "bc", + bq: "bq", + definitionList: /- .*?:=+/, + definitionListEnd: /.*=:\s*$/, + div: "div", + drawTable: /\|.*\|/, + foot: /fn\d+/, + header: /h[1-6]/, + html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/, + link: /[^"]+":\S/, + linkDefinition: /\[[^\s\]]+\]\S+/, + list: /(?:#+|\*+)/, + notextile: "notextile", + para: "p", + pre: "pre", + table: "table", + tableCellAttributes: /[\/\\]\d+/, + tableHeading: /\|_\./, + tableText: /[^"_\*\[\(\?\+~\^%@|-]+/, + text: /[^!"_=\*\[\(<\?\+~\^%@-]+/ + }, + attributes: { + align: /(?:<>|<|>|=)/, + selector: /\([^\(][^\)]+\)/, + lang: /\[[^\[\]]+\]/, + pad: /(?:\(+|\)+){1,2}/, + css: /\{[^\}]+\}/ + }, + createRe: function(name) { + switch (name) { + case "drawTable": + return REs.makeRe("^", REs.single.drawTable, "$"); + case "html": + return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$"); + case "linkDefinition": + return REs.makeRe("^", REs.single.linkDefinition, "$"); + case "listLayout": + return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+"); + case "tableCellAttributes": + return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes, + RE("allAttributes")), "+\\."); + case "type": + return REs.makeRe("^", RE("allTypes")); + case "typeLayout": + return REs.makeRe("^", RE("allTypes"), RE("allAttributes"), + "*\\.\\.?", "(\\s+|$)"); + case "attributes": + return REs.makeRe("^", RE("allAttributes"), "+"); + + case "allTypes": + return REs.choiceRe(REs.single.div, REs.single.foot, + REs.single.header, REs.single.bc, REs.single.bq, + REs.single.notextile, REs.single.pre, REs.single.table, + REs.single.para); + + case "allAttributes": + return REs.choiceRe(REs.attributes.selector, REs.attributes.css, + REs.attributes.lang, REs.attributes.align, REs.attributes.pad); + + default: + return REs.makeRe("^", REs.single[name]); + } + }, + makeRe: function() { + var pattern = ""; + for (var i = 0; i < arguments.length; ++i) { + var arg = arguments[i]; + pattern += (typeof arg === "string") ? arg : arg.source; + } + return new RegExp(pattern); + }, + choiceRe: function() { + var parts = [arguments[0]]; + for (var i = 1; i < arguments.length; ++i) { + parts[i * 2 - 1] = "|"; + parts[i * 2] = arguments[i]; + } + + parts.unshift("(?:"); + parts.push(")"); + return REs.makeRe.apply(null, parts); + } + }; + + function RE(name) { + return (REs.cache[name] || (REs.cache[name] = REs.createRe(name))); + } + + var Modes = { + newLayout: function(stream, state) { + if (stream.match(RE("typeLayout"), false)) { + state.spanningLayout = false; + return (state.mode = Modes.blockType)(stream, state); + } + var newMode; + if (!textileDisabled(state)) { + if (stream.match(RE("listLayout"), false)) + newMode = Modes.list; + else if (stream.match(RE("drawTable"), false)) + newMode = Modes.table; + else if (stream.match(RE("linkDefinition"), false)) + newMode = Modes.linkDefinition; + else if (stream.match(RE("definitionList"))) + newMode = Modes.definitionList; + else if (stream.match(RE("html"), false)) + newMode = Modes.html; + } + return (state.mode = (newMode || Modes.text))(stream, state); + }, + + blockType: function(stream, state) { + var match, type; + state.layoutType = null; + + if (match = stream.match(RE("type"))) + type = match[0]; + else + return (state.mode = Modes.text)(stream, state); + + if (match = type.match(RE("header"))) { + state.layoutType = "header"; + state.header = parseInt(match[0][1]); + } else if (type.match(RE("bq"))) { + state.layoutType = "quote"; + } else if (type.match(RE("bc"))) { + state.layoutType = "code"; + } else if (type.match(RE("foot"))) { + state.layoutType = "footnote"; + } else if (type.match(RE("notextile"))) { + state.layoutType = "notextile"; + } else if (type.match(RE("pre"))) { + state.layoutType = "pre"; + } else if (type.match(RE("div"))) { + state.layoutType = "div"; + } else if (type.match(RE("table"))) { + state.layoutType = "table"; + } + + state.mode = Modes.attributes; + return tokenStyles(state); + }, + + text: function(stream, state) { + if (stream.match(RE("text"))) return tokenStyles(state); + + var ch = stream.next(); + if (ch === '"') + return (state.mode = Modes.link)(stream, state); + return handlePhraseModifier(stream, state, ch); + }, + + attributes: function(stream, state) { + state.mode = Modes.layoutLength; + + if (stream.match(RE("attributes"))) + return tokenStylesWith(state, TOKEN_STYLES.attributes); + else + return tokenStyles(state); + }, + + layoutLength: function(stream, state) { + if (stream.eat(".") && stream.eat(".")) + state.spanningLayout = true; + + state.mode = Modes.text; + return tokenStyles(state); + }, + + list: function(stream, state) { + var match = stream.match(RE("list")); + state.listDepth = match[0].length; + var listMod = (state.listDepth - 1) % 3; + if (!listMod) + state.layoutType = "list1"; + else if (listMod === 1) + state.layoutType = "list2"; + else + state.layoutType = "list3"; + + state.mode = Modes.attributes; + return tokenStyles(state); + }, + + link: function(stream, state) { + state.mode = Modes.text; + if (stream.match(RE("link"))) { + stream.match(/\S+/); + return tokenStylesWith(state, TOKEN_STYLES.link); + } + return tokenStyles(state); + }, + + linkDefinition: function(stream, state) { + stream.skipToEnd(); + return tokenStylesWith(state, TOKEN_STYLES.linkDefinition); + }, + + definitionList: function(stream, state) { + stream.match(RE("definitionList")); + + state.layoutType = "definitionList"; + + if (stream.match(/\s*$/)) + state.spanningLayout = true; + else + state.mode = Modes.attributes; + + return tokenStyles(state); + }, + + html: function(stream, state) { + stream.skipToEnd(); + return tokenStylesWith(state, TOKEN_STYLES.html); + }, + + table: function(stream, state) { + state.layoutType = "table"; + return (state.mode = Modes.tableCell)(stream, state); + }, + + tableCell: function(stream, state) { + if (stream.match(RE("tableHeading"))) + state.tableHeading = true; + else + stream.eat("|"); + + state.mode = Modes.tableCellAttributes; + return tokenStyles(state); + }, + + tableCellAttributes: function(stream, state) { + state.mode = Modes.tableText; + + if (stream.match(RE("tableCellAttributes"))) + return tokenStylesWith(state, TOKEN_STYLES.attributes); + else + return tokenStyles(state); + }, + + tableText: function(stream, state) { + if (stream.match(RE("tableText"))) + return tokenStyles(state); + + if (stream.peek() === "|") { // end of cell + state.mode = Modes.tableCell; + return tokenStyles(state); + } + return handlePhraseModifier(stream, state, stream.next()); + } + }; + + CodeMirror.defineMode("textile", function() { + return { + startState: function() { + return { mode: Modes.newLayout }; + }, + token: function(stream, state) { + if (stream.sol()) startNewLine(stream, state); + return state.mode(stream, state); + }, + blankLine: blankLine + }; + }); + + CodeMirror.defineMIME("text/x-textile", "textile"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.css new file mode 100644 index 0000000000..9a69b639f8 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.css @@ -0,0 +1,14 @@ +span.cm-underlined { + text-decoration: underline; +} +span.cm-strikethrough { + text-decoration: line-through; +} +span.cm-brace { + color: #170; + font-weight: bold; +} +span.cm-table { + color: blue; + font-weight: bold; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.js new file mode 100644 index 0000000000..6a9ce447ba --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiddlywiki/tiddlywiki.js @@ -0,0 +1,308 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/*** + |''Name''|tiddlywiki.js| + |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror| + |''Author''|PMario| + |''Version''|0.1.7| + |''Status''|''stable''| + |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]| + |''Documentation''|https://codemirror.tiddlyspace.com/| + |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]| + |''CoreVersion''|2.5.0| + |''Requires''|codemirror.js| + |''Keywords''|syntax highlighting color code mirror codemirror| + ! Info + CoreVersion parameter is needed for TiddlyWiki only! +***/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("tiddlywiki", function () { + // Tokenizer + var textwords = {}; + + var keywords = { + "allTags": true, "closeAll": true, "list": true, + "newJournal": true, "newTiddler": true, + "permaview": true, "saveChanges": true, + "search": true, "slider": true, "tabs": true, + "tag": true, "tagging": true, "tags": true, + "tiddler": true, "timeline": true, + "today": true, "version": true, "option": true, + "with": true, "filter": true + }; + + var isSpaceName = /[\w_\-]/i, + reHR = /^\-\-\-\-+$/, //
    + reWikiCommentStart = /^\/\*\*\*$/, // /*** + reWikiCommentStop = /^\*\*\*\/$/, // ***/ + reBlockQuote = /^<<<$/, + + reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start + reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop + reXmlCodeStart = /^$/, // xml block start + reXmlCodeStop = /^$/, // xml stop + + reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start + reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop + + reUntilCodeStop = /.*?\}\}\}/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function tokenBase(stream, state) { + var sol = stream.sol(), ch = stream.peek(); + + state.block = false; // indicates the start of a code block. + + // check start of blocks + if (sol && /[<\/\*{}\-]/.test(ch)) { + if (stream.match(reCodeBlockStart)) { + state.block = true; + return chain(stream, state, twTokenCode); + } + if (stream.match(reBlockQuote)) + return 'quote'; + if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) + return 'comment'; + if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) + return 'comment'; + if (stream.match(reHR)) + return 'hr'; + } + + stream.next(); + if (sol && /[\/\*!#;:>|]/.test(ch)) { + if (ch == "!") { // tw header + stream.skipToEnd(); + return "header"; + } + if (ch == "*") { // tw list + stream.eatWhile('*'); + return "comment"; + } + if (ch == "#") { // tw numbered list + stream.eatWhile('#'); + return "comment"; + } + if (ch == ";") { // definition list, term + stream.eatWhile(';'); + return "comment"; + } + if (ch == ":") { // definition list, description + stream.eatWhile(':'); + return "comment"; + } + if (ch == ">") { // single line quote + stream.eatWhile(">"); + return "quote"; + } + if (ch == '|') + return 'header'; + } + + if (ch == '{' && stream.match('{{')) + return chain(stream, state, twTokenCode); + + // rudimentary html:// file:// link matching. TW knows much more ... + if (/[hf]/i.test(ch) && + /[ti]/i.test(stream.peek()) && + stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) + return "link"; + + // just a little string indicator, don't want to have the whole string covered + if (ch == '"') + return 'string'; + + if (ch == '~') // _no_ CamelCase indicator should be bold + return 'brace'; + + if (/[\[\]]/.test(ch) && stream.match(ch)) // check for [[..]] + return 'brace'; + + if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting + stream.eatWhile(isSpaceName); + return "link"; + } + + if (/\d/.test(ch)) { // numbers + stream.eatWhile(/\d/); + return "number"; + } + + if (ch == "/") { // tw invisible comment + if (stream.eat("%")) { + return chain(stream, state, twTokenComment); + } else if (stream.eat("/")) { // + return chain(stream, state, twTokenEm); + } + } + + if (ch == "_" && stream.eat("_")) // tw underline + return chain(stream, state, twTokenUnderline); + + // strikethrough and mdash handling + if (ch == "-" && stream.eat("-")) { + // if strikethrough looks ugly, change CSS. + if (stream.peek() != ' ') + return chain(stream, state, twTokenStrike); + // mdash + if (stream.peek() == ' ') + return 'brace'; + } + + if (ch == "'" && stream.eat("'")) // tw bold + return chain(stream, state, twTokenStrong); + + if (ch == "<" && stream.eat("<")) // tw macro + return chain(stream, state, twTokenMacro); + + // core macro handling + stream.eatWhile(/[\w\$_]/); + return textwords.propertyIsEnumerable(stream.current()) ? "keyword" : null + } + + // tw invisible comment + function twTokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "%"); + } + return "comment"; + } + + // tw strong / bold + function twTokenStrong(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "'" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "'"); + } + return "strong"; + } + + // tw code + function twTokenCode(stream, state) { + var sb = state.block; + + if (sb && stream.current()) { + return "comment"; + } + + if (!sb && stream.match(reUntilCodeStop)) { + state.tokenize = tokenBase; + return "comment"; + } + + if (sb && stream.sol() && stream.match(reCodeBlockStop)) { + state.tokenize = tokenBase; + return "comment"; + } + + stream.next(); + return "comment"; + } + + // tw em / italic + function twTokenEm(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "/"); + } + return "em"; + } + + // tw underlined text + function twTokenUnderline(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "_" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "_"); + } + return "underlined"; + } + + // tw strike through text looks ugly + // change CSS if needed + function twTokenStrike(stream, state) { + var maybeEnd = false, ch; + + while (ch = stream.next()) { + if (ch == "-" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "-"); + } + return "strikethrough"; + } + + // macro + function twTokenMacro(stream, state) { + if (stream.current() == '<<') { + return 'macro'; + } + + var ch = stream.next(); + if (!ch) { + state.tokenize = tokenBase; + return null; + } + if (ch == ">") { + if (stream.peek() == '>') { + stream.next(); + state.tokenize = tokenBase; + return "macro"; + } + } + + stream.eatWhile(/[\w\$_]/); + return keywords.propertyIsEnumerable(stream.current()) ? "keyword" : null + } + + // Interface + return { + startState: function () { + return {tokenize: tokenBase}; + }, + + token: function (stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + } + }; +}); + +CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.css new file mode 100644 index 0000000000..1d8704c780 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.css @@ -0,0 +1,26 @@ +.cm-tw-syntaxerror { + color: #FFF; + background-color: #900; +} + +.cm-tw-deleted { + text-decoration: line-through; +} + +.cm-tw-header5 { + font-weight: bold; +} +.cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/ + padding-left: 10px; +} + +.cm-tw-box { + border-top-width: 0px !important; + border-style: solid; + border-width: 1px; + border-color: inherit; +} + +.cm-tw-underline { + text-decoration: underline; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.js new file mode 100644 index 0000000000..092b859532 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tiki/tiki.js @@ -0,0 +1,312 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('tiki', function(config) { + function inBlock(style, terminator, returnTokenizer) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = inText; + break; + } + stream.next(); + } + + if (returnTokenizer) state.tokenize = returnTokenizer; + + return style; + }; + } + + function inLine(style) { + return function(stream, state) { + while(!stream.eol()) { + stream.next(); + } + state.tokenize = inText; + return style; + }; + } + + function inText(stream, state) { + function chain(parser) { + state.tokenize = parser; + return parser(stream, state); + } + + var sol = stream.sol(); + var ch = stream.next(); + + //non start of line + switch (ch) { //switch is generally much faster than if, so it is used here + case "{": //plugin + stream.eat("/"); + stream.eatSpace(); + stream.eatWhile(/[^\s\u00a0=\"\'\/?(}]/); + state.tokenize = inPlugin; + return "tag"; + case "_": //bold + if (stream.eat("_")) + return chain(inBlock("strong", "__", inText)); + break; + case "'": //italics + if (stream.eat("'")) + return chain(inBlock("em", "''", inText)); + break; + case "(":// Wiki Link + if (stream.eat("(")) + return chain(inBlock("variable-2", "))", inText)); + break; + case "[":// Weblink + return chain(inBlock("variable-3", "]", inText)); + break; + case "|": //table + if (stream.eat("|")) + return chain(inBlock("comment", "||")); + break; + case "-": + if (stream.eat("=")) {//titleBar + return chain(inBlock("header string", "=-", inText)); + } else if (stream.eat("-")) {//deleted + return chain(inBlock("error tw-deleted", "--", inText)); + } + break; + case "=": //underline + if (stream.match("==")) + return chain(inBlock("tw-underline", "===", inText)); + break; + case ":": + if (stream.eat(":")) + return chain(inBlock("comment", "::")); + break; + case "^": //box + return chain(inBlock("tw-box", "^")); + break; + case "~": //np + if (stream.match("np~")) + return chain(inBlock("meta", "~/np~")); + break; + } + + //start of line types + if (sol) { + switch (ch) { + case "!": //header at start of line + if (stream.match('!!!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!!')) { + return chain(inLine("header string")); + } else if (stream.match('!!')) { + return chain(inLine("header string")); + } else { + return chain(inLine("header string")); + } + break; + case "*": //unordered list line item, or
  • at start of line + case "#": //ordered list line item, or
  • at start of line + case "+": //ordered list line item, or
  • at start of line + return chain(inLine("tw-listitem bracket")); + break; + } + } + + //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki + return null; + } + + var indentUnit = config.indentUnit; + + // Return variables for tokenizers + var pluginName, type; + function inPlugin(stream, state) { + var ch = stream.next(); + var peek = stream.peek(); + + if (ch == "}") { + state.tokenize = inText; + //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin + return "tag"; + } else if (ch == "(" || ch == ")") { + return "bracket"; + } else if (ch == "=") { + type = "equals"; + + if (peek == ">") { + stream.next(); + peek = stream.peek(); + } + + //here we detect values directly after equal character with no quotes + if (!/[\'\"]/.test(peek)) { + state.tokenize = inAttributeNoQuote(); + } + //end detect values + + return "operator"; + } else if (/[\'\"]/.test(ch)) { + state.tokenize = inAttribute(ch); + return state.tokenize(stream, state); + } else { + stream.eatWhile(/[^\s\u00a0=\"\'\/?]/); + return "keyword"; + } + } + + function inAttribute(quote) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.next() == quote) { + state.tokenize = inPlugin; + break; + } + } + return "string"; + }; + } + + function inAttributeNoQuote() { + return function(stream, state) { + while (!stream.eol()) { + var ch = stream.next(); + var peek = stream.peek(); + if (ch == " " || ch == "," || /[ )}]/.test(peek)) { + state.tokenize = inPlugin; + break; + } + } + return "string"; +}; + } + +var curState, setStyle; +function pass() { + for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); +} + +function cont() { + pass.apply(null, arguments); + return true; +} + +function pushContext(pluginName, startOfLine) { + var noIndent = curState.context && curState.context.noIndent; + curState.context = { + prev: curState.context, + pluginName: pluginName, + indent: curState.indented, + startOfLine: startOfLine, + noIndent: noIndent + }; +} + +function popContext() { + if (curState.context) curState.context = curState.context.prev; +} + +function element(type) { + if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));} + else if (type == "closePlugin") { + var err = false; + if (curState.context) { + err = curState.context.pluginName != pluginName; + popContext(); + } else { + err = true; + } + if (err) setStyle = "error"; + return cont(endcloseplugin(err)); + } + else if (type == "string") { + if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata"); + if (curState.tokenize == inText) popContext(); + return cont(); + } + else return cont(); +} + +function endplugin(startOfLine) { + return function(type) { + if ( + type == "selfclosePlugin" || + type == "endPlugin" + ) + return cont(); + if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();} + return cont(); + }; +} + +function endcloseplugin(err) { + return function(type) { + if (err) setStyle = "error"; + if (type == "endPlugin") return cont(); + return pass(); + }; +} + +function attributes(type) { + if (type == "keyword") {setStyle = "attribute"; return cont(attributes);} + if (type == "equals") return cont(attvalue, attributes); + return pass(); +} +function attvalue(type) { + if (type == "keyword") {setStyle = "string"; return cont();} + if (type == "string") return cont(attvaluemaybe); + return pass(); +} +function attvaluemaybe(type) { + if (type == "string") return cont(attvaluemaybe); + else return pass(); +} +return { + startState: function() { + return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null}; + }, + token: function(stream, state) { + if (stream.sol()) { + state.startOfLine = true; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + + setStyle = type = pluginName = null; + var style = state.tokenize(stream, state); + if ((style || type) && style != "comment") { + curState = state; + while (true) { + var comb = state.cc.pop() || element; + if (comb(type || style)) break; + } + } + state.startOfLine = false; + return setStyle || style; + }, + indent: function(state, textAfter) { + var context = state.context; + if (context && context.noIndent) return 0; + if (context && /^{\//.test(textAfter)) + context = context.prev; + while (context && !context.startOfLine) + context = context.prev; + if (context) return context.indent + indentUnit; + else return 0; + }, + electricChars: "/" +}; +}); + +CodeMirror.defineMIME("text/tiki", "tiki"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/toml/toml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/toml/toml.js new file mode 100644 index 0000000000..891f384b5b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/toml/toml.js @@ -0,0 +1,88 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("toml", function () { + return { + startState: function () { + return { + inString: false, + stringType: "", + lhs: true, + inArray: 0 + }; + }, + token: function (stream, state) { + //check for state changes + if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) { + state.stringType = stream.peek(); + stream.next(); // Skip quote + state.inString = true; // Update state + } + if (stream.sol() && state.inArray === 0) { + state.lhs = true; + } + //return state + if (state.inString) { + while (state.inString && !stream.eol()) { + if (stream.peek() === state.stringType) { + stream.next(); // Skip quote + state.inString = false; // Clear flag + } else if (stream.peek() === '\\') { + stream.next(); + stream.next(); + } else { + stream.match(/^.[^\\\"\']*/); + } + } + return state.lhs ? "property string" : "string"; // Token style + } else if (state.inArray && stream.peek() === ']') { + stream.next(); + state.inArray--; + return 'bracket'; + } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) { + stream.next();//skip closing ] + // array of objects has an extra open & close [] + if (stream.peek() === ']') stream.next(); + return "atom"; + } else if (stream.peek() === "#") { + stream.skipToEnd(); + return "comment"; + } else if (stream.eatSpace()) { + return null; + } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) { + return "property"; + } else if (state.lhs && stream.peek() === "=") { + stream.next(); + state.lhs = false; + return null; + } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) { + return 'atom'; //date + } else if (!state.lhs && (stream.match('true') || stream.match('false'))) { + return 'atom'; + } else if (!state.lhs && stream.peek() === '[') { + state.inArray++; + stream.next(); + return 'bracket'; + } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) { + return 'number'; + } else if (!stream.eatSpace()) { + stream.next(); + } + return null; + } + }; +}); + +CodeMirror.defineMIME('text/x-toml', 'toml'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tornado/tornado.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tornado/tornado.js new file mode 100644 index 0000000000..aa589a08c3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/tornado/tornado.js @@ -0,0 +1,68 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/overlay")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/overlay"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("tornado:inner", function() { + var keywords = ["and","as","assert","autoescape","block","break","class","comment","context", + "continue","datetime","def","del","elif","else","end","escape","except", + "exec","extends","false","finally","for","from","global","if","import","in", + "include","is","json_encode","lambda","length","linkify","load","module", + "none","not","or","pass","print","put","raise","raw","return","self","set", + "squeeze","super","true","try","url_escape","while","with","without","xhtml_escape","yield"]; + keywords = new RegExp("^((" + keywords.join(")|(") + "))\\b"); + + function tokenBase (stream, state) { + stream.eatWhile(/[^\{]/); + var ch = stream.next(); + if (ch == "{") { + if (ch = stream.eat(/\{|%|#/)) { + state.tokenize = inTag(ch); + return "tag"; + } + } + } + function inTag (close) { + if (close == "{") { + close = "}"; + } + return function (stream, state) { + var ch = stream.next(); + if ((ch == close) && stream.eat("}")) { + state.tokenize = tokenBase; + return "tag"; + } + if (stream.match(keywords)) { + return "keyword"; + } + return close == "#" ? "comment" : "string"; + }; + } + return { + startState: function () { + return {tokenize: tokenBase}; + }, + token: function (stream, state) { + return state.tokenize(stream, state); + } + }; + }); + + CodeMirror.defineMode("tornado", function(config) { + var htmlBase = CodeMirror.getMode(config, "text/html"); + var tornadoInner = CodeMirror.getMode(config, "tornado:inner"); + return CodeMirror.overlayMode(htmlBase, tornadoInner); + }); + + CodeMirror.defineMIME("text/x-tornado", "tornado"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/troff/troff.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/troff/troff.js new file mode 100644 index 0000000000..0c2220d2cc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/troff/troff.js @@ -0,0 +1,84 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('troff', function() { + + var words = {}; + + function tokenBase(stream) { + if (stream.eatSpace()) return null; + + var sol = stream.sol(); + var ch = stream.next(); + + if (ch === '\\') { + if (stream.match('fB') || stream.match('fR') || stream.match('fI') || + stream.match('u') || stream.match('d') || + stream.match('%') || stream.match('&')) { + return 'string'; + } + if (stream.match('m[')) { + stream.skipTo(']'); + stream.next(); + return 'string'; + } + if (stream.match('s+') || stream.match('s-')) { + stream.eatWhile(/[\d-]/); + return 'string'; + } + if (stream.match('\(') || stream.match('*\(')) { + stream.eatWhile(/[\w-]/); + return 'string'; + } + return 'string'; + } + if (sol && (ch === '.' || ch === '\'')) { + if (stream.eat('\\') && stream.eat('\"')) { + stream.skipToEnd(); + return 'comment'; + } + } + if (sol && ch === '.') { + if (stream.match('B ') || stream.match('I ') || stream.match('R ')) { + return 'attribute'; + } + if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) { + stream.skipToEnd(); + return 'quote'; + } + if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) { + return 'attribute'; + } + } + stream.eatWhile(/[\w-]/); + var cur = stream.current(); + return words.hasOwnProperty(cur) ? words[cur] : null; + } + + function tokenize(stream, state) { + return (state.tokens[0] || tokenBase) (stream, state); + }; + + return { + startState: function() {return {tokens:[]};}, + token: function(stream, state) { + return tokenize(stream, state); + } + }; +}); + +CodeMirror.defineMIME('text/troff', 'troff'); +CodeMirror.defineMIME('text/x-troff', 'troff'); +CodeMirror.defineMIME('application/x-troff', 'troff'); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js new file mode 100644 index 0000000000..9d4b8405af --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn-cfg/ttcn-cfg.js @@ -0,0 +1,214 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("ttcn-cfg", function(config, parserConfig) { + var indentUnit = config.indentUnit, + keywords = parserConfig.keywords || {}, + fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {}, + externalCommands = parserConfig.externalCommands || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false; + var isOperatorChar = /[\|]/; + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[:=]/.test(ch)) { + curPunc = ch; + return "punctuation"; + } + if (ch == "#"){ + stream.skipToEnd(); + return "comment"; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + if (ch == "["){ + stream.eatWhile(/[\w_\]]/); + return "number sectionTitle"; + } + + stream.eatWhile(/[\w\$_]/); + var cur = stream.current(); + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (fileNCtrlMaskOptions.propertyIsEnumerable(cur)) + return "negative fileNCtrlMaskOptions"; + if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands"; + + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped){ + var afterNext = stream.peek(); + //look if the character if the quote is like the B in '10100010'B + if (afterNext){ + afterNext = afterNext.toLowerCase(); + if(afterNext == "b" || afterNext == "h" || afterNext == "o") + stream.next(); + } + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + //Interface + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") + && ctx.type == "statement"){ + popContext(state); + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") + && curPunc != ';') || (ctx.type == "statement" + && curPunc == "newstatement"))) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + electricChars: "{}", + lineComment: "#", + fold: "brace" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) + obj[words[i]] = true; + return obj; + } + + CodeMirror.defineMIME("text/x-ttcn-cfg", { + name: "ttcn-cfg", + keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" + + " TimeStampFormat LogEventTypes SourceInfoFormat" + + " LogEntityName LogSourceInfo DiskFullAction" + + " LogFileNumber LogFileSize MatchingHints Detailed" + + " Compact SubCategories Stack Single None Seconds" + + " DateTime Time Stop Error Retry Delete TCPPort KillTimer" + + " NumHCs UnixSocketsEnabled LocalAddress"), + fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" + + " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" + + " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" + + " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" + + " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" + + " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" + + " VERDICTOP DEFAULTOP TESTCASE ACTION USER" + + " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" + + " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" + + " DEBUG_ENCDEC DEBUG_TESTPORT" + + " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" + + " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" + + " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" + + " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" + + " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" + + " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" + + " FUNCTION_RND FUNCTION_UNQUALIFIED" + + " MATCHING_DONE MATCHING_MCSUCCESS" + + " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" + + " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" + + " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" + + " MATCHING_PMUNSUCC MATCHING_PROBLEM" + + " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" + + " PARALLEL_PORTCONN PARALLEL_PORTMAP" + + " PARALLEL_PTC PARALLEL_UNQUALIFIED" + + " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" + + " PORTEVENT_MCRECV PORTEVENT_MCSEND" + + " PORTEVENT_MMRECV PORTEVENT_MMSEND" + + " PORTEVENT_MQUEUE PORTEVENT_PCIN" + + " PORTEVENT_PCOUT PORTEVENT_PMIN" + + " PORTEVENT_PMOUT PORTEVENT_PQUEUE" + + " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" + + " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" + + " TESTCASE_FINISH TESTCASE_START" + + " TESTCASE_UNQUALIFIED TIMEROP_GUARD" + + " TIMEROP_READ TIMEROP_START TIMEROP_STOP" + + " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" + + " USER_UNQUALIFIED VERDICTOP_FINAL" + + " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" + + " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"), + externalCommands: words("BeginControlPart EndControlPart BeginTestCase" + + " EndTestCase"), + multiLineStrings: true + }); +}); \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn/ttcn.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn/ttcn.js new file mode 100644 index 0000000000..0304e7c53d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/ttcn/ttcn.js @@ -0,0 +1,283 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("ttcn", function(config, parserConfig) { + var indentUnit = config.indentUnit, + keywords = parserConfig.keywords || {}, + builtin = parserConfig.builtin || {}, + timerOps = parserConfig.timerOps || {}, + portOps = parserConfig.portOps || {}, + configOps = parserConfig.configOps || {}, + verdictOps = parserConfig.verdictOps || {}, + sutOps = parserConfig.sutOps || {}, + functionOps = parserConfig.functionOps || {}, + + verdictConsts = parserConfig.verdictConsts || {}, + booleanConsts = parserConfig.booleanConsts || {}, + otherConsts = parserConfig.otherConsts || {}, + + types = parserConfig.types || {}, + visibilityModifiers = parserConfig.visibilityModifiers || {}, + templateMatch = parserConfig.templateMatch || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false; + var isOperatorChar = /[+\-*&@=<>!\/]/; + var curPunc; + + function tokenBase(stream, state) { + var ch = stream.next(); + + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[\[\]{}\(\),;\\:\?\.]/.test(ch)) { + curPunc = ch; + return "punctuation"; + } + if (ch == "#"){ + stream.skipToEnd(); + return "atom preprocessor"; + } + if (ch == "%"){ + stream.eatWhile(/\b/); + return "atom ttcn3Macros"; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + if(ch == "@"){ + if(stream.match("try") || stream.match("catch") + || stream.match("lazy")){ + return "keyword"; + } + } + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + var cur = stream.current(); + + if (keywords.propertyIsEnumerable(cur)) return "keyword"; + if (builtin.propertyIsEnumerable(cur)) return "builtin"; + + if (timerOps.propertyIsEnumerable(cur)) return "def timerOps"; + if (configOps.propertyIsEnumerable(cur)) return "def configOps"; + if (verdictOps.propertyIsEnumerable(cur)) return "def verdictOps"; + if (portOps.propertyIsEnumerable(cur)) return "def portOps"; + if (sutOps.propertyIsEnumerable(cur)) return "def sutOps"; + if (functionOps.propertyIsEnumerable(cur)) return "def functionOps"; + + if (verdictConsts.propertyIsEnumerable(cur)) return "string verdictConsts"; + if (booleanConsts.propertyIsEnumerable(cur)) return "string booleanConsts"; + if (otherConsts.propertyIsEnumerable(cur)) return "string otherConsts"; + + if (types.propertyIsEnumerable(cur)) return "builtin types"; + if (visibilityModifiers.propertyIsEnumerable(cur)) + return "builtin visibilityModifiers"; + if (templateMatch.propertyIsEnumerable(cur)) return "atom templateMatch"; + + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped){ + var afterQuote = stream.peek(); + //look if the character after the quote is like the B in '10100010'B + if (afterQuote){ + afterQuote = afterQuote.toLowerCase(); + if(afterQuote == "b" || afterQuote == "h" || afterQuote == "o") + stream.next(); + } + end = true; break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + + function pushContext(state, col, type) { + var indent = state.indented; + if (state.context && state.context.type == "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, null, state.context); + } + + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + + //Interface + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":" || curPunc == ",") + && ctx.type == "statement"){ + popContext(state); + } + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && + (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || + (ctx.type == "statement" && curPunc == "newstatement"))) + pushContext(state, stream.column(), "statement"); + + state.startOfLine = false; + + return style; + }, + + electricChars: "{}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "brace" + }; + }); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + function def(mimes, mode) { + if (typeof mimes == "string") mimes = [mimes]; + var words = []; + function add(obj) { + if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) + words.push(prop); + } + + add(mode.keywords); + add(mode.builtin); + add(mode.timerOps); + add(mode.portOps); + + if (words.length) { + mode.helperType = mimes[0]; + CodeMirror.registerHelper("hintWords", mimes[0], words); + } + + for (var i = 0; i < mimes.length; ++i) + CodeMirror.defineMIME(mimes[i], mode); + } + + def(["text/x-ttcn", "text/x-ttcn3", "text/x-ttcnpp"], { + name: "ttcn", + keywords: words("activate address alive all alt altstep and and4b any" + + " break case component const continue control deactivate" + + " display do else encode enumerated except exception" + + " execute extends extension external for from function" + + " goto group if import in infinity inout interleave" + + " label language length log match message mixed mod" + + " modifies module modulepar mtc noblock not not4b nowait" + + " of on optional or or4b out override param pattern port" + + " procedure record recursive rem repeat return runs select" + + " self sender set signature system template testcase to" + + " type union value valueof var variant while with xor xor4b"), + builtin: words("bit2hex bit2int bit2oct bit2str char2int char2oct encvalue" + + " decomp decvalue float2int float2str hex2bit hex2int" + + " hex2oct hex2str int2bit int2char int2float int2hex" + + " int2oct int2str int2unichar isbound ischosen ispresent" + + " isvalue lengthof log2str oct2bit oct2char oct2hex oct2int" + + " oct2str regexp replace rnd sizeof str2bit str2float" + + " str2hex str2int str2oct substr unichar2int unichar2char" + + " enum2int"), + types: words("anytype bitstring boolean char charstring default float" + + " hexstring integer objid octetstring universal verdicttype timer"), + timerOps: words("read running start stop timeout"), + portOps: words("call catch check clear getcall getreply halt raise receive" + + " reply send trigger"), + configOps: words("create connect disconnect done kill killed map unmap"), + verdictOps: words("getverdict setverdict"), + sutOps: words("action"), + functionOps: words("apply derefers refers"), + + verdictConsts: words("error fail inconc none pass"), + booleanConsts: words("true false"), + otherConsts: words("null NULL omit"), + + visibilityModifiers: words("private public friend"), + templateMatch: words("complement ifpresent subset superset permutation"), + multiLineStrings: true + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/turtle/turtle.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/turtle/turtle.js new file mode 100644 index 0000000000..695239661f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/turtle/turtle.js @@ -0,0 +1,162 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("turtle", function(config) { + var indentUnit = config.indentUnit; + var curPunc; + + function wordRegexp(words) { + return new RegExp("^(?:" + words.join("|") + ")$", "i"); + } + var ops = wordRegexp([]); + var keywords = wordRegexp(["@prefix", "@base", "a"]); + var operatorChars = /[*+\-<>=&|]/; + + function tokenBase(stream, state) { + var ch = stream.next(); + curPunc = null; + if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { + stream.match(/^[^\s\u00a0>]*>?/); + return "atom"; + } + else if (ch == "\"" || ch == "'") { + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } + else if (/[{}\(\),\.;\[\]]/.test(ch)) { + curPunc = ch; + return null; + } + else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + else if (operatorChars.test(ch)) { + stream.eatWhile(operatorChars); + return null; + } + else if (ch == ":") { + return "operator"; + } else { + stream.eatWhile(/[_\w\d]/); + if(stream.peek() == ":") { + return "variable-3"; + } else { + var word = stream.current(); + + if(keywords.test(word)) { + return "meta"; + } + + if(ch >= "A" && ch <= "Z") { + return "comment"; + } else { + return "keyword"; + } + } + var word = stream.current(); + if (ops.test(word)) + return null; + else if (keywords.test(word)) + return "meta"; + else + return "variable"; + } + } + + function tokenLiteral(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && ch == "\\"; + } + return "string"; + }; + } + + function pushContext(state, type, col) { + state.context = {prev: state.context, indent: state.indent, col: col, type: type}; + } + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, + context: null, + indent: 0, + col: 0}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) state.context.align = false; + state.indent = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + + if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { + state.context.align = true; + } + + if (curPunc == "(") pushContext(state, ")", stream.column()); + else if (curPunc == "[") pushContext(state, "]", stream.column()); + else if (curPunc == "{") pushContext(state, "}", stream.column()); + else if (/[\]\}\)]/.test(curPunc)) { + while (state.context && state.context.type == "pattern") popContext(state); + if (state.context && curPunc == state.context.type) popContext(state); + } + else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); + else if (/atom|string|variable/.test(style) && state.context) { + if (/[\}\]]/.test(state.context.type)) + pushContext(state, "pattern", stream.column()); + else if (state.context.type == "pattern" && !state.context.align) { + state.context.align = true; + state.context.col = stream.column(); + } + } + + return style; + }, + + indent: function(state, textAfter) { + var firstChar = textAfter && textAfter.charAt(0); + var context = state.context; + if (/[\]\}]/.test(firstChar)) + while (context && context.type == "pattern") context = context.prev; + + var closing = context && firstChar == context.type; + if (!context) + return 0; + else if (context.type == "pattern") + return context.col; + else if (context.align) + return context.col + (closing ? 0 : 1); + else + return context.indent + (closing ? 0 : indentUnit); + }, + + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/turtle", "turtle"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/twig/twig.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/twig/twig.js new file mode 100644 index 0000000000..a6dd3f1a68 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/twig/twig.js @@ -0,0 +1,141 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../addon/mode/multiplex")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../addon/mode/multiplex"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("twig:inner", function() { + var keywords = ["and", "as", "autoescape", "endautoescape", "block", "do", "endblock", "else", "elseif", "extends", "for", "endfor", "embed", "endembed", "filter", "endfilter", "flush", "from", "if", "endif", "in", "is", "include", "import", "not", "or", "set", "spaceless", "endspaceless", "with", "endwith", "trans", "endtrans", "blocktrans", "endblocktrans", "macro", "endmacro", "use", "verbatim", "endverbatim"], + operator = /^[+\-*&%=<>!?|~^]/, + sign = /^[:\[\(\{]/, + atom = ["true", "false", "null", "empty", "defined", "divisibleby", "divisible by", "even", "odd", "iterable", "sameas", "same as"], + number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; + + keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); + atom = new RegExp("((" + atom.join(")|(") + "))\\b"); + + function tokenBase (stream, state) { + var ch = stream.peek(); + + //Comment + if (state.incomment) { + if (!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Tag + } else if (state.intag) { + //After operator + if (state.operator) { + state.operator = false; + if (stream.match(atom)) { + return "atom"; + } + if (stream.match(number)) { + return "number"; + } + } + //After sign + if (state.sign) { + state.sign = false; + if (stream.match(atom)) { + return "atom"; + } + if (stream.match(number)) { + return "number"; + } + } + + if (state.instring) { + if (ch == state.instring) { + state.instring = false; + } + stream.next(); + return "string"; + } else if (ch == "'" || ch == '"') { + state.instring = ch; + stream.next(); + return "string"; + } else if (stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { + state.intag = false; + return "tag"; + } else if (stream.match(operator)) { + state.operator = true; + return "operator"; + } else if (stream.match(sign)) { + state.sign = true; + } else { + if (stream.eat(" ") || stream.sol()) { + if (stream.match(keywords)) { + return "keyword"; + } + if (stream.match(atom)) { + return "atom"; + } + if (stream.match(number)) { + return "number"; + } + if (stream.sol()) { + stream.next(); + } + } else { + stream.next(); + } + + } + return "variable"; + } else if (stream.eat("{")) { + if (stream.eat("#")) { + state.incomment = true; + if (!stream.skipTo("#}")) { + stream.skipToEnd(); + } else { + stream.eatWhile(/\#|}/); + state.incomment = false; + } + return "comment"; + //Open tag + } else if (ch = stream.eat(/\{|%/)) { + //Cache close tag + state.intag = ch; + if (ch == "{") { + state.intag = "}"; + } + stream.eat("-"); + return "tag"; + } + } + stream.next(); + }; + + return { + startState: function () { + return {}; + }, + token: function (stream, state) { + return tokenBase(stream, state); + } + }; + }); + + CodeMirror.defineMode("twig", function(config, parserConfig) { + var twigInner = CodeMirror.getMode(config, "twig:inner"); + if (!parserConfig || !parserConfig.base) return twigInner; + return CodeMirror.multiplexingMode( + CodeMirror.getMode(config, parserConfig.base), { + open: /\{[{#%]/, close: /[}#%]\}/, mode: twigInner, parseDelimiters: true + } + ); + }); + CodeMirror.defineMIME("text/x-twig", "twig"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vb/vb.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vb/vb.js new file mode 100644 index 0000000000..6e4b476309 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vb/vb.js @@ -0,0 +1,275 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("vb", function(conf, parserConf) { + var ERRORCLASS = 'error'; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]"); + var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]'); + var doubleOperators = new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); + var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); + var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); + var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); + + var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try', 'structure', 'synclock', 'using', 'with']; + var middleKeywords = ['else','elseif','case', 'catch', 'finally']; + var endKeywords = ['next','loop']; + + var operatorKeywords = ['and', "andalso", 'or', 'orelse', 'xor', 'in', 'not', 'is', 'isnot', 'like']; + var wordOperators = wordRegexp(operatorKeywords); + + var commonKeywords = ["#const", "#else", "#elseif", "#end", "#if", "#region", "addhandler", "addressof", "alias", "as", "byref", "byval", "cbool", "cbyte", "cchar", "cdate", "cdbl", "cdec", "cint", "clng", "cobj", "compare", "const", "continue", "csbyte", "cshort", "csng", "cstr", "cuint", "culng", "cushort", "declare", "default", "delegate", "dim", "directcast", "each", "erase", "error", "event", "exit", "explicit", "false", "for", "friend", "gettype", "goto", "handles", "implements", "imports", "infer", "inherits", "interface", "isfalse", "istrue", "lib", "me", "mod", "mustinherit", "mustoverride", "my", "mybase", "myclass", "namespace", "narrowing", "new", "nothing", "notinheritable", "notoverridable", "of", "off", "on", "operator", "option", "optional", "out", "overloads", "overridable", "overrides", "paramarray", "partial", "private", "protected", "public", "raiseevent", "readonly", "redim", "removehandler", "resume", "return", "shadows", "shared", "static", "step", "stop", "strict", "then", "throw", "to", "true", "trycast", "typeof", "until", "until", "when", "widening", "withevents", "writeonly"]; + + var commontypes = ['object', 'boolean', 'char', 'string', 'byte', 'sbyte', 'short', 'ushort', 'int16', 'uint16', 'integer', 'uinteger', 'int32', 'uint32', 'long', 'ulong', 'int64', 'uint64', 'decimal', 'single', 'double', 'float', 'date', 'datetime', 'intptr', 'uintptr']; + + var keywords = wordRegexp(commonKeywords); + var types = wordRegexp(commontypes); + var stringPrefixes = '"'; + + var opening = wordRegexp(openingKeywords); + var middle = wordRegexp(middleKeywords); + var closing = wordRegexp(endKeywords); + var doubleClosing = wordRegexp(['end']); + var doOpening = wordRegexp(['do']); + + var indentInfo = null; + + CodeMirror.registerHelper("hintWords", "vb", openingKeywords.concat(middleKeywords).concat(endKeywords) + .concat(operatorKeywords).concat(commonKeywords).concat(commontypes)); + + function indent(_stream, state) { + state.currentIndent++; + } + + function dedent(_stream, state) { + state.currentIndent--; + } + // tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return null; + } + + var ch = stream.peek(); + + // Handle Comments + if (ch === "'") { + stream.skipToEnd(); + return 'comment'; + } + + + // Handle Number Literals + if (stream.match(/^((&H)|(&O))?[0-9\.a-f]/i, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+F?/i)) { floatLiteral = true; } + else if (stream.match(/^\d+\.\d*F?/)) { floatLiteral = true; } + else if (stream.match(/^\.\d+F?/)) { floatLiteral = true; } + + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return 'number'; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } + // Octal + else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } + // Decimal + else if (stream.match(/^[1-9]\d*F?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return 'number'; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) { + return null; + } + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) { + return 'operator'; + } + if (stream.match(singleDelimiters)) { + return null; + } + if (stream.match(doOpening)) { + indent(stream,state); + state.doInCurrentLine = true; + return 'keyword'; + } + if (stream.match(opening)) { + if (! state.doInCurrentLine) + indent(stream,state); + else + state.doInCurrentLine = false; + return 'keyword'; + } + if (stream.match(middle)) { + return 'keyword'; + } + + if (stream.match(doubleClosing)) { + dedent(stream,state); + dedent(stream,state); + return 'keyword'; + } + if (stream.match(closing)) { + dedent(stream,state); + return 'keyword'; + } + + if (stream.match(types)) { + return 'keyword'; + } + + if (stream.match(keywords)) { + return 'keyword'; + } + + if (stream.match(identifiers)) { + return 'variable'; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + var singleline = delimiter.length == 1; + var OUTCLASS = 'string'; + + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"]/); + if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + return ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return OUTCLASS; + }; + } + + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current === '.') { + style = state.tokenize(stream, state); + if (style === 'variable') { + return 'variable'; + } else { + return ERRORCLASS; + } + } + + + var delimiter_index = '[({'.indexOf(current); + if (delimiter_index !== -1) { + indent(stream, state ); + } + if (indentInfo === 'dedent') { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + delimiter_index = '])}'.indexOf(current); + if (delimiter_index !== -1) { + if (dedent(stream, state)) { + return ERRORCLASS; + } + } + + return style; + } + + var external = { + electricChars:"dDpPtTfFeE ", + startState: function() { + return { + tokenize: tokenBase, + lastToken: null, + currentIndent: 0, + nextLineIndent: 0, + doInCurrentLine: false + + + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.currentIndent += state.nextLineIndent; + state.nextLineIndent = 0; + state.doInCurrentLine = 0; + } + var style = tokenLexer(stream, state); + + state.lastToken = {style:style, content: stream.current()}; + + + + return style; + }, + + indent: function(state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; + if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); + if(state.currentIndent < 0) return 0; + return state.currentIndent * conf.indentUnit; + }, + + lineComment: "'" + }; + return external; +}); + +CodeMirror.defineMIME("text/x-vb", "vb"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vbscript/vbscript.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vbscript/vbscript.js new file mode 100644 index 0000000000..4033948133 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vbscript/vbscript.js @@ -0,0 +1,350 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +/* +For extra ASP classic objects, initialize CodeMirror instance with this option: + isASP: true + +E.G.: + var editor = CodeMirror.fromTextArea(document.getElementById("code"), { + lineNumbers: true, + isASP: true + }); +*/ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("vbscript", function(conf, parserConf) { + var ERRORCLASS = 'error'; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); + } + + var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]"); + var doubleOperators = new RegExp("^((<>)|(<=)|(>=))"); + var singleDelimiters = new RegExp('^[\\.,]'); + var brackets = new RegExp('^[\\(\\)]'); + var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*"); + + var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for']; + var middleKeywords = ['else','elseif','case']; + var endKeywords = ['next','loop','wend']; + + var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']); + var commonkeywords = ['dim', 'redim', 'then', 'until', 'randomize', + 'byval','byref','new','property', 'exit', 'in', + 'const','private', 'public', + 'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me']; + + //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx + var atomWords = ['true', 'false', 'nothing', 'empty', 'null']; + //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx + var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart', + 'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject', + 'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left', + 'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round', + 'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp', + 'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year']; + + //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx + var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare', + 'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek', + 'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError', + 'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2', + 'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo', + 'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse', + 'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray']; + //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx + var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp']; + var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count']; + var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit']; + + var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application']; + var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response + 'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request + 'contents', 'staticobjects', //application + 'codepage', 'lcid', 'sessionid', 'timeout', //session + 'scripttimeout']; //server + var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response + 'binaryread', //request + 'remove', 'removeall', 'lock', 'unlock', //application + 'abandon', //session + 'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server + + var knownWords = knownMethods.concat(knownProperties); + + builtinObjsWords = builtinObjsWords.concat(builtinConsts); + + if (conf.isASP){ + builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords); + knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties); + }; + + var keywords = wordRegexp(commonkeywords); + var atoms = wordRegexp(atomWords); + var builtinFuncs = wordRegexp(builtinFuncsWords); + var builtinObjs = wordRegexp(builtinObjsWords); + var known = wordRegexp(knownWords); + var stringPrefixes = '"'; + + var opening = wordRegexp(openingKeywords); + var middle = wordRegexp(middleKeywords); + var closing = wordRegexp(endKeywords); + var doubleClosing = wordRegexp(['end']); + var doOpening = wordRegexp(['do']); + var noIndentWords = wordRegexp(['on error resume next', 'exit']); + var comment = wordRegexp(['rem']); + + + function indent(_stream, state) { + state.currentIndent++; + } + + function dedent(_stream, state) { + state.currentIndent--; + } + // tokenizers + function tokenBase(stream, state) { + if (stream.eatSpace()) { + return 'space'; + //return null; + } + + var ch = stream.peek(); + + // Handle Comments + if (ch === "'") { + stream.skipToEnd(); + return 'comment'; + } + if (stream.match(comment)){ + stream.skipToEnd(); + return 'comment'; + } + + + // Handle Number Literals + if (stream.match(/^((&H)|(&O))?[0-9\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+/i)) { floatLiteral = true; } + else if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } + else if (stream.match(/^\.\d+/)) { floatLiteral = true; } + + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return 'number'; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } + // Octal + else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } + // Decimal + else if (stream.match(/^[1-9]\d*F?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return 'number'; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(doubleOperators) + || stream.match(singleOperators) + || stream.match(wordOperators)) { + return 'operator'; + } + if (stream.match(singleDelimiters)) { + return null; + } + + if (stream.match(brackets)) { + return "bracket"; + } + + if (stream.match(noIndentWords)) { + state.doInCurrentLine = true; + + return 'keyword'; + } + + if (stream.match(doOpening)) { + indent(stream,state); + state.doInCurrentLine = true; + + return 'keyword'; + } + if (stream.match(opening)) { + if (! state.doInCurrentLine) + indent(stream,state); + else + state.doInCurrentLine = false; + + return 'keyword'; + } + if (stream.match(middle)) { + return 'keyword'; + } + + + if (stream.match(doubleClosing)) { + dedent(stream,state); + dedent(stream,state); + + return 'keyword'; + } + if (stream.match(closing)) { + if (! state.doInCurrentLine) + dedent(stream,state); + else + state.doInCurrentLine = false; + + return 'keyword'; + } + + if (stream.match(keywords)) { + return 'keyword'; + } + + if (stream.match(atoms)) { + return 'atom'; + } + + if (stream.match(known)) { + return 'variable-2'; + } + + if (stream.match(builtinFuncs)) { + return 'builtin'; + } + + if (stream.match(builtinObjs)){ + return 'variable-2'; + } + + if (stream.match(identifiers)) { + return 'variable'; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + var singleline = delimiter.length == 1; + var OUTCLASS = 'string'; + + return function(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"]/); + if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) { + return ERRORCLASS; + } else { + state.tokenize = tokenBase; + } + } + return OUTCLASS; + }; + } + + + function tokenLexer(stream, state) { + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle '.' connected identifiers + if (current === '.') { + style = state.tokenize(stream, state); + + current = stream.current(); + if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) { + if (style === 'builtin' || style === 'keyword') style='variable'; + if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2'; + + return style; + } else { + return ERRORCLASS; + } + } + + return style; + } + + var external = { + electricChars:"dDpPtTfFeE ", + startState: function() { + return { + tokenize: tokenBase, + lastToken: null, + currentIndent: 0, + nextLineIndent: 0, + doInCurrentLine: false, + ignoreKeyword: false + + + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + state.currentIndent += state.nextLineIndent; + state.nextLineIndent = 0; + state.doInCurrentLine = 0; + } + var style = tokenLexer(stream, state); + + state.lastToken = {style:style, content: stream.current()}; + + if (style==='space') style=null; + + return style; + }, + + indent: function(state, textAfter) { + var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; + if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); + if(state.currentIndent < 0) return 0; + return state.currentIndent * conf.indentUnit; + } + + }; + return external; +}); + +CodeMirror.defineMIME("text/vbscript", "vbscript"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/velocity/velocity.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/velocity/velocity.js new file mode 100644 index 0000000000..79a621a5b0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/velocity/velocity.js @@ -0,0 +1,202 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("velocity", function() { + function parseWords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var keywords = parseWords("#end #else #break #stop #[[ #]] " + + "#{end} #{else} #{break} #{stop}"); + var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " + + "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"); + var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"); + var isOperatorChar = /[+\-*&%=<>!?:\/|]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + function tokenBase(stream, state) { + var beforeParams = state.beforeParams; + state.beforeParams = false; + var ch = stream.next(); + // start of unparsed string? + if ((ch == "'") && !state.inString && state.inParams) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenString(ch)); + } + // start of parsed string? + else if ((ch == '"')) { + state.lastTokenWasBuiltin = false; + if (state.inString) { + state.inString = false; + return "string"; + } + else if (state.inParams) + return chain(stream, state, tokenString(ch)); + } + // is it one of the special signs []{}().,;? Separator? + else if (/[\[\]{}\(\),;\.]/.test(ch)) { + if (ch == "(" && beforeParams) + state.inParams = true; + else if (ch == ")") { + state.inParams = false; + state.lastTokenWasBuiltin = true; + } + return null; + } + // start of a number value? + else if (/\d/.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(/[\w\.]/); + return "number"; + } + // multi line comment? + else if (ch == "#" && stream.eat("*")) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenComment); + } + // unparsed content? + else if (ch == "#" && stream.match(/ *\[ *\[/)) { + state.lastTokenWasBuiltin = false; + return chain(stream, state, tokenUnparsed); + } + // single line comment? + else if (ch == "#" && stream.eat("#")) { + state.lastTokenWasBuiltin = false; + stream.skipToEnd(); + return "comment"; + } + // variable? + else if (ch == "$") { + stream.eat("!"); + stream.eatWhile(/[\w\d\$_\.{}-]/); + // is it one of the specials? + if (specials && specials.propertyIsEnumerable(stream.current())) { + return "keyword"; + } + else { + state.lastTokenWasBuiltin = true; + state.beforeParams = true; + return "builtin"; + } + } + // is it a operator? + else if (isOperatorChar.test(ch)) { + state.lastTokenWasBuiltin = false; + stream.eatWhile(isOperatorChar); + return "operator"; + } + else { + // get the whole word + stream.eatWhile(/[\w\$_{}@]/); + var word = stream.current(); + // is it one of the listed keywords? + if (keywords && keywords.propertyIsEnumerable(word)) + return "keyword"; + // is it one of the listed functions? + if (functions && functions.propertyIsEnumerable(word) || + (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") && + !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) { + state.beforeParams = true; + state.lastTokenWasBuiltin = false; + return "keyword"; + } + if (state.inString) { + state.lastTokenWasBuiltin = false; + return "string"; + } + if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin) + return "builtin"; + // default: just a "word" + state.lastTokenWasBuiltin = false; + return null; + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if ((next == quote) && !escaped) { + end = true; + break; + } + if (quote=='"' && stream.peek() == '$' && !escaped) { + state.inString = true; + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function tokenUnparsed(stream, state) { + var maybeEnd = 0, ch; + while (ch = stream.next()) { + if (ch == "#" && maybeEnd == 2) { + state.tokenize = tokenBase; + break; + } + if (ch == "]") + maybeEnd++; + else if (ch != " ") + maybeEnd = 0; + } + return "meta"; + } + // Interface + + return { + startState: function() { + return { + tokenize: tokenBase, + beforeParams: false, + inParams: false, + inString: false, + lastTokenWasBuiltin: false + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + blockCommentStart: "#*", + blockCommentEnd: "*#", + lineComment: "##", + fold: "velocity" + }; +}); + +CodeMirror.defineMIME("text/velocity", "velocity"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/verilog/verilog.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/verilog/verilog.js new file mode 100644 index 0000000000..6c799f298b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/verilog/verilog.js @@ -0,0 +1,781 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("verilog", function(config, parserConfig) { + + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + dontAlignCalls = parserConfig.dontAlignCalls, + // compilerDirectivesUseRegularIndentation - If set, Compiler directive + // indentation follows the same rules as everything else. Otherwise if + // false, compiler directives will track their own indentation. + // For example, `ifdef nested inside another `ifndef will be indented, + // but a `ifdef inside a function block may not be indented. + compilerDirectivesUseRegularIndentation = parserConfig.compilerDirectivesUseRegularIndentation, + noIndentKeywords = parserConfig.noIndentKeywords || [], + multiLineStrings = parserConfig.multiLineStrings, + hooks = parserConfig.hooks || {}; + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + /** + * Keywords from IEEE 1800-2012 + */ + var keywords = words( + "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " + + "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " + + "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " + + "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " + + "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " + + "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " + + "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " + + "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " + + "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " + + "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " + + "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " + + "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " + + "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " + + "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " + + "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " + + "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " + + "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " + + "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor"); + + /** Operators from IEEE 1800-2012 + unary_operator ::= + + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ + binary_operator ::= + + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | ** + | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<< + | -> | <-> + inc_or_dec_operator ::= ++ | -- + unary_module_path_operator ::= + ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ + binary_module_path_operator ::= + == | != | && | || | & | | | ^ | ^~ | ~^ + */ + var isOperatorChar = /[\+\-\*\/!~&|^%=?:<>]/; + var isBracketChar = /[\[\]{}()]/; + + var unsignedNumber = /\d[0-9_]*/; + var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i; + var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i; + var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i; + var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i; + var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i; + + var closingBracketOrWord = /^((`?\w+)|[)}\]])/; + var closingBracket = /[)}\]]/; + var compilerDirectiveRegex = new RegExp( + "^(`(?:ifdef|ifndef|elsif|else|endif|undef|undefineall|define|include|begin_keywords|celldefine|default|" + + "nettype|end_keywords|endcelldefine|line|nounconnected_drive|pragma|resetall|timescale|unconnected_drive))\\b"); + var compilerDirectiveBeginRegex = /^(`(?:ifdef|ifndef|elsif|else))\b/; + var compilerDirectiveEndRegex = /^(`(?:elsif|else|endif))\b/; + + var curPunc; + var curKeyword; + + // Block openings which are closed by a matching keyword in the form of ("end" + keyword) + // E.g. "task" => "endtask" + var blockKeywords = words( + "case checker class clocking config function generate interface module package " + + "primitive program property specify sequence table task" + ); + + // Opening/closing pairs + var openClose = {}; + for (var keyword in blockKeywords) { + openClose[keyword] = "end" + keyword; + } + openClose["begin"] = "end"; + openClose["casex"] = "endcase"; + openClose["casez"] = "endcase"; + openClose["do" ] = "while"; + openClose["fork" ] = "join;join_any;join_none"; + openClose["covergroup"] = "endgroup"; + openClose["macro_begin"] = "macro_end"; + + for (var i in noIndentKeywords) { + var keyword = noIndentKeywords[i]; + if (openClose[keyword]) { + openClose[keyword] = undefined; + } + } + + // Keywords which open statements that are ended with a semi-colon + var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while extern typedef"); + + function tokenBase(stream, state) { + var ch = stream.peek(), style; + if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style; + if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false) + return style; + + if (/[,;:\.]/.test(ch)) { + curPunc = stream.next(); + return null; + } + if (isBracketChar.test(ch)) { + curPunc = stream.next(); + return "bracket"; + } + // Macros (tick-defines) + if (ch == '`') { + stream.next(); + if (stream.eatWhile(/[\w\$_]/)) { + var cur = stream.current(); + curKeyword = cur; + // Macros that end in _begin, are start of block and end with _end + if (cur.startsWith("`uvm_") && cur.endsWith("_begin")) { + var keywordClose = curKeyword.substr(0,curKeyword.length - 5) + "end"; + openClose[cur] = keywordClose; + curPunc = "newblock"; + } else { + stream.eatSpace(); + if (stream.peek() == '(') { + // Check if this is a block + curPunc = "newmacro"; + } + var withSpace = stream.current(); + // Move the stream back before the spaces + stream.backUp(withSpace.length - cur.length); + } + return "def"; + } else { + return null; + } + } + // System calls + if (ch == '$') { + stream.next(); + if (stream.eatWhile(/[\w\$_]/)) { + return "meta"; + } else { + return null; + } + } + // Time literals + if (ch == '#') { + stream.next(); + stream.eatWhile(/[\d_.]/); + return "def"; + } + // Event + if (ch == '@') { + stream.next(); + stream.eatWhile(/[@]/); + return "def"; + } + // Strings + if (ch == '"') { + stream.next(); + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + // Comments + if (ch == "/") { + stream.next(); + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + stream.backUp(1); + } + + // Numeric literals + if (stream.match(realLiteral) || + stream.match(decimalLiteral) || + stream.match(binaryLiteral) || + stream.match(octLiteral) || + stream.match(hexLiteral) || + stream.match(unsignedNumber) || + stream.match(realLiteral)) { + return "number"; + } + + // Operators + if (stream.eatWhile(isOperatorChar)) { + curPunc = stream.current(); + return "meta"; + } + + // Keywords / plain variables + if (stream.eatWhile(/[\w\$_]/)) { + var cur = stream.current(); + if (keywords[cur]) { + if (openClose[cur]) { + curPunc = "newblock"; + if (cur === "fork") { + // Fork can be a statement instead of block in cases of: + // "disable fork;" and "wait fork;" (trailing semicolon) + stream.eatSpace() + if (stream.peek() == ';') { + curPunc = "newstatement"; + } + stream.backUp(stream.current().length - cur.length); + } + } + if (statementKeywords[cur]) { + curPunc = "newstatement"; + } + curKeyword = cur; + return "keyword"; + } + return "variable"; + } + + stream.next(); + return null; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function Context(indented, column, type, scopekind, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.scopekind = scopekind; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type, scopekind) { + var indent = state.indented; + var c = new Context(indent, col, type, scopekind ? scopekind : "", null, state.context); + return state.context = c; + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") { + state.indented = state.context.indented; + } + return state.context = state.context.prev; + } + + function isClosing(text, contextClosing) { + if (text == contextClosing) { + return true; + } else { + // contextClosing may be multiple keywords separated by ; + var closingKeywords = contextClosing.split(";"); + for (var i in closingKeywords) { + if (text == closingKeywords[i]) { + return true; + } + } + return false; + } + } + + function isInsideScopeKind(ctx, scopekind) { + if (ctx == null) { + return false; + } + if (ctx.scopekind === scopekind) { + return true; + } + return isInsideScopeKind(ctx.prev, scopekind); + } + + function buildElectricInputRegEx() { + // Reindentation should occur on any bracket char: {}()[] + // or on a match of any of the block closing keywords, at + // the end of a line + var allClosings = []; + for (var i in openClose) { + if (openClose[i]) { + var closings = openClose[i].split(";"); + for (var j in closings) { + allClosings.push(closings[j]); + } + } + } + var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$"); + return re; + } + + // Interface + return { + + // Regex to force current line to reindent + electricInput: buildElectricInputRegEx(), + + startState: function(basecolumn) { + var state = { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", "top", false), + indented: 0, + compilerDirectiveIndented: 0, + startOfLine: true + }; + if (hooks.startState) hooks.startState(state); + return state; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (hooks.token) { + // Call hook, with an optional return value of a style to override verilog styling. + var style = hooks.token(stream, state); + if (style !== undefined) { + return style; + } + } + if (stream.eatSpace()) return null; + curPunc = null; + curKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta" || style == "variable") { + if (((curPunc === "=") || (curPunc === "<=")) && !isInsideScopeKind(ctx, "assignment")) { + // '<=' could be nonblocking assignment or lessthan-equals (which shouldn't cause indent) + // Search through the context to see if we are already in an assignment. + // '=' could be inside port declaration with comma or ')' afterward, or inside for(;;) block. + pushContext(state, stream.column() + curPunc.length, "assignment", "assignment"); + if (ctx.align == null) ctx.align = true; + } + return style; + } + if (ctx.align == null) ctx.align = true; + + var isClosingAssignment = ctx.type == "assignment" && + closingBracket.test(curPunc) && ctx.prev && ctx.prev.type === curPunc; + if (curPunc == ctx.type || isClosingAssignment) { + if (isClosingAssignment) { + ctx = popContext(state); + } + ctx = popContext(state); + if (curPunc == ")") { + // Handle closing macros, assuming they could have a semicolon or begin/end block inside. + if (ctx && (ctx.type === "macro")) { + ctx = popContext(state); + while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state); + } + } else if (curPunc == "}") { + // Handle closing statements like constraint block: "foreach () {}" which + // do not have semicolon at end. + if (ctx && (ctx.type === "statement")) { + while (ctx && (ctx.type == "statement")) ctx = popContext(state); + } + } + } else if (((curPunc == ";" || curPunc == ",") && (ctx.type == "statement" || ctx.type == "assignment")) || + (ctx.type && isClosing(curKeyword, ctx.type))) { + ctx = popContext(state); + while (ctx && (ctx.type == "statement" || ctx.type == "assignment")) ctx = popContext(state); + } else if (curPunc == "{") { + pushContext(state, stream.column(), "}"); + } else if (curPunc == "[") { + pushContext(state, stream.column(), "]"); + } else if (curPunc == "(") { + pushContext(state, stream.column(), ")"); + } else if (ctx && ctx.type == "endcase" && curPunc == ":") { + pushContext(state, stream.column(), "statement", "case"); + } else if (curPunc == "newstatement") { + pushContext(state, stream.column(), "statement", curKeyword); + } else if (curPunc == "newblock") { + if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) { + // The 'function' keyword can appear in some other contexts where it actually does not + // indicate a function (import/export DPI and covergroup definitions). + // Do nothing in this case + } else if (curKeyword == "task" && ctx && ctx.type == "statement") { + // Same thing for task + } else if (curKeyword == "class" && ctx && ctx.type == "statement") { + // Same thing for class (e.g. typedef) + } else { + var close = openClose[curKeyword]; + pushContext(state, stream.column(), close, curKeyword); + } + } else if (curPunc == "newmacro" || (curKeyword && curKeyword.match(compilerDirectiveRegex))) { + if (curPunc == "newmacro") { + // Macros (especially if they have parenthesis) potentially have a semicolon + // or complete statement/block inside, and should be treated as such. + pushContext(state, stream.column(), "macro", "macro"); + } + if (curKeyword.match(compilerDirectiveEndRegex)) { + state.compilerDirectiveIndented -= statementIndentUnit; + } + if (curKeyword.match(compilerDirectiveBeginRegex)) { + state.compilerDirectiveIndented += statementIndentUnit; + } + } + + state.startOfLine = false; + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; + if (hooks.indent) { + var fromHook = hooks.indent(state); + if (fromHook >= 0) return fromHook; + } + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + var closing = false; + var possibleClosing = textAfter.match(closingBracketOrWord); + if (possibleClosing) + closing = isClosing(possibleClosing[0], ctx.type); + if (!compilerDirectivesUseRegularIndentation && textAfter.match(compilerDirectiveRegex)) { + if (textAfter.match(compilerDirectiveEndRegex)) { + return state.compilerDirectiveIndented - statementIndentUnit; + } + return state.compilerDirectiveIndented; + } + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + else if ((closingBracket.test(ctx.type) || ctx.type == "assignment") + && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1); + else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "indent" + }; +}); + + CodeMirror.defineMIME("text/x-verilog", { + name: "verilog" + }); + + CodeMirror.defineMIME("text/x-systemverilog", { + name: "verilog" + }); + + + + // TL-Verilog mode. + // See tl-x.org for language spec. + // See the mode in action at makerchip.com. + // Contact: steve.hoover@redwoodeda.com + + // TLV Identifier prefixes. + // Note that sign is not treated separately, so "+/-" versions of numeric identifiers + // are included. + var tlvIdentifierStyle = { + "|": "link", + ">": "property", // Should condition this off for > TLV 1c. + "$": "variable", + "$$": "variable", + "?$": "qualifier", + "?*": "qualifier", + "-": "hr", + "/": "property", + "/-": "property", + "@": "variable-3", + "@-": "variable-3", + "@++": "variable-3", + "@+=": "variable-3", + "@+=-": "variable-3", + "@--": "variable-3", + "@-=": "variable-3", + "%+": "tag", + "%-": "tag", + "%": "tag", + ">>": "tag", + "<<": "tag", + "<>": "tag", + "#": "tag", // Need to choose a style for this. + "^": "attribute", + "^^": "attribute", + "^!": "attribute", + "*": "variable-2", + "**": "variable-2", + "\\": "keyword", + "\"": "comment" + }; + + // Lines starting with these characters define scope (result in indentation). + var tlvScopePrefixChars = { + "/": "beh-hier", + ">": "beh-hier", + "-": "phys-hier", + "|": "pipe", + "?": "when", + "@": "stage", + "\\": "keyword" + }; + var tlvIndentUnit = 3; + var tlvTrackStatements = false; + var tlvIdentMatch = /^([~!@#\$%\^&\*-\+=\?\/\\\|'"<>]+)([\d\w_]*)/; // Matches an identifier. + // Note that ':' is excluded, because of it's use in [:]. + var tlvFirstLevelIndentMatch = /^[! ] /; + var tlvLineIndentationMatch = /^[! ] */; + var tlvCommentMatch = /^\/[\/\*]/; + + + // Returns a style specific to the scope at the given indentation column. + // Type is one of: "indent", "scope-ident", "before-scope-ident". + function tlvScopeStyle(state, indentation, type) { + // Begin scope. + var depth = indentation / tlvIndentUnit; // TODO: Pass this in instead. + return "tlv-" + state.tlvIndentationStyle[depth] + "-" + type; + } + + // Return true if the next thing in the stream is an identifier with a mnemonic. + function tlvIdentNext(stream) { + var match; + return (match = stream.match(tlvIdentMatch, false)) && match[2].length > 0; + } + + CodeMirror.defineMIME("text/x-tlv", { + name: "verilog", + + hooks: { + + electricInput: false, + + + // Return undefined for verilog tokenizing, or style for TLV token (null not used). + // Standard CM styles are used for most formatting, but some TL-Verilog-specific highlighting + // can be enabled with the definition of cm-tlv-* styles, including highlighting for: + // - M4 tokens + // - TLV scope indentation + // - Statement delimitation (enabled by tlvTrackStatements) + token: function(stream, state) { + var style = undefined; + var match; // Return value of pattern matches. + + // Set highlighting mode based on code region (TLV or SV). + if (stream.sol() && ! state.tlvInBlockComment) { + // Process region. + if (stream.peek() == '\\') { + style = "def"; + stream.skipToEnd(); + if (stream.string.match(/\\SV/)) { + state.tlvCodeActive = false; + } else if (stream.string.match(/\\TLV/)){ + state.tlvCodeActive = true; + } + } + // Correct indentation in the face of a line prefix char. + if (state.tlvCodeActive && stream.pos == 0 && + (state.indented == 0) && (match = stream.match(tlvLineIndentationMatch, false))) { + state.indented = match[0].length; + } + + // Compute indentation state: + // o Auto indentation on next line + // o Indentation scope styles + var indented = state.indented; + var depth = indented / tlvIndentUnit; + if (depth <= state.tlvIndentationStyle.length) { + // not deeper than current scope + + var blankline = stream.string.length == indented; + var chPos = depth * tlvIndentUnit; + if (chPos < stream.string.length) { + var bodyString = stream.string.slice(chPos); + var ch = bodyString[0]; + if (tlvScopePrefixChars[ch] && ((match = bodyString.match(tlvIdentMatch)) && + tlvIdentifierStyle[match[1]])) { + // This line begins scope. + // Next line gets indented one level. + indented += tlvIndentUnit; + // Style the next level of indentation (except non-region keyword identifiers, + // which are statements themselves) + if (!(ch == "\\" && chPos > 0)) { + state.tlvIndentationStyle[depth] = tlvScopePrefixChars[ch]; + if (tlvTrackStatements) {state.statementComment = false;} + depth++; + } + } + } + // Clear out deeper indentation levels unless line is blank. + if (!blankline) { + while (state.tlvIndentationStyle.length > depth) { + state.tlvIndentationStyle.pop(); + } + } + } + // Set next level of indentation. + state.tlvNextIndent = indented; + } + + if (state.tlvCodeActive) { + // Highlight as TLV. + + var beginStatement = false; + if (tlvTrackStatements) { + // This starts a statement if the position is at the scope level + // and we're not within a statement leading comment. + beginStatement = + (stream.peek() != " ") && // not a space + (style === undefined) && // not a region identifier + !state.tlvInBlockComment && // not in block comment + //!stream.match(tlvCommentMatch, false) && // not comment start + (stream.column() == state.tlvIndentationStyle.length * tlvIndentUnit); // at scope level + if (beginStatement) { + if (state.statementComment) { + // statement already started by comment + beginStatement = false; + } + state.statementComment = + stream.match(tlvCommentMatch, false); // comment start + } + } + + var match; + if (style !== undefined) { + // Region line. + style += " " + tlvScopeStyle(state, 0, "scope-ident") + } else if (((stream.pos / tlvIndentUnit) < state.tlvIndentationStyle.length) && + (match = stream.match(stream.sol() ? tlvFirstLevelIndentMatch : /^ /))) { + // Indentation + style = // make this style distinct from the previous one to prevent + // codemirror from combining spans + "tlv-indent-" + (((stream.pos % 2) == 0) ? "even" : "odd") + + // and style it + " " + tlvScopeStyle(state, stream.pos - tlvIndentUnit, "indent"); + // Style the line prefix character. + if (match[0].charAt(0) == "!") { + style += " tlv-alert-line-prefix"; + } + // Place a class before a scope identifier. + if (tlvIdentNext(stream)) { + style += " " + tlvScopeStyle(state, stream.pos, "before-scope-ident"); + } + } else if (state.tlvInBlockComment) { + // In a block comment. + if (stream.match(/^.*?\*\//)) { + // Exit block comment. + state.tlvInBlockComment = false; + if (tlvTrackStatements && !stream.eol()) { + // Anything after comment is assumed to be real statement content. + state.statementComment = false; + } + } else { + stream.skipToEnd(); + } + style = "comment"; + } else if ((match = stream.match(tlvCommentMatch)) && !state.tlvInBlockComment) { + // Start comment. + if (match[0] == "//") { + // Line comment. + stream.skipToEnd(); + } else { + // Block comment. + state.tlvInBlockComment = true; + } + style = "comment"; + } else if (match = stream.match(tlvIdentMatch)) { + // looks like an identifier (or identifier prefix) + var prefix = match[1]; + var mnemonic = match[2]; + if (// is identifier prefix + tlvIdentifierStyle.hasOwnProperty(prefix) && + // has mnemonic or we're at the end of the line (maybe it hasn't been typed yet) + (mnemonic.length > 0 || stream.eol())) { + style = tlvIdentifierStyle[prefix]; + if (stream.column() == state.indented) { + // Begin scope. + style += " " + tlvScopeStyle(state, stream.column(), "scope-ident") + } + } else { + // Just swallow one character and try again. + // This enables subsequent identifier match with preceding symbol character, which + // is legal within a statement. (E.g., !$reset). It also enables detection of + // comment start with preceding symbols. + stream.backUp(stream.current().length - 1); + style = "tlv-default"; + } + } else if (stream.match(/^\t+/)) { + // Highlight tabs, which are illegal. + style = "tlv-tab"; + } else if (stream.match(/^[\[\]{}\(\);\:]+/)) { + // [:], (), {}, ;. + style = "meta"; + } else if (match = stream.match(/^[mM]4([\+_])?[\w\d_]*/)) { + // m4 pre proc + style = (match[1] == "+") ? "tlv-m4-plus" : "tlv-m4"; + } else if (stream.match(/^ +/)){ + // Skip over spaces. + if (stream.eol()) { + // Trailing spaces. + style = "error"; + } else { + // Non-trailing spaces. + style = "tlv-default"; + } + } else if (stream.match(/^[\w\d_]+/)) { + // alpha-numeric token. + style = "number"; + } else { + // Eat the next char w/ no formatting. + stream.next(); + style = "tlv-default"; + } + if (beginStatement) { + style += " tlv-statement"; + } + } else { + if (stream.match(/^[mM]4([\w\d_]*)/)) { + // m4 pre proc + style = "tlv-m4"; + } + } + return style; + }, + + indent: function(state) { + return (state.tlvCodeActive == true) ? state.tlvNextIndent : -1; + }, + + startState: function(state) { + state.tlvIndentationStyle = []; // Styles to use for each level of indentation. + state.tlvCodeActive = true; // True when we're in a TLV region (and at beginning of file). + state.tlvNextIndent = -1; // The number of spaces to autoindent the next line if tlvCodeActive. + state.tlvInBlockComment = false; // True inside /**/ comment. + if (tlvTrackStatements) { + state.statementComment = false; // True inside a statement's header comment. + } + } + + } + }); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vhdl/vhdl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vhdl/vhdl.js new file mode 100644 index 0000000000..133e67a268 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/vhdl/vhdl.js @@ -0,0 +1,189 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Originally written by Alf Nielsen, re-written by Michael Zhou +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function words(str) { + var obj = {}, words = str.split(","); + for (var i = 0; i < words.length; ++i) { + var allCaps = words[i].toUpperCase(); + var firstCap = words[i].charAt(0).toUpperCase() + words[i].slice(1); + obj[words[i]] = true; + obj[allCaps] = true; + obj[firstCap] = true; + } + return obj; +} + +function metaHook(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; +} + +CodeMirror.defineMode("vhdl", function(config, parserConfig) { + var indentUnit = config.indentUnit, + atoms = parserConfig.atoms || words("null"), + hooks = parserConfig.hooks || {"`": metaHook, "$": metaHook}, + multiLineStrings = parserConfig.multiLineStrings; + + var keywords = words("abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block," + + "body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case," + + "end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for," + + "function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage," + + "literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map," + + "postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal," + + "sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor"); + + var blockKeywords = words("architecture,entity,begin,case,port,else,elsif,end,for,function,if"); + + var isOperatorChar = /[&|~>!\?@#$%&|:\.]+)/, token: "variable-2"}, + {regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"}, + {regex: /\(;.*?/, token: "comment", next: "comment"}, + {regex: /;;.*$/, token: "comment"}, + {regex: /\(/, indent: true}, + {regex: /\)/, dedent: true}, + ], + + comment: [ + {regex: /.*?;\)/, token: "comment", next: "start"}, + {regex: /.*/, token: "comment"}, + ], + + meta: { + dontIndentStates: ['comment'], + }, +}); + +// https://github.com/WebAssembly/design/issues/981 mentions text/webassembly, +// which seems like a reasonable choice, although it's not standard right now. +CodeMirror.defineMIME("text/webassembly", "wast"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/webidl/webidl.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/webidl/webidl.js new file mode 100644 index 0000000000..120de6bea7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/webidl/webidl.js @@ -0,0 +1,195 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); +}; + +var builtinArray = [ + "Clamp", + "Constructor", + "EnforceRange", + "Exposed", + "ImplicitThis", + "Global", "PrimaryGlobal", + "LegacyArrayClass", + "LegacyUnenumerableNamedProperties", + "LenientThis", + "NamedConstructor", + "NewObject", + "NoInterfaceObject", + "OverrideBuiltins", + "PutForwards", + "Replaceable", + "SameObject", + "TreatNonObjectAsNull", + "TreatNullAs", + "EmptyString", + "Unforgeable", + "Unscopeable" +]; +var builtins = wordRegexp(builtinArray); + +var typeArray = [ + "unsigned", "short", "long", // UnsignedIntegerType + "unrestricted", "float", "double", // UnrestrictedFloatType + "boolean", "byte", "octet", // Rest of PrimitiveType + "Promise", // PromiseType + "ArrayBuffer", "DataView", "Int8Array", "Int16Array", "Int32Array", + "Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray", + "Float32Array", "Float64Array", // BufferRelatedType + "ByteString", "DOMString", "USVString", "sequence", "object", "RegExp", + "Error", "DOMException", "FrozenArray", // Rest of NonAnyType + "any", // Rest of SingleType + "void" // Rest of ReturnType +]; +var types = wordRegexp(typeArray); + +var keywordArray = [ + "attribute", "callback", "const", "deleter", "dictionary", "enum", "getter", + "implements", "inherit", "interface", "iterable", "legacycaller", "maplike", + "partial", "required", "serializer", "setlike", "setter", "static", + "stringifier", "typedef", // ArgumentNameKeyword except + // "unrestricted" + "optional", "readonly", "or" +]; +var keywords = wordRegexp(keywordArray); + +var atomArray = [ + "true", "false", // BooleanLiteral + "Infinity", "NaN", // FloatLiteral + "null" // Rest of ConstValue +]; +var atoms = wordRegexp(atomArray); + +CodeMirror.registerHelper("hintWords", "webidl", + builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray)); + +var startDefArray = ["callback", "dictionary", "enum", "interface"]; +var startDefs = wordRegexp(startDefArray); + +var endDefArray = ["typedef"]; +var endDefs = wordRegexp(endDefArray); + +var singleOperators = /^[:<=>?]/; +var integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/; +var floats = /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/; +var identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/; +var identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/; +var strings = /^"[^"]*"/; +var multilineComments = /^\/\*.*?\*\//; +var multilineCommentsStart = /^\/\*.*/; +var multilineCommentsEnd = /^.*?\*\//; + +function readToken(stream, state) { + // whitespace + if (stream.eatSpace()) return null; + + // comment + if (state.inComment) { + if (stream.match(multilineCommentsEnd)) { + state.inComment = false; + return "comment"; + } + stream.skipToEnd(); + return "comment"; + } + if (stream.match("//")) { + stream.skipToEnd(); + return "comment"; + } + if (stream.match(multilineComments)) return "comment"; + if (stream.match(multilineCommentsStart)) { + state.inComment = true; + return "comment"; + } + + // integer and float + if (stream.match(/^-?[0-9\.]/, false)) { + if (stream.match(integers) || stream.match(floats)) return "number"; + } + + // string + if (stream.match(strings)) return "string"; + + // identifier + if (state.startDef && stream.match(identifiers)) return "def"; + + if (state.endDef && stream.match(identifiersEnd)) { + state.endDef = false; + return "def"; + } + + if (stream.match(keywords)) return "keyword"; + + if (stream.match(types)) { + var lastToken = state.lastToken; + var nextToken = (stream.match(/^\s*(.+?)\b/, false) || [])[1]; + + if (lastToken === ":" || lastToken === "implements" || + nextToken === "implements" || nextToken === "=") { + // Used as identifier + return "builtin"; + } else { + // Used as type + return "variable-3"; + } + } + + if (stream.match(builtins)) return "builtin"; + if (stream.match(atoms)) return "atom"; + if (stream.match(identifiers)) return "variable"; + + // other + if (stream.match(singleOperators)) return "operator"; + + // unrecognized + stream.next(); + return null; +}; + +CodeMirror.defineMode("webidl", function() { + return { + startState: function() { + return { + // Is in multiline comment + inComment: false, + // Last non-whitespace, matched token + lastToken: "", + // Next token is a definition + startDef: false, + // Last token of the statement is a definition + endDef: false + }; + }, + token: function(stream, state) { + var style = readToken(stream, state); + + if (style) { + var cur = stream.current(); + state.lastToken = cur; + if (style === "keyword") { + state.startDef = startDefs.test(cur); + state.endDef = state.endDef || endDefs.test(cur); + } else { + state.startDef = false; + } + } + + return style; + } + }; +}); + +CodeMirror.defineMIME("text/x-webidl", "webidl"); +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xml/xml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xml/xml.js new file mode 100644 index 0000000000..4e36106b49 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xml/xml.js @@ -0,0 +1,417 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +var htmlConfig = { + autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, + 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, + 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, + 'track': true, 'wbr': true, 'menuitem': true}, + implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, + 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, + 'th': true, 'tr': true}, + contextGrabbers: { + 'dd': {'dd': true, 'dt': true}, + 'dt': {'dd': true, 'dt': true}, + 'li': {'li': true}, + 'option': {'option': true, 'optgroup': true}, + 'optgroup': {'optgroup': true}, + 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, + 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, + 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, + 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, + 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, + 'rp': {'rp': true, 'rt': true}, + 'rt': {'rp': true, 'rt': true}, + 'tbody': {'tbody': true, 'tfoot': true}, + 'td': {'td': true, 'th': true}, + 'tfoot': {'tbody': true}, + 'th': {'td': true, 'th': true}, + 'thead': {'tbody': true, 'tfoot': true}, + 'tr': {'tr': true} + }, + doNotIndent: {"pre": true}, + allowUnquoted: true, + allowMissing: true, + caseFold: true +} + +var xmlConfig = { + autoSelfClosers: {}, + implicitlyClosed: {}, + contextGrabbers: {}, + doNotIndent: {}, + allowUnquoted: false, + allowMissing: false, + allowMissingTagName: false, + caseFold: false +} + +CodeMirror.defineMode("xml", function(editorConf, config_) { + var indentUnit = editorConf.indentUnit + var config = {} + var defaults = config_.htmlMode ? htmlConfig : xmlConfig + for (var prop in defaults) config[prop] = defaults[prop] + for (var prop in config_) config[prop] = config_[prop] + + // Return variables for tokenizers + var type, setStyle; + + function inText(stream, state) { + function chain(parser) { + state.tokenize = parser; + return parser(stream, state); + } + + var ch = stream.next(); + if (ch == "<") { + if (stream.eat("!")) { + if (stream.eat("[")) { + if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); + else return null; + } else if (stream.match("--")) { + return chain(inBlock("comment", "-->")); + } else if (stream.match("DOCTYPE", true, true)) { + stream.eatWhile(/[\w\._\-]/); + return chain(doctype(1)); + } else { + return null; + } + } else if (stream.eat("?")) { + stream.eatWhile(/[\w\._\-]/); + state.tokenize = inBlock("meta", "?>"); + return "meta"; + } else { + type = stream.eat("/") ? "closeTag" : "openTag"; + state.tokenize = inTag; + return "tag bracket"; + } + } else if (ch == "&") { + var ok; + if (stream.eat("#")) { + if (stream.eat("x")) { + ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); + } else { + ok = stream.eatWhile(/[\d]/) && stream.eat(";"); + } + } else { + ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); + } + return ok ? "atom" : "error"; + } else { + stream.eatWhile(/[^&<]/); + return null; + } + } + inText.isInText = true; + + function inTag(stream, state) { + var ch = stream.next(); + if (ch == ">" || (ch == "/" && stream.eat(">"))) { + state.tokenize = inText; + type = ch == ">" ? "endTag" : "selfcloseTag"; + return "tag bracket"; + } else if (ch == "=") { + type = "equals"; + return null; + } else if (ch == "<") { + state.tokenize = inText; + state.state = baseState; + state.tagName = state.tagStart = null; + var next = state.tokenize(stream, state); + return next ? next + " tag error" : "tag error"; + } else if (/[\'\"]/.test(ch)) { + state.tokenize = inAttribute(ch); + state.stringStartCol = stream.column(); + return state.tokenize(stream, state); + } else { + stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); + return "word"; + } + } + + function inAttribute(quote) { + var closure = function(stream, state) { + while (!stream.eol()) { + if (stream.next() == quote) { + state.tokenize = inTag; + break; + } + } + return "string"; + }; + closure.isInAttribute = true; + return closure; + } + + function inBlock(style, terminator) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = inText; + break; + } + stream.next(); + } + return style; + } + } + + function doctype(depth) { + return function(stream, state) { + var ch; + while ((ch = stream.next()) != null) { + if (ch == "<") { + state.tokenize = doctype(depth + 1); + return state.tokenize(stream, state); + } else if (ch == ">") { + if (depth == 1) { + state.tokenize = inText; + break; + } else { + state.tokenize = doctype(depth - 1); + return state.tokenize(stream, state); + } + } + } + return "meta"; + }; + } + + function lower(tagName) { + return tagName && tagName.toLowerCase(); + } + + function Context(state, tagName, startOfLine) { + this.prev = state.context; + this.tagName = tagName || ""; + this.indent = state.indented; + this.startOfLine = startOfLine; + if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent)) + this.noIndent = true; + } + function popContext(state) { + if (state.context) state.context = state.context.prev; + } + function maybePopContext(state, nextTagName) { + var parentTagName; + while (true) { + if (!state.context) { + return; + } + parentTagName = state.context.tagName; + if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) || + !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) { + return; + } + popContext(state); + } + } + + function baseState(type, stream, state) { + if (type == "openTag") { + state.tagStart = stream.column(); + return tagNameState; + } else if (type == "closeTag") { + return closeTagNameState; + } else { + return baseState; + } + } + function tagNameState(type, stream, state) { + if (type == "word") { + state.tagName = stream.current(); + setStyle = "tag"; + return attrState; + } else if (config.allowMissingTagName && type == "endTag") { + setStyle = "tag bracket"; + return attrState(type, stream, state); + } else { + setStyle = "error"; + return tagNameState; + } + } + function closeTagNameState(type, stream, state) { + if (type == "word") { + var tagName = stream.current(); + if (state.context && state.context.tagName != tagName && + config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName))) + popContext(state); + if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) { + setStyle = "tag"; + return closeState; + } else { + setStyle = "tag error"; + return closeStateErr; + } + } else if (config.allowMissingTagName && type == "endTag") { + setStyle = "tag bracket"; + return closeState(type, stream, state); + } else { + setStyle = "error"; + return closeStateErr; + } + } + + function closeState(type, _stream, state) { + if (type != "endTag") { + setStyle = "error"; + return closeState; + } + popContext(state); + return baseState; + } + function closeStateErr(type, stream, state) { + setStyle = "error"; + return closeState(type, stream, state); + } + + function attrState(type, _stream, state) { + if (type == "word") { + setStyle = "attribute"; + return attrEqState; + } else if (type == "endTag" || type == "selfcloseTag") { + var tagName = state.tagName, tagStart = state.tagStart; + state.tagName = state.tagStart = null; + if (type == "selfcloseTag" || + config.autoSelfClosers.hasOwnProperty(lower(tagName))) { + maybePopContext(state, tagName); + } else { + maybePopContext(state, tagName); + state.context = new Context(state, tagName, tagStart == state.indented); + } + return baseState; + } + setStyle = "error"; + return attrState; + } + function attrEqState(type, stream, state) { + if (type == "equals") return attrValueState; + if (!config.allowMissing) setStyle = "error"; + return attrState(type, stream, state); + } + function attrValueState(type, stream, state) { + if (type == "string") return attrContinuedState; + if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;} + setStyle = "error"; + return attrState(type, stream, state); + } + function attrContinuedState(type, stream, state) { + if (type == "string") return attrContinuedState; + return attrState(type, stream, state); + } + + return { + startState: function(baseIndent) { + var state = {tokenize: inText, + state: baseState, + indented: baseIndent || 0, + tagName: null, tagStart: null, + context: null} + if (baseIndent != null) state.baseIndent = baseIndent + return state + }, + + token: function(stream, state) { + if (!state.tagName && stream.sol()) + state.indented = stream.indentation(); + + if (stream.eatSpace()) return null; + type = null; + var style = state.tokenize(stream, state); + if ((style || type) && style != "comment") { + setStyle = null; + state.state = state.state(type || style, stream, state); + if (setStyle) + style = setStyle == "error" ? style + " error" : setStyle; + } + return style; + }, + + indent: function(state, textAfter, fullLine) { + var context = state.context; + // Indent multi-line strings (e.g. css). + if (state.tokenize.isInAttribute) { + if (state.tagStart == state.indented) + return state.stringStartCol + 1; + else + return state.indented + indentUnit; + } + if (context && context.noIndent) return CodeMirror.Pass; + if (state.tokenize != inTag && state.tokenize != inText) + return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; + // Indent the starts of attribute names. + if (state.tagName) { + if (config.multilineTagIndentPastTag !== false) + return state.tagStart + state.tagName.length + 2; + else + return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1); + } + if (config.alignCDATA && /$/, + blockCommentStart: "", + + configuration: config.htmlMode ? "html" : "xml", + helperType: config.htmlMode ? "html" : "xml", + + skipAttribute: function(state) { + if (state.state == attrValueState) + state.state = attrState + }, + + xmlCurrentTag: function(state) { + return state.tagName ? {name: state.tagName, close: state.type == "closeTag"} : null + }, + + xmlCurrentContext: function(state) { + var context = [] + for (var cx = state.context; cx; cx = cx.prev) + context.push(cx.tagName) + return context.reverse() + } + }; +}); + +CodeMirror.defineMIME("text/xml", "xml"); +CodeMirror.defineMIME("application/xml", "xml"); +if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) + CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xquery/xquery.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xquery/xquery.js new file mode 100644 index 0000000000..395b6a7014 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/xquery/xquery.js @@ -0,0 +1,448 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("xquery", function() { + + // The keywords object is set to the result of this self executing + // function. Each keyword is a property of the keywords object whose + // value is {type: atype, style: astyle} + var keywords = function(){ + // convenience functions used to build keywords object + function kw(type) {return {type: type, style: "keyword"};} + var operator = kw("operator") + , atom = {type: "atom", style: "atom"} + , punctuation = {type: "punctuation", style: null} + , qualifier = {type: "axis_specifier", style: "qualifier"}; + + // kwObj is what is return from this function at the end + var kwObj = { + ',': punctuation + }; + + // a list of 'basic' keywords. For each add a property to kwObj with the value of + // {type: basic[i], style: "keyword"} e.g. 'after' --> {type: "after", style: "keyword"} + var basic = ['after', 'all', 'allowing', 'ancestor', 'ancestor-or-self', 'any', 'array', 'as', + 'ascending', 'at', 'attribute', 'base-uri', 'before', 'boundary-space', 'by', 'case', 'cast', + 'castable', 'catch', 'child', 'collation', 'comment', 'construction', 'contains', 'content', + 'context', 'copy', 'copy-namespaces', 'count', 'decimal-format', 'declare', 'default', 'delete', + 'descendant', 'descendant-or-self', 'descending', 'diacritics', 'different', 'distance', + 'document', 'document-node', 'element', 'else', 'empty', 'empty-sequence', 'encoding', 'end', + 'entire', 'every', 'exactly', 'except', 'external', 'first', 'following', 'following-sibling', + 'for', 'from', 'ftand', 'ftnot', 'ft-option', 'ftor', 'function', 'fuzzy', 'greatest', 'group', + 'if', 'import', 'in', 'inherit', 'insensitive', 'insert', 'instance', 'intersect', 'into', + 'invoke', 'is', 'item', 'language', 'last', 'lax', 'least', 'let', 'levels', 'lowercase', 'map', + 'modify', 'module', 'most', 'namespace', 'next', 'no', 'node', 'nodes', 'no-inherit', + 'no-preserve', 'not', 'occurs', 'of', 'only', 'option', 'order', 'ordered', 'ordering', + 'paragraph', 'paragraphs', 'parent', 'phrase', 'preceding', 'preceding-sibling', 'preserve', + 'previous', 'processing-instruction', 'relationship', 'rename', 'replace', 'return', + 'revalidation', 'same', 'satisfies', 'schema', 'schema-attribute', 'schema-element', 'score', + 'self', 'sensitive', 'sentence', 'sentences', 'sequence', 'skip', 'sliding', 'some', 'stable', + 'start', 'stemming', 'stop', 'strict', 'strip', 'switch', 'text', 'then', 'thesaurus', 'times', + 'to', 'transform', 'treat', 'try', 'tumbling', 'type', 'typeswitch', 'union', 'unordered', + 'update', 'updating', 'uppercase', 'using', 'validate', 'value', 'variable', 'version', + 'weight', 'when', 'where', 'wildcards', 'window', 'with', 'without', 'word', 'words', 'xquery']; + for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);}; + + // a list of types. For each add a property to kwObj with the value of + // {type: "atom", style: "atom"} + var types = ['xs:anyAtomicType', 'xs:anySimpleType', 'xs:anyType', 'xs:anyURI', + 'xs:base64Binary', 'xs:boolean', 'xs:byte', 'xs:date', 'xs:dateTime', 'xs:dateTimeStamp', + 'xs:dayTimeDuration', 'xs:decimal', 'xs:double', 'xs:duration', 'xs:ENTITIES', 'xs:ENTITY', + 'xs:float', 'xs:gDay', 'xs:gMonth', 'xs:gMonthDay', 'xs:gYear', 'xs:gYearMonth', 'xs:hexBinary', + 'xs:ID', 'xs:IDREF', 'xs:IDREFS', 'xs:int', 'xs:integer', 'xs:item', 'xs:java', 'xs:language', + 'xs:long', 'xs:Name', 'xs:NCName', 'xs:negativeInteger', 'xs:NMTOKEN', 'xs:NMTOKENS', + 'xs:nonNegativeInteger', 'xs:nonPositiveInteger', 'xs:normalizedString', 'xs:NOTATION', + 'xs:numeric', 'xs:positiveInteger', 'xs:precisionDecimal', 'xs:QName', 'xs:short', 'xs:string', + 'xs:time', 'xs:token', 'xs:unsignedByte', 'xs:unsignedInt', 'xs:unsignedLong', + 'xs:unsignedShort', 'xs:untyped', 'xs:untypedAtomic', 'xs:yearMonthDuration']; + for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;}; + + // each operator will add a property to kwObj with value of {type: "operator", style: "keyword"} + var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-']; + for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;}; + + // each axis_specifiers will add a property to kwObj with value of {type: "axis_specifier", style: "qualifier"} + var axis_specifiers = ["self::", "attribute::", "child::", "descendant::", "descendant-or-self::", "parent::", + "ancestor::", "ancestor-or-self::", "following::", "preceding::", "following-sibling::", "preceding-sibling::"]; + for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; }; + + return kwObj; + }(); + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + // the primary mode tokenizer + function tokenBase(stream, state) { + var ch = stream.next(), + mightBeFunction = false, + isEQName = isEQNameAhead(stream); + + // an XML tag (if not in some sub, chained tokenizer) + if (ch == "<") { + if(stream.match("!--", true)) + return chain(stream, state, tokenXMLComment); + + if(stream.match("![CDATA", false)) { + state.tokenize = tokenCDATA; + return "tag"; + } + + if(stream.match("?", false)) { + return chain(stream, state, tokenPreProcessing); + } + + var isclose = stream.eat("/"); + stream.eatSpace(); + var tagName = "", c; + while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; + + return chain(stream, state, tokenTag(tagName, isclose)); + } + // start code block + else if(ch == "{") { + pushStateStack(state, { type: "codeblock"}); + return null; + } + // end code block + else if(ch == "}") { + popStateStack(state); + return null; + } + // if we're in an XML block + else if(isInXmlBlock(state)) { + if(ch == ">") + return "tag"; + else if(ch == "/" && stream.eat(">")) { + popStateStack(state); + return "tag"; + } + else + return "variable"; + } + // if a number + else if (/\d/.test(ch)) { + stream.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/); + return "atom"; + } + // comment start + else if (ch === "(" && stream.eat(":")) { + pushStateStack(state, { type: "comment"}); + return chain(stream, state, tokenComment); + } + // quoted string + else if (!isEQName && (ch === '"' || ch === "'")) + return chain(stream, state, tokenString(ch)); + // variable + else if(ch === "$") { + return chain(stream, state, tokenVariable); + } + // assignment + else if(ch ===":" && stream.eat("=")) { + return "keyword"; + } + // open paren + else if(ch === "(") { + pushStateStack(state, { type: "paren"}); + return null; + } + // close paren + else if(ch === ")") { + popStateStack(state); + return null; + } + // open paren + else if(ch === "[") { + pushStateStack(state, { type: "bracket"}); + return null; + } + // close paren + else if(ch === "]") { + popStateStack(state); + return null; + } + else { + var known = keywords.propertyIsEnumerable(ch) && keywords[ch]; + + // if there's a EQName ahead, consume the rest of the string portion, it's likely a function + if(isEQName && ch === '\"') while(stream.next() !== '"'){} + if(isEQName && ch === '\'') while(stream.next() !== '\''){} + + // gobble up a word if the character is not known + if(!known) stream.eatWhile(/[\w\$_-]/); + + // gobble a colon in the case that is a lib func type call fn:doc + var foundColon = stream.eat(":"); + + // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier + // which should get matched as a keyword + if(!stream.eat(":") && foundColon) { + stream.eatWhile(/[\w\$_-]/); + } + // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort) + if(stream.match(/^[ \t]*\(/, false)) { + mightBeFunction = true; + } + // is the word a keyword? + var word = stream.current(); + known = keywords.propertyIsEnumerable(word) && keywords[word]; + + // if we think it's a function call but not yet known, + // set style to variable for now for lack of something better + if(mightBeFunction && !known) known = {type: "function_call", style: "variable def"}; + + // if the previous word was element, attribute, axis specifier, this word should be the name of that + if(isInXmlConstructor(state)) { + popStateStack(state); + return "variable"; + } + // as previously checked, if the word is element,attribute, axis specifier, call it an "xmlconstructor" and + // push the stack so we know to look for it on the next word + if(word == "element" || word == "attribute" || known.type == "axis_specifier") pushStateStack(state, {type: "xmlconstructor"}); + + // if the word is known, return the details of that else just call this a generic 'word' + return known ? known.style : "variable"; + } + } + + // handle comments, including nested + function tokenComment(stream, state) { + var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; + while (ch = stream.next()) { + if (ch == ")" && maybeEnd) { + if(nestedCount > 0) + nestedCount--; + else { + popStateStack(state); + break; + } + } + else if(ch == ":" && maybeNested) { + nestedCount++; + } + maybeEnd = (ch == ":"); + maybeNested = (ch == "("); + } + + return "comment"; + } + + // tokenizer for string literals + // optionally pass a tokenizer function to set state.tokenize back to when finished + function tokenString(quote, f) { + return function(stream, state) { + var ch; + + if(isInString(state) && stream.current() == quote) { + popStateStack(state); + if(f) state.tokenize = f; + return "string"; + } + + pushStateStack(state, { type: "string", name: quote, tokenize: tokenString(quote, f) }); + + // if we're in a string and in an XML block, allow an embedded code block + if(stream.match("{", false) && isInXmlAttributeBlock(state)) { + state.tokenize = tokenBase; + return "string"; + } + + + while (ch = stream.next()) { + if (ch == quote) { + popStateStack(state); + if(f) state.tokenize = f; + break; + } + else { + // if we're in a string and in an XML block, allow an embedded code block in an attribute + if(stream.match("{", false) && isInXmlAttributeBlock(state)) { + state.tokenize = tokenBase; + return "string"; + } + + } + } + + return "string"; + }; + } + + // tokenizer for variables + function tokenVariable(stream, state) { + var isVariableChar = /[\w\$_-]/; + + // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote + if(stream.eat("\"")) { + while(stream.next() !== '\"'){}; + stream.eat(":"); + } else { + stream.eatWhile(isVariableChar); + if(!stream.match(":=", false)) stream.eat(":"); + } + stream.eatWhile(isVariableChar); + state.tokenize = tokenBase; + return "variable"; + } + + // tokenizer for XML tags + function tokenTag(name, isclose) { + return function(stream, state) { + stream.eatSpace(); + if(isclose && stream.eat(">")) { + popStateStack(state); + state.tokenize = tokenBase; + return "tag"; + } + // self closing tag without attributes? + if(!stream.eat("/")) + pushStateStack(state, { type: "tag", name: name, tokenize: tokenBase}); + if(!stream.eat(">")) { + state.tokenize = tokenAttribute; + return "tag"; + } + else { + state.tokenize = tokenBase; + } + return "tag"; + }; + } + + // tokenizer for XML attributes + function tokenAttribute(stream, state) { + var ch = stream.next(); + + if(ch == "/" && stream.eat(">")) { + if(isInXmlAttributeBlock(state)) popStateStack(state); + if(isInXmlBlock(state)) popStateStack(state); + return "tag"; + } + if(ch == ">") { + if(isInXmlAttributeBlock(state)) popStateStack(state); + return "tag"; + } + if(ch == "=") + return null; + // quoted string + if (ch == '"' || ch == "'") + return chain(stream, state, tokenString(ch, tokenAttribute)); + + if(!isInXmlAttributeBlock(state)) + pushStateStack(state, { type: "attribute", tokenize: tokenAttribute}); + + stream.eat(/[a-zA-Z_:]/); + stream.eatWhile(/[-a-zA-Z0-9_:.]/); + stream.eatSpace(); + + // the case where the attribute has not value and the tag was closed + if(stream.match(">", false) || stream.match("/", false)) { + popStateStack(state); + state.tokenize = tokenBase; + } + + return "attribute"; + } + + // handle comments, including nested + function tokenXMLComment(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "-" && stream.match("->", true)) { + state.tokenize = tokenBase; + return "comment"; + } + } + } + + + // handle CDATA + function tokenCDATA(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "]" && stream.match("]", true)) { + state.tokenize = tokenBase; + return "comment"; + } + } + } + + // handle preprocessing instructions + function tokenPreProcessing(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "?" && stream.match(">", true)) { + state.tokenize = tokenBase; + return "comment meta"; + } + } + } + + + // functions to test the current context of the state + function isInXmlBlock(state) { return isIn(state, "tag"); } + function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); } + function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"); } + function isInString(state) { return isIn(state, "string"); } + + function isEQNameAhead(stream) { + // assume we've already eaten a quote (") + if(stream.current() === '"') + return stream.match(/^[^\"]+\"\:/, false); + else if(stream.current() === '\'') + return stream.match(/^[^\"]+\'\:/, false); + else + return false; + } + + function isIn(state, type) { + return (state.stack.length && state.stack[state.stack.length - 1].type == type); + } + + function pushStateStack(state, newState) { + state.stack.push(newState); + } + + function popStateStack(state) { + state.stack.pop(); + var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize; + state.tokenize = reinstateTokenize || tokenBase; + } + + // the interface for the mode API + return { + startState: function() { + return { + tokenize: tokenBase, + cc: [], + stack: [] + }; + }, + + token: function(stream, state) { + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + return style; + }, + + blockCommentStart: "(:", + blockCommentEnd: ":)" + + }; + +}); + +CodeMirror.defineMIME("application/xquery", "xquery"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yacas/yacas.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yacas/yacas.js new file mode 100644 index 0000000000..b7ac96b71d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yacas/yacas.js @@ -0,0 +1,204 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Yacas mode copyright (c) 2015 by Grzegorz Mazur +// Loosely based on mathematica mode by Calin Barbat + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('yacas', function(_config, _parserConfig) { + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var bodiedOps = words("Assert BackQuote D Defun Deriv For ForEach FromFile " + + "FromString Function Integrate InverseTaylor Limit " + + "LocalSymbols Macro MacroRule MacroRulePattern " + + "NIntegrate Rule RulePattern Subst TD TExplicitSum " + + "TSum Taylor Taylor1 Taylor2 Taylor3 ToFile " + + "ToStdout ToString TraceRule Until While"); + + // patterns + var pFloatForm = "(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:[eE][+-]?\\d+)?)"; + var pIdentifier = "(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)"; + + // regular expressions + var reFloatForm = new RegExp(pFloatForm); + var reIdentifier = new RegExp(pIdentifier); + var rePattern = new RegExp(pIdentifier + "?_" + pIdentifier); + var reFunctionLike = new RegExp(pIdentifier + "\\s*\\("); + + function tokenBase(stream, state) { + var ch; + + // get next character + ch = stream.next(); + + // string + if (ch === '"') { + state.tokenize = tokenString; + return state.tokenize(stream, state); + } + + // comment + if (ch === '/') { + if (stream.eat('*')) { + state.tokenize = tokenComment; + return state.tokenize(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + + // go back one character + stream.backUp(1); + + // update scope info + var m = stream.match(/^(\w+)\s*\(/, false); + if (m !== null && bodiedOps.hasOwnProperty(m[1])) + state.scopes.push('bodied'); + + var scope = currentScope(state); + + if (scope === 'bodied' && ch === '[') + state.scopes.pop(); + + if (ch === '[' || ch === '{' || ch === '(') + state.scopes.push(ch); + + scope = currentScope(state); + + if (scope === '[' && ch === ']' || + scope === '{' && ch === '}' || + scope === '(' && ch === ')') + state.scopes.pop(); + + if (ch === ';') { + while (scope === 'bodied') { + state.scopes.pop(); + scope = currentScope(state); + } + } + + // look for ordered rules + if (stream.match(/\d+ *#/, true, false)) { + return 'qualifier'; + } + + // look for numbers + if (stream.match(reFloatForm, true, false)) { + return 'number'; + } + + // look for placeholders + if (stream.match(rePattern, true, false)) { + return 'variable-3'; + } + + // match all braces separately + if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { + return 'bracket'; + } + + // literals looking like function calls + if (stream.match(reFunctionLike, true, false)) { + stream.backUp(1); + return 'variable'; + } + + // all other identifiers + if (stream.match(reIdentifier, true, false)) { + return 'variable-2'; + } + + // operators; note that operators like @@ or /; are matched separately for each symbol. + if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%|#)/, true, false)) { + return 'operator'; + } + + // everything else is an error + return 'error'; + } + + function tokenString(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === '"' && !escaped) { + end = true; + break; + } + escaped = !escaped && next === '\\'; + } + if (end && !escaped) { + state.tokenize = tokenBase; + } + return 'string'; + }; + + function tokenComment(stream, state) { + var prev, next; + while((next = stream.next()) != null) { + if (prev === '*' && next === '/') { + state.tokenize = tokenBase; + break; + } + prev = next; + } + return 'comment'; + } + + function currentScope(state) { + var scope = null; + if (state.scopes.length > 0) + scope = state.scopes[state.scopes.length - 1]; + return scope; + } + + return { + startState: function() { + return { + tokenize: tokenBase, + scopes: [] + }; + }, + token: function(stream, state) { + if (stream.eatSpace()) return null; + return state.tokenize(stream, state); + }, + indent: function(state, textAfter) { + if (state.tokenize !== tokenBase && state.tokenize !== null) + return CodeMirror.Pass; + + var delta = 0; + if (textAfter === ']' || textAfter === '];' || + textAfter === '}' || textAfter === '};' || + textAfter === ');') + delta = -1; + + return (state.scopes.length + delta) * _config.indentUnit; + }, + electricChars: "{}[]();", + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//" + }; +}); + +CodeMirror.defineMIME('text/x-yacas', { + name: 'yacas' +}); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js new file mode 100644 index 0000000000..5c6175e4ec --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../yaml/yaml")) + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../yaml/yaml"], mod) + else // Plain browser env + mod(CodeMirror) +})(function (CodeMirror) { + + var START = 0, FRONTMATTER = 1, BODY = 2 + + // a mixed mode for Markdown text with an optional YAML front matter + CodeMirror.defineMode("yaml-frontmatter", function (config, parserConfig) { + var yamlMode = CodeMirror.getMode(config, "yaml") + var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || "gfm") + + function localMode(state) { + return state.state == FRONTMATTER ? {mode: yamlMode, state: state.yaml} : {mode: innerMode, state: state.inner} + } + + return { + startState: function () { + return { + state: START, + yaml: null, + inner: CodeMirror.startState(innerMode) + } + }, + copyState: function (state) { + return { + state: state.state, + yaml: state.yaml && CodeMirror.copyState(yamlMode, state.yaml), + inner: CodeMirror.copyState(innerMode, state.inner) + } + }, + token: function (stream, state) { + if (state.state == START) { + if (stream.match('---', false)) { + state.state = FRONTMATTER + state.yaml = CodeMirror.startState(yamlMode) + return yamlMode.token(stream, state.yaml) + } else { + state.state = BODY + return innerMode.token(stream, state.inner) + } + } else if (state.state == FRONTMATTER) { + var end = stream.sol() && stream.match(/(---|\.\.\.)/, false) + var style = yamlMode.token(stream, state.yaml) + if (end) { + state.state = BODY + state.yaml = null + } + return style + } else { + return innerMode.token(stream, state.inner) + } + }, + innerMode: localMode, + indent: function(state, a, b) { + var m = localMode(state) + return m.mode.indent ? m.mode.indent(m.state, a, b) : CodeMirror.Pass + }, + blankLine: function (state) { + var m = localMode(state) + if (m.mode.blankLine) return m.mode.blankLine(m.state) + } + } + }) +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml/yaml.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml/yaml.js new file mode 100644 index 0000000000..d464941026 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/yaml/yaml.js @@ -0,0 +1,120 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("yaml", function() { + + var cons = ['true', 'false', 'on', 'off', 'yes', 'no']; + var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i'); + + return { + token: function(stream, state) { + var ch = stream.peek(); + var esc = state.escaped; + state.escaped = false; + /* comments */ + if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) { + stream.skipToEnd(); + return "comment"; + } + + if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)) + return "string"; + + if (state.literal && stream.indentation() > state.keyCol) { + stream.skipToEnd(); return "string"; + } else if (state.literal) { state.literal = false; } + if (stream.sol()) { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + /* document start */ + if(stream.match('---')) { return "def"; } + /* document end */ + if (stream.match('...')) { return "def"; } + /* array list item */ + if (stream.match(/\s*-\s+/)) { return 'meta'; } + } + /* inline pairs/lists */ + if (stream.match(/^(\{|\}|\[|\])/)) { + if (ch == '{') + state.inlinePairs++; + else if (ch == '}') + state.inlinePairs--; + else if (ch == '[') + state.inlineList++; + else + state.inlineList--; + return 'meta'; + } + + /* list separator */ + if (state.inlineList > 0 && !esc && ch == ',') { + stream.next(); + return 'meta'; + } + /* pairs separator */ + if (state.inlinePairs > 0 && !esc && ch == ',') { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + stream.next(); + return 'meta'; + } + + /* start of value of a pair */ + if (state.pairStart) { + /* block literals */ + if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; }; + /* references */ + if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; } + /* numbers */ + if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; } + if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; } + /* keywords */ + if (stream.match(keywordRegex)) { return 'keyword'; } + } + + /* pairs (associative arrays) -> key */ + if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) { + state.pair = true; + state.keyCol = stream.indentation(); + return "atom"; + } + if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; } + + /* nothing found, continue */ + state.pairStart = false; + state.escaped = (ch == '\\'); + stream.next(); + return null; + }, + startState: function() { + return { + pair: false, + pairStart: false, + keyCol: 0, + inlinePairs: 0, + inlineList: 0, + literal: false, + escaped: false + }; + }, + lineComment: "#", + fold: "indent" + }; +}); + +CodeMirror.defineMIME("text/x-yaml", "yaml"); +CodeMirror.defineMIME("text/yaml", "yaml"); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/z80/z80.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/z80/z80.js new file mode 100644 index 0000000000..8cea4ff90c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/mode/z80/z80.js @@ -0,0 +1,116 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode('z80', function(_config, parserConfig) { + var ez80 = parserConfig.ez80; + var keywords1, keywords2; + if (ez80) { + keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i; + keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i; + } else { + keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i; + keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i; + } + + var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i; + var variables2 = /^(n?[zc]|p[oe]?|m)\b/i; + var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i; + var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i; + + return { + startState: function() { + return { + context: 0 + }; + }, + token: function(stream, state) { + if (!stream.column()) + state.context = 0; + + if (stream.eatSpace()) + return null; + + var w; + + if (stream.eatWhile(/\w/)) { + if (ez80 && stream.eat('.')) { + stream.eatWhile(/\w/); + } + w = stream.current(); + + if (stream.indentation()) { + if ((state.context == 1 || state.context == 4) && variables1.test(w)) { + state.context = 4; + return 'var2'; + } + + if (state.context == 2 && variables2.test(w)) { + state.context = 4; + return 'var3'; + } + + if (keywords1.test(w)) { + state.context = 1; + return 'keyword'; + } else if (keywords2.test(w)) { + state.context = 2; + return 'keyword'; + } else if (state.context == 4 && numbers.test(w)) { + return 'number'; + } + + if (errors.test(w)) + return 'error'; + } else if (stream.match(numbers)) { + return 'number'; + } else { + return null; + } + } else if (stream.eat(';')) { + stream.skipToEnd(); + return 'comment'; + } else if (stream.eat('"')) { + while (w = stream.next()) { + if (w == '"') + break; + + if (w == '\\') + stream.next(); + } + return 'string'; + } else if (stream.eat('\'')) { + if (stream.match(/\\?.'/)) + return 'number'; + } else if (stream.eat('.') || stream.sol() && stream.eat('#')) { + state.context = 5; + + if (stream.eatWhile(/\w/)) + return 'def'; + } else if (stream.eat('$')) { + if (stream.eatWhile(/[\da-f]/i)) + return 'number'; + } else if (stream.eat('%')) { + if (stream.eatWhile(/[01]/)) + return 'number'; + } else { + stream.next(); + } + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-z80", "z80"); +CodeMirror.defineMIME("text/x-ez80", { name: "z80", ez80: true }); + +}); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-day.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-day.css new file mode 100644 index 0000000000..7132655306 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-day.css @@ -0,0 +1,41 @@ +/* + + Name: 3024 day + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-day.CodeMirror { background: #f7f7f7; color: #3a3432; } +.cm-s-3024-day div.CodeMirror-selected { background: #d6d5d4; } + +.cm-s-3024-day .CodeMirror-line::selection, .cm-s-3024-day .CodeMirror-line > span::selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d6d5d4; } +.cm-s-3024-day .CodeMirror-line::-moz-selection, .cm-s-3024-day .CodeMirror-line > span::-moz-selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d9d9d9; } + +.cm-s-3024-day .CodeMirror-gutters { background: #f7f7f7; border-right: 0px; } +.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; } +.cm-s-3024-day .CodeMirror-linenumber { color: #807d7c; } + +.cm-s-3024-day .CodeMirror-cursor { border-left: 1px solid #5c5855; } + +.cm-s-3024-day span.cm-comment { color: #cdab53; } +.cm-s-3024-day span.cm-atom { color: #a16a94; } +.cm-s-3024-day span.cm-number { color: #a16a94; } + +.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute { color: #01a252; } +.cm-s-3024-day span.cm-keyword { color: #db2d20; } +.cm-s-3024-day span.cm-string { color: #fded02; } + +.cm-s-3024-day span.cm-variable { color: #01a252; } +.cm-s-3024-day span.cm-variable-2 { color: #01a0e4; } +.cm-s-3024-day span.cm-def { color: #e8bbd0; } +.cm-s-3024-day span.cm-bracket { color: #3a3432; } +.cm-s-3024-day span.cm-tag { color: #db2d20; } +.cm-s-3024-day span.cm-link { color: #a16a94; } +.cm-s-3024-day span.cm-error { background: #db2d20; color: #5c5855; } + +.cm-s-3024-day .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-night.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-night.css new file mode 100644 index 0000000000..adc5900ad1 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/3024-night.css @@ -0,0 +1,39 @@ +/* + + Name: 3024 night + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-night.CodeMirror { background: #090300; color: #d6d5d4; } +.cm-s-3024-night div.CodeMirror-selected { background: #3a3432; } +.cm-s-3024-night .CodeMirror-line::selection, .cm-s-3024-night .CodeMirror-line > span::selection, .cm-s-3024-night .CodeMirror-line > span > span::selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night .CodeMirror-line::-moz-selection, .cm-s-3024-night .CodeMirror-line > span::-moz-selection, .cm-s-3024-night .CodeMirror-line > span > span::-moz-selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night .CodeMirror-gutters { background: #090300; border-right: 0px; } +.cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; } +.cm-s-3024-night .CodeMirror-linenumber { color: #5c5855; } + +.cm-s-3024-night .CodeMirror-cursor { border-left: 1px solid #807d7c; } + +.cm-s-3024-night span.cm-comment { color: #cdab53; } +.cm-s-3024-night span.cm-atom { color: #a16a94; } +.cm-s-3024-night span.cm-number { color: #a16a94; } + +.cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute { color: #01a252; } +.cm-s-3024-night span.cm-keyword { color: #db2d20; } +.cm-s-3024-night span.cm-string { color: #fded02; } + +.cm-s-3024-night span.cm-variable { color: #01a252; } +.cm-s-3024-night span.cm-variable-2 { color: #01a0e4; } +.cm-s-3024-night span.cm-def { color: #e8bbd0; } +.cm-s-3024-night span.cm-bracket { color: #d6d5d4; } +.cm-s-3024-night span.cm-tag { color: #db2d20; } +.cm-s-3024-night span.cm-link { color: #a16a94; } +.cm-s-3024-night span.cm-error { background: #db2d20; color: #807d7c; } + +.cm-s-3024-night .CodeMirror-activeline-background { background: #2F2F2F; } +.cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abbott.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abbott.css new file mode 100644 index 0000000000..3e516a67f9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abbott.css @@ -0,0 +1,268 @@ +/* + * abbott.css + * A warm, dark theme for prose and code, with pastels and pretty greens. + * + * Ported from abbott.vim (https://github.com/bcat/abbott.vim) version 2.1. + * Original design and CodeMirror port by Jonathan Rascher. + * + * This theme shares the following color palette with the Vim color scheme. + * + * Brown shades: + * bistre: #231c14 + * chocolate: #3c3022 + * cocoa: #745d42 + * vanilla_cream: #fef3b4 + * + * Red shades: + * crimson: #d80450 + * cinnabar: #f63f05 + * + * Green shades: + * dark_olive: #273900 + * forest_green: #24a507 + * chartreuse: #a0ea00 + * pastel_chartreuse: #d8ff84 + * + * Yellow shades: + * marigold: #fbb32f + * lemon_meringue: #fbec5d + * + * Blue shades: + * cornflower_blue: #3f91f1 + * periwinkle_blue: #8ccdf0 + * + * Magenta shades: + * french_pink: #ec6c99 + * lavender: #e6a2f3 + * + * Cyan shades: + * zomp: #39a78d + * seafoam_green: #00ff7f + */ + +/* Style the UI: */ + +/* Equivalent to Vim's Normal group. */ +.cm-s-abbott.CodeMirror { + background: #231c14 /* bistre */; + color: #d8ff84 /* pastel_chartreuse */; +} + +/* Roughly equivalent to Vim's LineNr group. */ +.cm-s-abbott .CodeMirror-gutters { + background: #231c14 /* bistre */; + border: none; +} +.cm-s-abbott .CodeMirror-linenumber { color: #fbec5d /* lemon_meringue */; } + +.cm-s-abbott .CodeMirror-guttermarker { color: #f63f05 /* cinnabar */; } + +/* Roughly equivalent to Vim's FoldColumn group. */ +.cm-s-abbott .CodeMirror-guttermarker-subtle { color: #fbb32f /* marigold */; } + +/* + * Roughly equivalent to Vim's CursorColumn group. (We use a brighter color + * since Vim's cursorcolumn option highlights a whole column, whereas + * CodeMirror's rule just highlights a thin line.) + */ +.cm-s-abbott .CodeMirror-ruler { border-color: #745d42 /* cocoa */; } + +/* Equivalent to Vim's Cursor group in insert mode. */ +.cm-s-abbott .CodeMirror-cursor { border-color: #a0ea00 /* chartreuse */; } + +/* Equivalent to Vim's Cursor group in normal mode. */ +.cm-s-abbott.cm-fat-cursor .CodeMirror-cursor, +.cm-s-abbott .cm-animate-fat-cursor { + /* + * CodeMirror doesn't allow changing the foreground color of the character + * under the cursor, so we can't use a reverse video effect for the cursor. + * Instead, make it semitransparent. + */ + background: rgba(160, 234, 0, 0.5) /* chartreuse */; +} +.cm-s-abbott.cm-fat-cursor .CodeMirror-cursors { + /* + * Boost the z-index so the fat cursor shows up on top of text and + * matchingbracket/matchingtag highlights. + */ + z-index: 3; +} + +/* Equivalent to Vim's Cursor group in replace mode. */ +.cm-s-abbott .CodeMirror-overwrite .CodeMirror-cursor { + border-bottom: 1px solid #a0ea00 /* chartreuse */; + border-left: none; + width: auto; +} + +/* Roughly equivalent to Vim's CursorIM group. */ +.cm-s-abbott .CodeMirror-secondarycursor { + border-color: #00ff7f /* seafoam_green */; +} + +/* Roughly equivalent to Vim's Visual group. */ +.cm-s-abbott .CodeMirror-selected, +.cm-s-abbott.CodeMirror-focused .CodeMirror-selected { + background: #273900 /* dark_olive */; +} +.cm-s-abbott .CodeMirror-line::selection, +.cm-s-abbott .CodeMirror-line > span::selection, +.cm-s-abbott .CodeMirror-line > span > span::selection { + background: #273900 /* dark_olive */; +} +.cm-s-abbott .CodeMirror-line::-moz-selection, +.cm-s-abbott .CodeMirror-line > span::-moz-selection, +.cm-s-abbott .CodeMirror-line > span > span::-moz-selection { + background: #273900 /* dark_olive */; +} + +/* Roughly equivalent to Vim's SpecialKey group. */ +.cm-s-abbott .cm-tab { color: #00ff7f /* seafoam_green */; } + +/* Equivalent to Vim's Search group. */ +.cm-s-abbott .cm-searching { + background: #fef3b4 /* vanilla_cream */ !important; + color: #231c14 /* bistre */ !important; +} + +/* Style syntax highlighting modes: */ + +/* Equivalent to Vim's Comment group. */ +.cm-s-abbott span.cm-comment { + color: #fbb32f /* marigold */; + font-style: italic; +} + +/* Equivalent to Vim's String group. */ +.cm-s-abbott span.cm-string, +.cm-s-abbott span.cm-string-2 { + color: #e6a2f3 /* lavender */; +} + +/* Equivalent to Vim's Constant group. */ +.cm-s-abbott span.cm-number, +.cm-s-abbott span.cm-string.cm-url { color: #f63f05 /* cinnabar */; } + +/* Roughly equivalent to Vim's SpecialKey group. */ +.cm-s-abbott span.cm-invalidchar { color: #00ff7f /* seafoam_green */; } + +/* Equivalent to Vim's Special group. */ +.cm-s-abbott span.cm-atom { color: #fef3b4 /* vanilla_cream */; } + +/* Equivalent to Vim's Delimiter group. */ +.cm-s-abbott span.cm-bracket, +.cm-s-abbott span.cm-punctuation { + color: #fef3b4 /* vanilla_cream */; +} + +/* Equivalent Vim's Operator group. */ +.cm-s-abbott span.cm-operator { font-weight: bold; } + +/* Roughly equivalent to Vim's Identifier group. */ +.cm-s-abbott span.cm-def, +.cm-s-abbott span.cm-variable, +.cm-s-abbott span.cm-variable-2, +.cm-s-abbott span.cm-variable-3 { + color: #8ccdf0 /* periwinkle_blue */; +} + +/* Roughly equivalent to Vim's Function group. */ +.cm-s-abbott span.cm-builtin, +.cm-s-abbott span.cm-property, +.cm-s-abbott span.cm-qualifier { + color: #3f91f1 /* cornflower_blue */; +} + +/* Equivalent to Vim's Type group. */ +.cm-s-abbott span.cm-type { color: #24a507 /* forest_green */; } + +/* Equivalent to Vim's Keyword group. */ +.cm-s-abbott span.cm-keyword { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's PreProc group. */ +.cm-s-abbott span.cm-meta { color: #ec6c99 /* french_pink */; } + +/* Equivalent to Vim's htmlTagName group (linked to Statement). */ +.cm-s-abbott span.cm-tag { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's htmlArg group (linked to Type). */ +.cm-s-abbott span.cm-attribute { color: #24a507 /* forest_green */; } + +/* Equivalent to Vim's htmlH1, markdownH1, etc. groups (linked to Title). */ +.cm-s-abbott span.cm-header { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's markdownRule group (linked to PreProc). */ +.cm-s-abbott span.cm-hr { color: #ec6c99 /* french_pink */; } + +/* Roughly equivalent to Vim's Underlined group. */ +.cm-s-abbott span.cm-link { color: #e6a2f3 /* lavender */; } + +/* Equivalent to Vim's diffRemoved group. */ +.cm-s-abbott span.cm-negative { + background: #d80450 /* crimson */; + color: #231c14 /* bistre */; +} + +/* Equivalent to Vim's diffAdded group. */ +.cm-s-abbott span.cm-positive { + background: #a0ea00 /* chartreuse */; + color: #231c14 /* bistre */; + font-weight: bold; +} + +/* Equivalent to Vim's Error group. */ +.cm-s-abbott span.cm-error { + background: #d80450 /* crimson */; + color: #231c14 /* bistre */; +} + +/* Style addons: */ + +/* Equivalent to Vim's MatchParen group. */ +.cm-s-abbott span.CodeMirror-matchingbracket { + background: #745d42 /* cocoa */ !important; + color: #231c14 /* bistre */ !important; + font-weight: bold; +} + +/* + * Roughly equivalent to Vim's Error group. (Vim doesn't seem to have a direct + * equivalent in its own matchparen plugin, but many syntax highlighting plugins + * mark mismatched brackets as Error.) + */ +.cm-s-abbott span.CodeMirror-nonmatchingbracket { + background: #d80450 /* crimson */ !important; + color: #231c14 /* bistre */ !important; +} + +.cm-s-abbott .CodeMirror-matchingtag, +.cm-s-abbott .cm-matchhighlight { + outline: 1px solid #39a78d /* zomp */; +} + +/* Equivalent to Vim's CursorLine group. */ +.cm-s-abbott .CodeMirror-activeline-background, +.cm-s-abbott .CodeMirror-activeline-gutter { + background: #3c3022 /* chocolate */; +} + +/* Equivalent to Vim's CursorLineNr group. */ +.cm-s-abbott .CodeMirror-activeline-gutter .CodeMirror-linenumber { + color: #d8ff84 /* pastel_chartreuse */; + font-weight: bold; +} + +/* Roughly equivalent to Vim's Folded group. */ +.cm-s-abbott .CodeMirror-foldmarker { + color: #f63f05 /* cinnabar */; + text-shadow: none; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abcdef.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abcdef.css new file mode 100644 index 0000000000..cf93530946 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/abcdef.css @@ -0,0 +1,32 @@ +.cm-s-abcdef.CodeMirror { background: #0f0f0f; color: #defdef; } +.cm-s-abcdef div.CodeMirror-selected { background: #515151; } +.cm-s-abcdef .CodeMirror-line::selection, .cm-s-abcdef .CodeMirror-line > span::selection, .cm-s-abcdef .CodeMirror-line > span > span::selection { background: rgba(56, 56, 56, 0.99); } +.cm-s-abcdef .CodeMirror-line::-moz-selection, .cm-s-abcdef .CodeMirror-line > span::-moz-selection, .cm-s-abcdef .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 56, 56, 0.99); } +.cm-s-abcdef .CodeMirror-gutters { background: #555; border-right: 2px solid #314151; } +.cm-s-abcdef .CodeMirror-guttermarker { color: #222; } +.cm-s-abcdef .CodeMirror-guttermarker-subtle { color: azure; } +.cm-s-abcdef .CodeMirror-linenumber { color: #FFFFFF; } +.cm-s-abcdef .CodeMirror-cursor { border-left: 1px solid #00FF00; } + +.cm-s-abcdef span.cm-keyword { color: darkgoldenrod; font-weight: bold; } +.cm-s-abcdef span.cm-atom { color: #77F; } +.cm-s-abcdef span.cm-number { color: violet; } +.cm-s-abcdef span.cm-def { color: #fffabc; } +.cm-s-abcdef span.cm-variable { color: #abcdef; } +.cm-s-abcdef span.cm-variable-2 { color: #cacbcc; } +.cm-s-abcdef span.cm-variable-3, .cm-s-abcdef span.cm-type { color: #def; } +.cm-s-abcdef span.cm-property { color: #fedcba; } +.cm-s-abcdef span.cm-operator { color: #ff0; } +.cm-s-abcdef span.cm-comment { color: #7a7b7c; font-style: italic;} +.cm-s-abcdef span.cm-string { color: #2b4; } +.cm-s-abcdef span.cm-meta { color: #C9F; } +.cm-s-abcdef span.cm-qualifier { color: #FFF700; } +.cm-s-abcdef span.cm-builtin { color: #30aabc; } +.cm-s-abcdef span.cm-bracket { color: #8a8a8a; } +.cm-s-abcdef span.cm-tag { color: #FFDD44; } +.cm-s-abcdef span.cm-attribute { color: #DDFF00; } +.cm-s-abcdef span.cm-error { color: #FF0000; } +.cm-s-abcdef span.cm-header { color: aquamarine; font-weight: bold; } +.cm-s-abcdef span.cm-link { color: blueviolet; } + +.cm-s-abcdef .CodeMirror-activeline-background { background: #314151; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance-mobile.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance-mobile.css new file mode 100644 index 0000000000..88d332e1a7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance-mobile.css @@ -0,0 +1,5 @@ +.cm-s-ambiance.CodeMirror { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance.css new file mode 100644 index 0000000000..782fca43f5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ambiance.css @@ -0,0 +1,74 @@ +/* ambiance theme for codemirror */ + +/* Color scheme */ + +.cm-s-ambiance .cm-header { color: blue; } +.cm-s-ambiance .cm-quote { color: #24C2C7; } + +.cm-s-ambiance .cm-keyword { color: #cda869; } +.cm-s-ambiance .cm-atom { color: #CF7EA9; } +.cm-s-ambiance .cm-number { color: #78CF8A; } +.cm-s-ambiance .cm-def { color: #aac6e3; } +.cm-s-ambiance .cm-variable { color: #ffb795; } +.cm-s-ambiance .cm-variable-2 { color: #eed1b3; } +.cm-s-ambiance .cm-variable-3, .cm-s-ambiance .cm-type { color: #faded3; } +.cm-s-ambiance .cm-property { color: #eed1b3; } +.cm-s-ambiance .cm-operator { color: #fa8d6a; } +.cm-s-ambiance .cm-comment { color: #555; font-style:italic; } +.cm-s-ambiance .cm-string { color: #8f9d6a; } +.cm-s-ambiance .cm-string-2 { color: #9d937c; } +.cm-s-ambiance .cm-meta { color: #D2A8A1; } +.cm-s-ambiance .cm-qualifier { color: yellow; } +.cm-s-ambiance .cm-builtin { color: #9999cc; } +.cm-s-ambiance .cm-bracket { color: #24C2C7; } +.cm-s-ambiance .cm-tag { color: #fee4ff; } +.cm-s-ambiance .cm-attribute { color: #9B859D; } +.cm-s-ambiance .cm-hr { color: pink; } +.cm-s-ambiance .cm-link { color: #F4C20B; } +.cm-s-ambiance .cm-special { color: #FF9D00; } +.cm-s-ambiance .cm-error { color: #AF2018; } + +.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } +.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } + +.cm-s-ambiance div.CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } +.cm-s-ambiance.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance .CodeMirror-line::selection, .cm-s-ambiance .CodeMirror-line > span::selection, .cm-s-ambiance .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance .CodeMirror-line::-moz-selection, .cm-s-ambiance .CodeMirror-line > span::-moz-selection, .cm-s-ambiance .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } + +/* Editor styling */ + +.cm-s-ambiance.CodeMirror { + line-height: 1.40em; + color: #E6E1DC; + background-color: #202020; + -webkit-box-shadow: inset 0 0 10px black; + -moz-box-shadow: inset 0 0 10px black; + box-shadow: inset 0 0 10px black; +} + +.cm-s-ambiance .CodeMirror-gutters { + background: #3D3D3D; + border-right: 1px solid #4D4D4D; + box-shadow: 0 10px 20px black; +} + +.cm-s-ambiance .CodeMirror-linenumber { + text-shadow: 0px 1px 1px #4d4d4d; + color: #111; + padding: 0 5px; +} + +.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; } +.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; } + +.cm-s-ambiance .CodeMirror-cursor { border-left: 1px solid #7991E8; } + +.cm-s-ambiance .CodeMirror-activeline-background { + background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); +} + +.cm-s-ambiance.CodeMirror, +.cm-s-ambiance .CodeMirror-gutters { + background-image: url("data:image/png;base64,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"); +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-dark.css new file mode 100644 index 0000000000..13656b94bb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-dark.css @@ -0,0 +1,44 @@ +/* Based on https://github.com/dempfi/ayu */ + +.cm-s-ayu-dark.CodeMirror { background: #0a0e14; color: #b3b1ad; } +.cm-s-ayu-dark div.CodeMirror-selected { background: #273747; } +.cm-s-ayu-dark .CodeMirror-line::selection, .cm-s-ayu-dark .CodeMirror-line > span::selection, .cm-s-ayu-dark .CodeMirror-line > span > span::selection { background: rgba(39, 55, 71, 99); } +.cm-s-ayu-dark .CodeMirror-line::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 55, 71, 99); } +.cm-s-ayu-dark .CodeMirror-gutters { background: #0a0e14; border-right: 0px; } +.cm-s-ayu-dark .CodeMirror-guttermarker { color: white; } +.cm-s-ayu-dark .CodeMirror-guttermarker-subtle { color: #3d424d; } +.cm-s-ayu-dark .CodeMirror-linenumber { color: #3d424d; } +.cm-s-ayu-dark .CodeMirror-cursor { border-left: 1px solid #e6b450; } +.cm-s-ayu-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; } +.cm-s-ayu-dark .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-ayu-dark span.cm-comment { color: #626a73; } +.cm-s-ayu-dark span.cm-atom { color: #ae81ff; } +.cm-s-ayu-dark span.cm-number { color: #e6b450; } + +.cm-s-ayu-dark span.cm-comment.cm-attribute { color: #ffb454; } +.cm-s-ayu-dark span.cm-comment.cm-def { color: rgba(57, 186, 230, 80); } +.cm-s-ayu-dark span.cm-comment.cm-tag { color: #39bae6; } +.cm-s-ayu-dark span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-ayu-dark span.cm-property, .cm-s-ayu-dark span.cm-attribute { color: #ffb454; } +.cm-s-ayu-dark span.cm-keyword { color: #ff8f40; } +.cm-s-ayu-dark span.cm-builtin { color: #e6b450; } +.cm-s-ayu-dark span.cm-string { color: #c2d94c; } + +.cm-s-ayu-dark span.cm-variable { color: #b3b1ad; } +.cm-s-ayu-dark span.cm-variable-2 { color: #f07178; } +.cm-s-ayu-dark span.cm-variable-3 { color: #39bae6; } +.cm-s-ayu-dark span.cm-type { color: #ff8f40; } +.cm-s-ayu-dark span.cm-def { color: #ffee99; } +.cm-s-ayu-dark span.cm-bracket { color: #f8f8f2; } +.cm-s-ayu-dark span.cm-tag { color: rgba(57, 186, 230, 80); } +.cm-s-ayu-dark span.cm-header { color: #c2d94c; } +.cm-s-ayu-dark span.cm-link { color: #39bae6; } +.cm-s-ayu-dark span.cm-error { color: #ff3333; } + +.cm-s-ayu-dark .CodeMirror-activeline-background { background: #01060e; } +.cm-s-ayu-dark .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-mirage.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-mirage.css new file mode 100644 index 0000000000..19403cefb5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ayu-mirage.css @@ -0,0 +1,45 @@ +/* Based on https://github.com/dempfi/ayu */ + +.cm-s-ayu-mirage.CodeMirror { background: #1f2430; color: #cbccc6; } +.cm-s-ayu-mirage div.CodeMirror-selected { background: #34455a; } +.cm-s-ayu-mirage .CodeMirror-line::selection, .cm-s-ayu-mirage .CodeMirror-line > span::selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::selection { background: #34455a; } +.cm-s-ayu-mirage .CodeMirror-line::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::-moz-selection { background: rgba(25, 30, 42, 99); } +.cm-s-ayu-mirage .CodeMirror-gutters { background: #1f2430; border-right: 0px; } +.cm-s-ayu-mirage .CodeMirror-guttermarker { color: white; } +.cm-s-ayu-mirage .CodeMirror-guttermarker-subtle { color: rgba(112, 122, 140, 66); } +.cm-s-ayu-mirage .CodeMirror-linenumber { color: rgba(61, 66, 77, 99); } +.cm-s-ayu-mirage .CodeMirror-cursor { border-left: 1px solid #ffcc66; } +.cm-s-ayu-mirage.cm-fat-cursor .CodeMirror-cursor {background-color: #a2a8a175 !important;} +.cm-s-ayu-mirage .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-ayu-mirage span.cm-comment { color: #5c6773; font-style:italic; } +.cm-s-ayu-mirage span.cm-atom { color: #ae81ff; } +.cm-s-ayu-mirage span.cm-number { color: #ffcc66; } + +.cm-s-ayu-mirage span.cm-comment.cm-attribute { color: #ffd580; } +.cm-s-ayu-mirage span.cm-comment.cm-def { color: #d4bfff; } +.cm-s-ayu-mirage span.cm-comment.cm-tag { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-ayu-mirage span.cm-property { color: #f29e74; } +.cm-s-ayu-mirage span.cm-attribute { color: #ffd580; } +.cm-s-ayu-mirage span.cm-keyword { color: #ffa759; } +.cm-s-ayu-mirage span.cm-builtin { color: #ffcc66; } +.cm-s-ayu-mirage span.cm-string { color: #bae67e; } + +.cm-s-ayu-mirage span.cm-variable { color: #cbccc6; } +.cm-s-ayu-mirage span.cm-variable-2 { color: #f28779; } +.cm-s-ayu-mirage span.cm-variable-3 { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-type { color: #ffa759; } +.cm-s-ayu-mirage span.cm-def { color: #ffd580; } +.cm-s-ayu-mirage span.cm-bracket { color: rgba(92, 207, 230, 80); } +.cm-s-ayu-mirage span.cm-tag { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-header { color: #bae67e; } +.cm-s-ayu-mirage span.cm-link { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-error { color: #ff3333; } + +.cm-s-ayu-mirage .CodeMirror-activeline-background { background: #191e2a; } +.cm-s-ayu-mirage .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-dark.css new file mode 100644 index 0000000000..b3c31aba20 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-dark.css @@ -0,0 +1,40 @@ +/* + + Name: Base16 Default Dark + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-dark.CodeMirror { background: #151515; color: #e0e0e0; } +.cm-s-base16-dark div.CodeMirror-selected { background: #303030; } +.cm-s-base16-dark .CodeMirror-line::selection, .cm-s-base16-dark .CodeMirror-line > span::selection, .cm-s-base16-dark .CodeMirror-line > span > span::selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark .CodeMirror-line::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark .CodeMirror-gutters { background: #151515; border-right: 0px; } +.cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; } +.cm-s-base16-dark .CodeMirror-linenumber { color: #505050; } +.cm-s-base16-dark .CodeMirror-cursor { border-left: 1px solid #b0b0b0; } +.cm-s-base16-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; } +.cm-s-base16-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; } + +.cm-s-base16-dark span.cm-comment { color: #8f5536; } +.cm-s-base16-dark span.cm-atom { color: #aa759f; } +.cm-s-base16-dark span.cm-number { color: #aa759f; } + +.cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute { color: #90a959; } +.cm-s-base16-dark span.cm-keyword { color: #ac4142; } +.cm-s-base16-dark span.cm-string { color: #f4bf75; } + +.cm-s-base16-dark span.cm-variable { color: #90a959; } +.cm-s-base16-dark span.cm-variable-2 { color: #6a9fb5; } +.cm-s-base16-dark span.cm-def { color: #d28445; } +.cm-s-base16-dark span.cm-bracket { color: #e0e0e0; } +.cm-s-base16-dark span.cm-tag { color: #ac4142; } +.cm-s-base16-dark span.cm-link { color: #aa759f; } +.cm-s-base16-dark span.cm-error { background: #ac4142; color: #b0b0b0; } + +.cm-s-base16-dark .CodeMirror-activeline-background { background: #202020; } +.cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-light.css new file mode 100644 index 0000000000..1d5f582f6a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/base16-light.css @@ -0,0 +1,38 @@ +/* + + Name: Base16 Default Light + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-light.CodeMirror { background: #f5f5f5; color: #202020; } +.cm-s-base16-light div.CodeMirror-selected { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::selection, .cm-s-base16-light .CodeMirror-line > span::selection, .cm-s-base16-light .CodeMirror-line > span > span::selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::-moz-selection, .cm-s-base16-light .CodeMirror-line > span::-moz-selection, .cm-s-base16-light .CodeMirror-line > span > span::-moz-selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-gutters { background: #f5f5f5; border-right: 0px; } +.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-linenumber { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-cursor { border-left: 1px solid #505050; } + +.cm-s-base16-light span.cm-comment { color: #8f5536; } +.cm-s-base16-light span.cm-atom { color: #aa759f; } +.cm-s-base16-light span.cm-number { color: #aa759f; } + +.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute { color: #90a959; } +.cm-s-base16-light span.cm-keyword { color: #ac4142; } +.cm-s-base16-light span.cm-string { color: #f4bf75; } + +.cm-s-base16-light span.cm-variable { color: #90a959; } +.cm-s-base16-light span.cm-variable-2 { color: #6a9fb5; } +.cm-s-base16-light span.cm-def { color: #d28445; } +.cm-s-base16-light span.cm-bracket { color: #202020; } +.cm-s-base16-light span.cm-tag { color: #ac4142; } +.cm-s-base16-light span.cm-link { color: #aa759f; } +.cm-s-base16-light span.cm-error { background: #ac4142; color: #505050; } + +.cm-s-base16-light .CodeMirror-activeline-background { background: #DDDCDC; } +.cm-s-base16-light .CodeMirror-matchingbracket { color: #f5f5f5 !important; background-color: #6A9FB5 !important} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/bespin.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/bespin.css new file mode 100644 index 0000000000..60913ba938 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/bespin.css @@ -0,0 +1,34 @@ +/* + + Name: Bespin + Author: Mozilla / Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-bespin.CodeMirror {background: #28211c; color: #9d9b97;} +.cm-s-bespin div.CodeMirror-selected {background: #36312e !important;} +.cm-s-bespin .CodeMirror-gutters {background: #28211c; border-right: 0px;} +.cm-s-bespin .CodeMirror-linenumber {color: #666666;} +.cm-s-bespin .CodeMirror-cursor {border-left: 1px solid #797977 !important;} + +.cm-s-bespin span.cm-comment {color: #937121;} +.cm-s-bespin span.cm-atom {color: #9b859d;} +.cm-s-bespin span.cm-number {color: #9b859d;} + +.cm-s-bespin span.cm-property, .cm-s-bespin span.cm-attribute {color: #54be0d;} +.cm-s-bespin span.cm-keyword {color: #cf6a4c;} +.cm-s-bespin span.cm-string {color: #f9ee98;} + +.cm-s-bespin span.cm-variable {color: #54be0d;} +.cm-s-bespin span.cm-variable-2 {color: #5ea6ea;} +.cm-s-bespin span.cm-def {color: #cf7d34;} +.cm-s-bespin span.cm-error {background: #cf6a4c; color: #797977;} +.cm-s-bespin span.cm-bracket {color: #9d9b97;} +.cm-s-bespin span.cm-tag {color: #cf6a4c;} +.cm-s-bespin span.cm-link {color: #9b859d;} + +.cm-s-bespin .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-bespin .CodeMirror-activeline-background { background: #404040; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/blackboard.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/blackboard.css new file mode 100644 index 0000000000..b6eaedb180 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/blackboard.css @@ -0,0 +1,32 @@ +/* Port of TextMate's Blackboard theme */ + +.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } +.cm-s-blackboard div.CodeMirror-selected { background: #253B76; } +.cm-s-blackboard .CodeMirror-line::selection, .cm-s-blackboard .CodeMirror-line > span::selection, .cm-s-blackboard .CodeMirror-line > span > span::selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-line::-moz-selection, .cm-s-blackboard .CodeMirror-line > span::-moz-selection, .cm-s-blackboard .CodeMirror-line > span > span::-moz-selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } +.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; } +.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; } +.cm-s-blackboard .CodeMirror-linenumber { color: #888; } +.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7; } + +.cm-s-blackboard .cm-keyword { color: #FBDE2D; } +.cm-s-blackboard .cm-atom { color: #D8FA3C; } +.cm-s-blackboard .cm-number { color: #D8FA3C; } +.cm-s-blackboard .cm-def { color: #8DA6CE; } +.cm-s-blackboard .cm-variable { color: #FF6400; } +.cm-s-blackboard .cm-operator { color: #FBDE2D; } +.cm-s-blackboard .cm-comment { color: #AEAEAE; } +.cm-s-blackboard .cm-string { color: #61CE3C; } +.cm-s-blackboard .cm-string-2 { color: #61CE3C; } +.cm-s-blackboard .cm-meta { color: #D8FA3C; } +.cm-s-blackboard .cm-builtin { color: #8DA6CE; } +.cm-s-blackboard .cm-tag { color: #8DA6CE; } +.cm-s-blackboard .cm-attribute { color: #8DA6CE; } +.cm-s-blackboard .cm-header { color: #FF6400; } +.cm-s-blackboard .cm-hr { color: #AEAEAE; } +.cm-s-blackboard .cm-link { color: #8DA6CE; } +.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } + +.cm-s-blackboard .CodeMirror-activeline-background { background: #3C3636; } +.cm-s-blackboard .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/cobalt.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/cobalt.css new file mode 100644 index 0000000000..bbbda3b543 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/cobalt.css @@ -0,0 +1,25 @@ +.cm-s-cobalt.CodeMirror { background: #002240; color: white; } +.cm-s-cobalt div.CodeMirror-selected { background: #b36539; } +.cm-s-cobalt .CodeMirror-line::selection, .cm-s-cobalt .CodeMirror-line > span::selection, .cm-s-cobalt .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt .CodeMirror-line::-moz-selection, .cm-s-cobalt .CodeMirror-line > span::-moz-selection, .cm-s-cobalt .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; } +.cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-cobalt span.cm-comment { color: #08f; } +.cm-s-cobalt span.cm-atom { color: #845dc4; } +.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } +.cm-s-cobalt span.cm-keyword { color: #ffee80; } +.cm-s-cobalt span.cm-string { color: #3ad900; } +.cm-s-cobalt span.cm-meta { color: #ff9d00; } +.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } +.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def, .cm-s-cobalt .cm-type { color: white; } +.cm-s-cobalt span.cm-bracket { color: #d8d8d8; } +.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } +.cm-s-cobalt span.cm-link { color: #845dc4; } +.cm-s-cobalt span.cm-error { color: #9d1e15; } + +.cm-s-cobalt .CodeMirror-activeline-background { background: #002D57; } +.cm-s-cobalt .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/colorforth.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/colorforth.css new file mode 100644 index 0000000000..19095e41d9 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/colorforth.css @@ -0,0 +1,33 @@ +.cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; } +.cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; } +.cm-s-colorforth .CodeMirror-linenumber { color: #bababa; } +.cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-colorforth span.cm-comment { color: #ededed; } +.cm-s-colorforth span.cm-def { color: #ff1c1c; font-weight:bold; } +.cm-s-colorforth span.cm-keyword { color: #ffd900; } +.cm-s-colorforth span.cm-builtin { color: #00d95a; } +.cm-s-colorforth span.cm-variable { color: #73ff00; } +.cm-s-colorforth span.cm-string { color: #007bff; } +.cm-s-colorforth span.cm-number { color: #00c4ff; } +.cm-s-colorforth span.cm-atom { color: #606060; } + +.cm-s-colorforth span.cm-variable-2 { color: #EEE; } +.cm-s-colorforth span.cm-variable-3, .cm-s-colorforth span.cm-type { color: #DDD; } +.cm-s-colorforth span.cm-property {} +.cm-s-colorforth span.cm-operator {} + +.cm-s-colorforth span.cm-meta { color: yellow; } +.cm-s-colorforth span.cm-qualifier { color: #FFF700; } +.cm-s-colorforth span.cm-bracket { color: #cc7; } +.cm-s-colorforth span.cm-tag { color: #FFBD40; } +.cm-s-colorforth span.cm-attribute { color: #FFF700; } +.cm-s-colorforth span.cm-error { color: #f00; } + +.cm-s-colorforth div.CodeMirror-selected { background: #333d53; } + +.cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); } + +.cm-s-colorforth .CodeMirror-activeline-background { background: #253540; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/darcula.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/darcula.css new file mode 100644 index 0000000000..2ec81a3557 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/darcula.css @@ -0,0 +1,53 @@ +/** + Name: IntelliJ IDEA darcula theme + From IntelliJ IDEA by JetBrains + */ + +.cm-s-darcula { font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;} +.cm-s-darcula.CodeMirror { background: #2B2B2B; color: #A9B7C6; } + +.cm-s-darcula span.cm-meta { color: #BBB529; } +.cm-s-darcula span.cm-number { color: #6897BB; } +.cm-s-darcula span.cm-keyword { color: #CC7832; line-height: 1em; font-weight: bold; } +.cm-s-darcula span.cm-def { color: #A9B7C6; font-style: italic; } +.cm-s-darcula span.cm-variable { color: #A9B7C6; } +.cm-s-darcula span.cm-variable-2 { color: #A9B7C6; } +.cm-s-darcula span.cm-variable-3 { color: #9876AA; } +.cm-s-darcula span.cm-type { color: #AABBCC; font-weight: bold; } +.cm-s-darcula span.cm-property { color: #FFC66D; } +.cm-s-darcula span.cm-operator { color: #A9B7C6; } +.cm-s-darcula span.cm-string { color: #6A8759; } +.cm-s-darcula span.cm-string-2 { color: #6A8759; } +.cm-s-darcula span.cm-comment { color: #61A151; font-style: italic; } +.cm-s-darcula span.cm-link { color: #CC7832; } +.cm-s-darcula span.cm-atom { color: #CC7832; } +.cm-s-darcula span.cm-error { color: #BC3F3C; } +.cm-s-darcula span.cm-tag { color: #629755; font-weight: bold; font-style: italic; text-decoration: underline; } +.cm-s-darcula span.cm-attribute { color: #6897bb; } +.cm-s-darcula span.cm-qualifier { color: #6A8759; } +.cm-s-darcula span.cm-bracket { color: #A9B7C6; } +.cm-s-darcula span.cm-builtin { color: #FF9E59; } +.cm-s-darcula span.cm-special { color: #FF9E59; } +.cm-s-darcula span.cm-matchhighlight { color: #FFFFFF; background-color: rgba(50, 89, 48, .7); font-weight: normal;} +.cm-s-darcula span.cm-searching { color: #FFFFFF; background-color: rgba(61, 115, 59, .7); font-weight: normal;} + +.cm-s-darcula .CodeMirror-cursor { border-left: 1px solid #A9B7C6; } +.cm-s-darcula .CodeMirror-activeline-background { background: #323232; } +.cm-s-darcula .CodeMirror-gutters { background: #313335; border-right: 1px solid #313335; } +.cm-s-darcula .CodeMirror-guttermarker { color: #FFEE80; } +.cm-s-darcula .CodeMirror-guttermarker-subtle { color: #D0D0D0; } +.cm-s-darcula .CodeMirrir-linenumber { color: #606366; } +.cm-s-darcula .CodeMirror-matchingbracket { background-color: #3B514D; color: #FFEF28 !important; font-weight: bold; } + +.cm-s-darcula div.CodeMirror-selected { background: #214283; } + +.CodeMirror-hints.darcula { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; + color: #9C9E9E; + background-color: #3B3E3F !important; +} + +.CodeMirror-hints.darcula .CodeMirror-hint-active { + background-color: #494D4E !important; + color: #9C9E9E !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/dracula.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/dracula.css new file mode 100644 index 0000000000..253133efe7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/dracula.css @@ -0,0 +1,40 @@ +/* + + Name: dracula + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme) + +*/ + + +.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters { + background-color: #282a36 !important; + color: #f8f8f2 !important; + border: none; +} +.cm-s-dracula .CodeMirror-gutters { color: #282a36; } +.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; } +.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; } +.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula span.cm-comment { color: #6272a4; } +.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; } +.cm-s-dracula span.cm-number { color: #bd93f9; } +.cm-s-dracula span.cm-variable { color: #50fa7b; } +.cm-s-dracula span.cm-variable-2 { color: white; } +.cm-s-dracula span.cm-def { color: #50fa7b; } +.cm-s-dracula span.cm-operator { color: #ff79c6; } +.cm-s-dracula span.cm-keyword { color: #ff79c6; } +.cm-s-dracula span.cm-atom { color: #bd93f9; } +.cm-s-dracula span.cm-meta { color: #f8f8f2; } +.cm-s-dracula span.cm-tag { color: #ff79c6; } +.cm-s-dracula span.cm-attribute { color: #50fa7b; } +.cm-s-dracula span.cm-qualifier { color: #50fa7b; } +.cm-s-dracula span.cm-property { color: #66d9ef; } +.cm-s-dracula span.cm-builtin { color: #50fa7b; } +.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; } + +.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); } +.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-dark.css new file mode 100644 index 0000000000..88fdc76c8e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-dark.css @@ -0,0 +1,35 @@ +/* +Name: DuoTone-Dark +Author: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes) + +CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/) +*/ + +.cm-s-duotone-dark.CodeMirror { background: #2a2734; color: #6c6783; } +.cm-s-duotone-dark div.CodeMirror-selected { background: #545167!important; } +.cm-s-duotone-dark .CodeMirror-gutters { background: #2a2734; border-right: 0px; } +.cm-s-duotone-dark .CodeMirror-linenumber { color: #545167; } + +/* begin cursor */ +.cm-s-duotone-dark .CodeMirror-cursor { border-left: 1px solid #ffad5c; /* border-left: 1px solid #ffad5c80; */ border-right: .5em solid #ffad5c; /* border-right: .5em solid #ffad5c80; */ opacity: .5; } +.cm-s-duotone-dark .CodeMirror-activeline-background { background: #363342; /* background: #36334280; */ opacity: .5;} +.cm-s-duotone-dark .cm-fat-cursor .CodeMirror-cursor { background: #ffad5c; /* background: #ffad5c80; */ opacity: .5;} +/* end cursor */ + +.cm-s-duotone-dark span.cm-atom, .cm-s-duotone-dark span.cm-number, .cm-s-duotone-dark span.cm-keyword, .cm-s-duotone-dark span.cm-variable, .cm-s-duotone-dark span.cm-attribute, .cm-s-duotone-dark span.cm-quote, .cm-s-duotone-dark span.cm-hr, .cm-s-duotone-dark span.cm-link { color: #ffcc99; } + +.cm-s-duotone-dark span.cm-property { color: #9a86fd; } +.cm-s-duotone-dark span.cm-punctuation, .cm-s-duotone-dark span.cm-unit, .cm-s-duotone-dark span.cm-negative { color: #e09142; } +.cm-s-duotone-dark span.cm-string { color: #ffb870; } +.cm-s-duotone-dark span.cm-operator { color: #ffad5c; } +.cm-s-duotone-dark span.cm-positive { color: #6a51e6; } + +.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-type, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; } +.cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; } +.cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; } + +/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ +.cm-s-duotone-dark span.cm-error, .cm-s-duotone-dark span.cm-invalidchar { color: #f00; } + +.cm-s-duotone-dark span.cm-header { font-weight: normal; } +.cm-s-duotone-dark .CodeMirror-matchingbracket { text-decoration: underline; color: #eeebff !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-light.css new file mode 100644 index 0000000000..d99480f7c4 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/duotone-light.css @@ -0,0 +1,36 @@ +/* +Name: DuoTone-Light +Author: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes) + +CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/) +*/ + +.cm-s-duotone-light.CodeMirror { background: #faf8f5; color: #b29762; } +.cm-s-duotone-light div.CodeMirror-selected { background: #e3dcce !important; } +.cm-s-duotone-light .CodeMirror-gutters { background: #faf8f5; border-right: 0px; } +.cm-s-duotone-light .CodeMirror-linenumber { color: #cdc4b1; } + +/* begin cursor */ +.cm-s-duotone-light .CodeMirror-cursor { border-left: 1px solid #93abdc; /* border-left: 1px solid #93abdc80; */ border-right: .5em solid #93abdc; /* border-right: .5em solid #93abdc80; */ opacity: .5; } +.cm-s-duotone-light .CodeMirror-activeline-background { background: #e3dcce; /* background: #e3dcce80; */ opacity: .5; } +.cm-s-duotone-light .cm-fat-cursor .CodeMirror-cursor { background: #93abdc; /* #93abdc80; */ opacity: .5; } +/* end cursor */ + +.cm-s-duotone-light span.cm-atom, .cm-s-duotone-light span.cm-number, .cm-s-duotone-light span.cm-keyword, .cm-s-duotone-light span.cm-variable, .cm-s-duotone-light span.cm-attribute, .cm-s-duotone-light span.cm-quote, .cm-s-duotone-light-light span.cm-hr, .cm-s-duotone-light-light span.cm-link { color: #063289; } + +.cm-s-duotone-light span.cm-property { color: #b29762; } +.cm-s-duotone-light span.cm-punctuation, .cm-s-duotone-light span.cm-unit, .cm-s-duotone-light span.cm-negative { color: #063289; } +.cm-s-duotone-light span.cm-string, .cm-s-duotone-light span.cm-operator { color: #1659df; } +.cm-s-duotone-light span.cm-positive { color: #896724; } + +.cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-type, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; } +.cm-s-duotone-light span.cm-def, .cm-s-duotone-light span.cm-tag, .cm-s-duotone-light span.cm-builtin, .cm-s-duotone-light span.cm-qualifier, .cm-s-duotone-light span.cm-header, .cm-s-duotone-light span.cm-em { color: #2d2006; } +.cm-s-duotone-light span.cm-bracket, .cm-s-duotone-light span.cm-comment { color: #b6ad9a; } + +/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ +/* .cm-s-duotone-light span.cm-error { background: #896724; color: #728fcb; } */ +.cm-s-duotone-light span.cm-error, .cm-s-duotone-light span.cm-invalidchar { color: #f00; } + +.cm-s-duotone-light span.cm-header { font-weight: normal; } +.cm-s-duotone-light .CodeMirror-matchingbracket { text-decoration: underline; color: #faf8f5 !important; } + diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/eclipse.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/eclipse.css new file mode 100644 index 0000000000..800d603f6d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/eclipse.css @@ -0,0 +1,23 @@ +.cm-s-eclipse span.cm-meta { color: #FF1717; } +.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } +.cm-s-eclipse span.cm-atom { color: #219; } +.cm-s-eclipse span.cm-number { color: #164; } +.cm-s-eclipse span.cm-def { color: #00f; } +.cm-s-eclipse span.cm-variable { color: black; } +.cm-s-eclipse span.cm-variable-2 { color: #0000C0; } +.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; } +.cm-s-eclipse span.cm-property { color: black; } +.cm-s-eclipse span.cm-operator { color: black; } +.cm-s-eclipse span.cm-comment { color: #3F7F5F; } +.cm-s-eclipse span.cm-string { color: #2A00FF; } +.cm-s-eclipse span.cm-string-2 { color: #f50; } +.cm-s-eclipse span.cm-qualifier { color: #555; } +.cm-s-eclipse span.cm-builtin { color: #30a; } +.cm-s-eclipse span.cm-bracket { color: #cc7; } +.cm-s-eclipse span.cm-tag { color: #170; } +.cm-s-eclipse span.cm-attribute { color: #00c; } +.cm-s-eclipse span.cm-link { color: #219; } +.cm-s-eclipse span.cm-error { color: #f00; } + +.cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/elegant.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/elegant.css new file mode 100644 index 0000000000..45b3ea655e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/elegant.css @@ -0,0 +1,13 @@ +.cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom { color: #762; } +.cm-s-elegant span.cm-comment { color: #262; font-style: italic; line-height: 1em; } +.cm-s-elegant span.cm-meta { color: #555; font-style: italic; line-height: 1em; } +.cm-s-elegant span.cm-variable { color: black; } +.cm-s-elegant span.cm-variable-2 { color: #b11; } +.cm-s-elegant span.cm-qualifier { color: #555; } +.cm-s-elegant span.cm-keyword { color: #730; } +.cm-s-elegant span.cm-builtin { color: #30a; } +.cm-s-elegant span.cm-link { color: #762; } +.cm-s-elegant span.cm-error { background-color: #fdd; } + +.cm-s-elegant .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-elegant .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/erlang-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/erlang-dark.css new file mode 100644 index 0000000000..8c8a4171a6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/erlang-dark.css @@ -0,0 +1,34 @@ +.cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } +.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539; } +.cm-s-erlang-dark .CodeMirror-line::selection, .cm-s-erlang-dark .CodeMirror-line > span::selection, .cm-s-erlang-dark .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-line::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; } +.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-erlang-dark span.cm-quote { color: #ccc; } +.cm-s-erlang-dark span.cm-atom { color: #f133f1; } +.cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } +.cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } +.cm-s-erlang-dark span.cm-builtin { color: #eaa; } +.cm-s-erlang-dark span.cm-comment { color: #77f; } +.cm-s-erlang-dark span.cm-def { color: #e7a; } +.cm-s-erlang-dark span.cm-keyword { color: #ffee80; } +.cm-s-erlang-dark span.cm-meta { color: #50fefe; } +.cm-s-erlang-dark span.cm-number { color: #ffd0d0; } +.cm-s-erlang-dark span.cm-operator { color: #d55; } +.cm-s-erlang-dark span.cm-property { color: #ccc; } +.cm-s-erlang-dark span.cm-qualifier { color: #ccc; } +.cm-s-erlang-dark span.cm-special { color: #ffbbbb; } +.cm-s-erlang-dark span.cm-string { color: #3ad900; } +.cm-s-erlang-dark span.cm-string-2 { color: #ccc; } +.cm-s-erlang-dark span.cm-tag { color: #9effff; } +.cm-s-erlang-dark span.cm-variable { color: #50fe50; } +.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } +.cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; } +.cm-s-erlang-dark span.cm-error { color: #9d1e15; } + +.cm-s-erlang-dark .CodeMirror-activeline-background { background: #013461; } +.cm-s-erlang-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/gruvbox-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/gruvbox-dark.css new file mode 100644 index 0000000000..d712dda08d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/gruvbox-dark.css @@ -0,0 +1,39 @@ +/* + + Name: gruvbox-dark + Author: kRkk (https://github.com/krkk) + + Original gruvbox color scheme by Pavel Pertsev (https://github.com/morhetz/gruvbox) + +*/ + +.cm-s-gruvbox-dark.CodeMirror, .cm-s-gruvbox-dark .CodeMirror-gutters { background-color: #282828; color: #bdae93; } +.cm-s-gruvbox-dark .CodeMirror-gutters {background: #282828; border-right: 0px;} +.cm-s-gruvbox-dark .CodeMirror-linenumber {color: #7c6f64;} +.cm-s-gruvbox-dark .CodeMirror-cursor { border-left: 1px solid #ebdbb2; } +.cm-s-gruvbox-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; } +.cm-s-gruvbox-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; } +.cm-s-gruvbox-dark div.CodeMirror-selected { background: #928374; } +.cm-s-gruvbox-dark span.cm-meta { color: #83a598; } + +.cm-s-gruvbox-dark span.cm-comment { color: #928374; } +.cm-s-gruvbox-dark span.cm-number, span.cm-atom { color: #d3869b; } +.cm-s-gruvbox-dark span.cm-keyword { color: #f84934; } + +.cm-s-gruvbox-dark span.cm-variable { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-variable-2 { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-variable-3, .cm-s-gruvbox-dark span.cm-type { color: #fabd2f; } +.cm-s-gruvbox-dark span.cm-operator { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-callee { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-def { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-property { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-string { color: #b8bb26; } +.cm-s-gruvbox-dark span.cm-string-2 { color: #8ec07c; } +.cm-s-gruvbox-dark span.cm-qualifier { color: #8ec07c; } +.cm-s-gruvbox-dark span.cm-attribute { color: #8ec07c; } + +.cm-s-gruvbox-dark .CodeMirror-activeline-background { background: #3c3836; } +.cm-s-gruvbox-dark .CodeMirror-matchingbracket { background: #928374; color:#282828 !important; } + +.cm-s-gruvbox-dark span.cm-builtin { color: #fe8019; } +.cm-s-gruvbox-dark span.cm-tag { color: #fe8019; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/hopscotch.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/hopscotch.css new file mode 100644 index 0000000000..7d05431bdc --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/hopscotch.css @@ -0,0 +1,34 @@ +/* + + Name: Hopscotch + Author: Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-hopscotch.CodeMirror {background: #322931; color: #d5d3d5;} +.cm-s-hopscotch div.CodeMirror-selected {background: #433b42 !important;} +.cm-s-hopscotch .CodeMirror-gutters {background: #322931; border-right: 0px;} +.cm-s-hopscotch .CodeMirror-linenumber {color: #797379;} +.cm-s-hopscotch .CodeMirror-cursor {border-left: 1px solid #989498 !important;} + +.cm-s-hopscotch span.cm-comment {color: #b33508;} +.cm-s-hopscotch span.cm-atom {color: #c85e7c;} +.cm-s-hopscotch span.cm-number {color: #c85e7c;} + +.cm-s-hopscotch span.cm-property, .cm-s-hopscotch span.cm-attribute {color: #8fc13e;} +.cm-s-hopscotch span.cm-keyword {color: #dd464c;} +.cm-s-hopscotch span.cm-string {color: #fdcc59;} + +.cm-s-hopscotch span.cm-variable {color: #8fc13e;} +.cm-s-hopscotch span.cm-variable-2 {color: #1290bf;} +.cm-s-hopscotch span.cm-def {color: #fd8b19;} +.cm-s-hopscotch span.cm-error {background: #dd464c; color: #989498;} +.cm-s-hopscotch span.cm-bracket {color: #d5d3d5;} +.cm-s-hopscotch span.cm-tag {color: #dd464c;} +.cm-s-hopscotch span.cm-link {color: #c85e7c;} + +.cm-s-hopscotch .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-hopscotch .CodeMirror-activeline-background { background: #302020; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/icecoder.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/icecoder.css new file mode 100644 index 0000000000..5440fbe27c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/icecoder.css @@ -0,0 +1,43 @@ +/* +ICEcoder default theme by Matt Pass, used in code editor available at https://icecoder.net +*/ + +.cm-s-icecoder { color: #666; background: #1d1d1b; } + +.cm-s-icecoder span.cm-keyword { color: #eee; font-weight:bold; } /* off-white 1 */ +.cm-s-icecoder span.cm-atom { color: #e1c76e; } /* yellow */ +.cm-s-icecoder span.cm-number { color: #6cb5d9; } /* blue */ +.cm-s-icecoder span.cm-def { color: #b9ca4a; } /* green */ + +.cm-s-icecoder span.cm-variable { color: #6cb5d9; } /* blue */ +.cm-s-icecoder span.cm-variable-2 { color: #cc1e5c; } /* pink */ +.cm-s-icecoder span.cm-variable-3, .cm-s-icecoder span.cm-type { color: #f9602c; } /* orange */ + +.cm-s-icecoder span.cm-property { color: #eee; } /* off-white 1 */ +.cm-s-icecoder span.cm-operator { color: #9179bb; } /* purple */ +.cm-s-icecoder span.cm-comment { color: #97a3aa; } /* grey-blue */ + +.cm-s-icecoder span.cm-string { color: #b9ca4a; } /* green */ +.cm-s-icecoder span.cm-string-2 { color: #6cb5d9; } /* blue */ + +.cm-s-icecoder span.cm-meta { color: #555; } /* grey */ + +.cm-s-icecoder span.cm-qualifier { color: #555; } /* grey */ +.cm-s-icecoder span.cm-builtin { color: #214e7b; } /* bright blue */ +.cm-s-icecoder span.cm-bracket { color: #cc7; } /* grey-yellow */ + +.cm-s-icecoder span.cm-tag { color: #e8e8e8; } /* off-white 2 */ +.cm-s-icecoder span.cm-attribute { color: #099; } /* teal */ + +.cm-s-icecoder span.cm-header { color: #6a0d6a; } /* purple-pink */ +.cm-s-icecoder span.cm-quote { color: #186718; } /* dark green */ +.cm-s-icecoder span.cm-hr { color: #888; } /* mid-grey */ +.cm-s-icecoder span.cm-link { color: #e1c76e; } /* yellow */ +.cm-s-icecoder span.cm-error { color: #d00; } /* red */ + +.cm-s-icecoder .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-icecoder div.CodeMirror-selected { color: #fff; background: #037; } +.cm-s-icecoder .CodeMirror-gutters { background: #1d1d1b; min-width: 41px; border-right: 0; } +.cm-s-icecoder .CodeMirror-linenumber { color: #555; cursor: default; } +.cm-s-icecoder .CodeMirror-matchingbracket { color: #fff !important; background: #555 !important; } +.cm-s-icecoder .CodeMirror-activeline-background { background: #000; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/idea.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/idea.css new file mode 100644 index 0000000000..eab36717ad --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/idea.css @@ -0,0 +1,42 @@ +/** + Name: IDEA default theme + From IntelliJ IDEA by JetBrains + */ + +.cm-s-idea span.cm-meta { color: #808000; } +.cm-s-idea span.cm-number { color: #0000FF; } +.cm-s-idea span.cm-keyword { line-height: 1em; font-weight: bold; color: #000080; } +.cm-s-idea span.cm-atom { font-weight: bold; color: #000080; } +.cm-s-idea span.cm-def { color: #000000; } +.cm-s-idea span.cm-variable { color: black; } +.cm-s-idea span.cm-variable-2 { color: black; } +.cm-s-idea span.cm-variable-3, .cm-s-idea span.cm-type { color: black; } +.cm-s-idea span.cm-property { color: black; } +.cm-s-idea span.cm-operator { color: black; } +.cm-s-idea span.cm-comment { color: #808080; } +.cm-s-idea span.cm-string { color: #008000; } +.cm-s-idea span.cm-string-2 { color: #008000; } +.cm-s-idea span.cm-qualifier { color: #555; } +.cm-s-idea span.cm-error { color: #FF0000; } +.cm-s-idea span.cm-attribute { color: #0000FF; } +.cm-s-idea span.cm-tag { color: #000080; } +.cm-s-idea span.cm-link { color: #0000FF; } +.cm-s-idea .CodeMirror-activeline-background { background: #FFFAE3; } + +.cm-s-idea span.cm-builtin { color: #30a; } +.cm-s-idea span.cm-bracket { color: #cc7; } +.cm-s-idea { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;} + + +.cm-s-idea .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } + +.CodeMirror-hints.idea { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; + color: #616569; + background-color: #ebf3fd !important; +} + +.CodeMirror-hints.idea .CodeMirror-hint-active { + background-color: #a2b8c9 !important; + color: #5c6065 !important; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/isotope.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/isotope.css new file mode 100644 index 0000000000..d0d6263cf4 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/isotope.css @@ -0,0 +1,34 @@ +/* + + Name: Isotope + Author: David Desandro / Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-isotope.CodeMirror {background: #000000; color: #e0e0e0;} +.cm-s-isotope div.CodeMirror-selected {background: #404040 !important;} +.cm-s-isotope .CodeMirror-gutters {background: #000000; border-right: 0px;} +.cm-s-isotope .CodeMirror-linenumber {color: #808080;} +.cm-s-isotope .CodeMirror-cursor {border-left: 1px solid #c0c0c0 !important;} + +.cm-s-isotope span.cm-comment {color: #3300ff;} +.cm-s-isotope span.cm-atom {color: #cc00ff;} +.cm-s-isotope span.cm-number {color: #cc00ff;} + +.cm-s-isotope span.cm-property, .cm-s-isotope span.cm-attribute {color: #33ff00;} +.cm-s-isotope span.cm-keyword {color: #ff0000;} +.cm-s-isotope span.cm-string {color: #ff0099;} + +.cm-s-isotope span.cm-variable {color: #33ff00;} +.cm-s-isotope span.cm-variable-2 {color: #0066ff;} +.cm-s-isotope span.cm-def {color: #ff9900;} +.cm-s-isotope span.cm-error {background: #ff0000; color: #c0c0c0;} +.cm-s-isotope span.cm-bracket {color: #e0e0e0;} +.cm-s-isotope span.cm-tag {color: #ff0000;} +.cm-s-isotope span.cm-link {color: #cc00ff;} + +.cm-s-isotope .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-isotope .CodeMirror-activeline-background { background: #202020; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/juejin.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/juejin.css new file mode 100644 index 0000000000..38cf7fe373 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/juejin.css @@ -0,0 +1,30 @@ +.cm-s-juejin.CodeMirror { + background: #f8f9fa; +} +.cm-s-juejin .cm-header, +.cm-s-juejin .cm-def { + color: #1ba2f0; +} +.cm-s-juejin .cm-comment { + color: #009e9d; +} +.cm-s-juejin .cm-quote, +.cm-s-juejin .cm-link, +.cm-s-juejin .cm-strong, +.cm-s-juejin .cm-attribute { + color: #fd7741; +} +.cm-s-juejin .cm-url, +.cm-s-juejin .cm-keyword, +.cm-s-juejin .cm-builtin { + color: #bb51b8; +} +.cm-s-juejin .cm-hr { + color: #909090; +} +.cm-s-juejin .cm-tag { + color: #107000; +} +.cm-s-juejin .cm-variable-2 { + color: #0050a0; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lesser-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lesser-dark.css new file mode 100644 index 0000000000..f96bf430c2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lesser-dark.css @@ -0,0 +1,47 @@ +/* +http://lesscss.org/ dark theme +Ported to CodeMirror by Peter Kroon +*/ +.cm-s-lesser-dark { + line-height: 1.3em; +} +.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } +.cm-s-lesser-dark div.CodeMirror-selected { background: #45443B; } /* 33322B*/ +.cm-s-lesser-dark .CodeMirror-line::selection, .cm-s-lesser-dark .CodeMirror-line > span::selection, .cm-s-lesser-dark .CodeMirror-line > span > span::selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark .CodeMirror-line::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ + +.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ + +.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } +.cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; } +.cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } + +.cm-s-lesser-dark span.cm-header { color: #a0a; } +.cm-s-lesser-dark span.cm-quote { color: #090; } +.cm-s-lesser-dark span.cm-keyword { color: #599eff; } +.cm-s-lesser-dark span.cm-atom { color: #C2B470; } +.cm-s-lesser-dark span.cm-number { color: #B35E4D; } +.cm-s-lesser-dark span.cm-def { color: white; } +.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } +.cm-s-lesser-dark span.cm-variable-2 { color: #669199; } +.cm-s-lesser-dark span.cm-variable-3, .cm-s-lesser-dark span.cm-type { color: white; } +.cm-s-lesser-dark span.cm-property { color: #92A75C; } +.cm-s-lesser-dark span.cm-operator { color: #92A75C; } +.cm-s-lesser-dark span.cm-comment { color: #666; } +.cm-s-lesser-dark span.cm-string { color: #BCD279; } +.cm-s-lesser-dark span.cm-string-2 { color: #f50; } +.cm-s-lesser-dark span.cm-meta { color: #738C73; } +.cm-s-lesser-dark span.cm-qualifier { color: #555; } +.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } +.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } +.cm-s-lesser-dark span.cm-tag { color: #669199; } +.cm-s-lesser-dark span.cm-attribute { color: #81a4d5; } +.cm-s-lesser-dark span.cm-hr { color: #999; } +.cm-s-lesser-dark span.cm-link { color: #7070E6; } +.cm-s-lesser-dark span.cm-error { color: #9d1e15; } + +.cm-s-lesser-dark .CodeMirror-activeline-background { background: #3C3A3A; } +.cm-s-lesser-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/liquibyte.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/liquibyte.css new file mode 100644 index 0000000000..393825e029 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/liquibyte.css @@ -0,0 +1,95 @@ +.cm-s-liquibyte.CodeMirror { + background-color: #000; + color: #fff; + line-height: 1.2em; + font-size: 1em; +} +.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight { + text-decoration: underline; + text-decoration-color: #0f0; + text-decoration-style: wavy; +} +.cm-s-liquibyte .cm-trailingspace { + text-decoration: line-through; + text-decoration-color: #f00; + text-decoration-style: dotted; +} +.cm-s-liquibyte .cm-tab { + text-decoration: line-through; + text-decoration-color: #404040; + text-decoration-style: dotted; +} +.cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; } +.cm-s-liquibyte .CodeMirror-gutter-elt div { font-size: 1.2em; } +.cm-s-liquibyte .CodeMirror-guttermarker { } +.cm-s-liquibyte .CodeMirror-guttermarker-subtle { } +.cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0; } +.cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee; } + +.cm-s-liquibyte span.cm-comment { color: #008000; } +.cm-s-liquibyte span.cm-def { color: #ffaf40; font-weight: bold; } +.cm-s-liquibyte span.cm-keyword { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-builtin { color: #ffaf40; font-weight: bold; } +.cm-s-liquibyte span.cm-variable { color: #5967ff; font-weight: bold; } +.cm-s-liquibyte span.cm-string { color: #ff8000; } +.cm-s-liquibyte span.cm-number { color: #0f0; font-weight: bold; } +.cm-s-liquibyte span.cm-atom { color: #bf3030; font-weight: bold; } + +.cm-s-liquibyte span.cm-variable-2 { color: #007f7f; font-weight: bold; } +.cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-property { color: #999; font-weight: bold; } +.cm-s-liquibyte span.cm-operator { color: #fff; } + +.cm-s-liquibyte span.cm-meta { color: #0f0; } +.cm-s-liquibyte span.cm-qualifier { color: #fff700; font-weight: bold; } +.cm-s-liquibyte span.cm-bracket { color: #cc7; } +.cm-s-liquibyte span.cm-tag { color: #ff0; font-weight: bold; } +.cm-s-liquibyte span.cm-attribute { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-error { color: #f00; } + +.cm-s-liquibyte div.CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25); } + +.cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); } + +.cm-s-liquibyte .CodeMirror-activeline-background { background-color: rgba(0, 255, 0, 0.15); } + +/* Default styles for common addons */ +.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; } +.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; } +.CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); } +/* Scrollbars */ +/* Simple */ +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover { + background-color: rgba(80, 80, 80, .7); +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div { + background-color: rgba(80, 80, 80, .3); + border: 1px solid #404040; + border-radius: 5px; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div { + border-top: 1px solid #404040; + border-bottom: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div { + border-left: 1px solid #404040; + border-right: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-vertical { + background-color: #262626; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal { + background-color: #262626; + border-top: 1px solid #404040; +} +/* Overlay */ +.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div { + background-color: #404040; + border-radius: 5px; +} +.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div { + border: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div { + border: 1px solid #404040; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lucario.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lucario.css new file mode 100644 index 0000000000..17a1551032 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/lucario.css @@ -0,0 +1,37 @@ +/* + Name: lucario + Author: Raphael Amorim + + Original Lucario color scheme (https://github.com/raphamorim/lucario) +*/ + +.cm-s-lucario.CodeMirror, .cm-s-lucario .CodeMirror-gutters { + background-color: #2b3e50 !important; + color: #f8f8f2 !important; + border: none; +} +.cm-s-lucario .CodeMirror-gutters { color: #2b3e50; } +.cm-s-lucario .CodeMirror-cursor { border-left: solid thin #E6C845; } +.cm-s-lucario .CodeMirror-linenumber { color: #f8f8f2; } +.cm-s-lucario .CodeMirror-selected { background: #243443; } +.cm-s-lucario .CodeMirror-line::selection, .cm-s-lucario .CodeMirror-line > span::selection, .cm-s-lucario .CodeMirror-line > span > span::selection { background: #243443; } +.cm-s-lucario .CodeMirror-line::-moz-selection, .cm-s-lucario .CodeMirror-line > span::-moz-selection, .cm-s-lucario .CodeMirror-line > span > span::-moz-selection { background: #243443; } +.cm-s-lucario span.cm-comment { color: #5c98cd; } +.cm-s-lucario span.cm-string, .cm-s-lucario span.cm-string-2 { color: #E6DB74; } +.cm-s-lucario span.cm-number { color: #ca94ff; } +.cm-s-lucario span.cm-variable { color: #f8f8f2; } +.cm-s-lucario span.cm-variable-2 { color: #f8f8f2; } +.cm-s-lucario span.cm-def { color: #72C05D; } +.cm-s-lucario span.cm-operator { color: #66D9EF; } +.cm-s-lucario span.cm-keyword { color: #ff6541; } +.cm-s-lucario span.cm-atom { color: #bd93f9; } +.cm-s-lucario span.cm-meta { color: #f8f8f2; } +.cm-s-lucario span.cm-tag { color: #ff6541; } +.cm-s-lucario span.cm-attribute { color: #66D9EF; } +.cm-s-lucario span.cm-qualifier { color: #72C05D; } +.cm-s-lucario span.cm-property { color: #f8f8f2; } +.cm-s-lucario span.cm-builtin { color: #72C05D; } +.cm-s-lucario span.cm-variable-3, .cm-s-lucario span.cm-type { color: #ffb86c; } + +.cm-s-lucario .CodeMirror-activeline-background { background: #243443; } +.cm-s-lucario .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-darker.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-darker.css new file mode 100644 index 0000000000..45b64efb25 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-darker.css @@ -0,0 +1,135 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-darker.CodeMirror { + background-color: #212121; + color: #EEFFFF; +} + +.cm-s-material-darker .CodeMirror-gutters { + background: #212121; + color: #545454; + border: none; +} + +.cm-s-material-darker .CodeMirror-guttermarker, +.cm-s-material-darker .CodeMirror-guttermarker-subtle, +.cm-s-material-darker .CodeMirror-linenumber { + color: #545454; +} + +.cm-s-material-darker .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} + +.cm-s-material-darker div.CodeMirror-selected { + background: rgba(97, 97, 97, 0.2); +} + +.cm-s-material-darker.CodeMirror-focused div.CodeMirror-selected { + background: rgba(97, 97, 97, 0.2); +} + +.cm-s-material-darker .CodeMirror-line::selection, +.cm-s-material-darker .CodeMirror-line>span::selection, +.cm-s-material-darker .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-darker .CodeMirror-line::-moz-selection, +.cm-s-material-darker .CodeMirror-line>span::-moz-selection, +.cm-s-material-darker .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-darker .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-darker .cm-keyword { + color: #C792EA; +} + +.cm-s-material-darker .cm-operator { + color: #89DDFF; +} + +.cm-s-material-darker .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-darker .cm-variable-3, +.cm-s-material-darker .cm-type { + color: #f07178; +} + +.cm-s-material-darker .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-darker .cm-atom { + color: #F78C6C; +} + +.cm-s-material-darker .cm-number { + color: #FF5370; +} + +.cm-s-material-darker .cm-def { + color: #82AAFF; +} + +.cm-s-material-darker .cm-string { + color: #C3E88D; +} + +.cm-s-material-darker .cm-string-2 { + color: #f07178; +} + +.cm-s-material-darker .cm-comment { + color: #545454; +} + +.cm-s-material-darker .cm-variable { + color: #f07178; +} + +.cm-s-material-darker .cm-tag { + color: #FF5370; +} + +.cm-s-material-darker .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-darker .cm-attribute { + color: #C792EA; +} + +.cm-s-material-darker .cm-property { + color: #C792EA; +} + +.cm-s-material-darker .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-darker .cm-variable-3, +.cm-s-material-darker .cm-type { + color: #DECB6B; +} + + +.cm-s-material-darker .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-darker .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-ocean.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-ocean.css new file mode 100644 index 0000000000..404178de22 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-ocean.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-ocean.CodeMirror { + background-color: #0F111A; + color: #8F93A2; +} + +.cm-s-material-ocean .CodeMirror-gutters { + background: #0F111A; + color: #464B5D; + border: none; +} + +.cm-s-material-ocean .CodeMirror-guttermarker, +.cm-s-material-ocean .CodeMirror-guttermarker-subtle, +.cm-s-material-ocean .CodeMirror-linenumber { + color: #464B5D; +} + +.cm-s-material-ocean .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material-ocean.cm-fat-cursor .CodeMirror-cursor { + background-color: #a2a8a175 !important; +} +.cm-s-material-ocean .cm-animate-fat-cursor { + background-color: #a2a8a175 !important; +} + +.cm-s-material-ocean div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-ocean.CodeMirror-focused div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-ocean .CodeMirror-line::selection, +.cm-s-material-ocean .CodeMirror-line>span::selection, +.cm-s-material-ocean .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-ocean .CodeMirror-line::-moz-selection, +.cm-s-material-ocean .CodeMirror-line>span::-moz-selection, +.cm-s-material-ocean .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-ocean .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-ocean .cm-keyword { + color: #C792EA; +} + +.cm-s-material-ocean .cm-operator { + color: #89DDFF; +} + +.cm-s-material-ocean .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-ocean .cm-variable-3, +.cm-s-material-ocean .cm-type { + color: #f07178; +} + +.cm-s-material-ocean .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-ocean .cm-atom { + color: #F78C6C; +} + +.cm-s-material-ocean .cm-number { + color: #FF5370; +} + +.cm-s-material-ocean .cm-def { + color: #82AAFF; +} + +.cm-s-material-ocean .cm-string { + color: #C3E88D; +} + +.cm-s-material-ocean .cm-string-2 { + color: #f07178; +} + +.cm-s-material-ocean .cm-comment { + color: #464B5D; +} + +.cm-s-material-ocean .cm-variable { + color: #f07178; +} + +.cm-s-material-ocean .cm-tag { + color: #FF5370; +} + +.cm-s-material-ocean .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-ocean .cm-attribute { + color: #C792EA; +} + +.cm-s-material-ocean .cm-property { + color: #C792EA; +} + +.cm-s-material-ocean .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-ocean .cm-variable-3, +.cm-s-material-ocean .cm-type { + color: #DECB6B; +} + + +.cm-s-material-ocean .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-ocean .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-palenight.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-palenight.css new file mode 100644 index 0000000000..6712c43a0e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material-palenight.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-palenight.CodeMirror { + background-color: #292D3E; + color: #A6ACCD; +} + +.cm-s-material-palenight .CodeMirror-gutters { + background: #292D3E; + color: #676E95; + border: none; +} + +.cm-s-material-palenight .CodeMirror-guttermarker, +.cm-s-material-palenight .CodeMirror-guttermarker-subtle, +.cm-s-material-palenight .CodeMirror-linenumber { + color: #676E95; +} + +.cm-s-material-palenight .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material-palenight.cm-fat-cursor .CodeMirror-cursor { + background-color: #607c8b80 !important; +} +.cm-s-material-palenight .cm-animate-fat-cursor { + background-color: #607c8b80 !important; +} + +.cm-s-material-palenight div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-palenight.CodeMirror-focused div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-palenight .CodeMirror-line::selection, +.cm-s-material-palenight .CodeMirror-line>span::selection, +.cm-s-material-palenight .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-palenight .CodeMirror-line::-moz-selection, +.cm-s-material-palenight .CodeMirror-line>span::-moz-selection, +.cm-s-material-palenight .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-palenight .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-palenight .cm-keyword { + color: #C792EA; +} + +.cm-s-material-palenight .cm-operator { + color: #89DDFF; +} + +.cm-s-material-palenight .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-palenight .cm-variable-3, +.cm-s-material-palenight .cm-type { + color: #f07178; +} + +.cm-s-material-palenight .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-palenight .cm-atom { + color: #F78C6C; +} + +.cm-s-material-palenight .cm-number { + color: #FF5370; +} + +.cm-s-material-palenight .cm-def { + color: #82AAFF; +} + +.cm-s-material-palenight .cm-string { + color: #C3E88D; +} + +.cm-s-material-palenight .cm-string-2 { + color: #f07178; +} + +.cm-s-material-palenight .cm-comment { + color: #676E95; +} + +.cm-s-material-palenight .cm-variable { + color: #f07178; +} + +.cm-s-material-palenight .cm-tag { + color: #FF5370; +} + +.cm-s-material-palenight .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-palenight .cm-attribute { + color: #C792EA; +} + +.cm-s-material-palenight .cm-property { + color: #C792EA; +} + +.cm-s-material-palenight .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-palenight .cm-variable-3, +.cm-s-material-palenight .cm-type { + color: #DECB6B; +} + + +.cm-s-material-palenight .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-palenight .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material.css new file mode 100644 index 0000000000..a7848499a7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/material.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material.CodeMirror { + background-color: #263238; + color: #EEFFFF; +} + +.cm-s-material .CodeMirror-gutters { + background: #263238; + color: #546E7A; + border: none; +} + +.cm-s-material .CodeMirror-guttermarker, +.cm-s-material .CodeMirror-guttermarker-subtle, +.cm-s-material .CodeMirror-linenumber { + color: #546E7A; +} + +.cm-s-material .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material.cm-fat-cursor .CodeMirror-cursor { + background-color: #5d6d5c80 !important; +} +.cm-s-material .cm-animate-fat-cursor { + background-color: #5d6d5c80 !important; +} + +.cm-s-material div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material.CodeMirror-focused div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-line::selection, +.cm-s-material .CodeMirror-line>span::selection, +.cm-s-material .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-line::-moz-selection, +.cm-s-material .CodeMirror-line>span::-moz-selection, +.cm-s-material .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material .cm-keyword { + color: #C792EA; +} + +.cm-s-material .cm-operator { + color: #89DDFF; +} + +.cm-s-material .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material .cm-variable-3, +.cm-s-material .cm-type { + color: #f07178; +} + +.cm-s-material .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material .cm-atom { + color: #F78C6C; +} + +.cm-s-material .cm-number { + color: #FF5370; +} + +.cm-s-material .cm-def { + color: #82AAFF; +} + +.cm-s-material .cm-string { + color: #C3E88D; +} + +.cm-s-material .cm-string-2 { + color: #f07178; +} + +.cm-s-material .cm-comment { + color: #546E7A; +} + +.cm-s-material .cm-variable { + color: #f07178; +} + +.cm-s-material .cm-tag { + color: #FF5370; +} + +.cm-s-material .cm-meta { + color: #FFCB6B; +} + +.cm-s-material .cm-attribute { + color: #C792EA; +} + +.cm-s-material .cm-property { + color: #C792EA; +} + +.cm-s-material .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material .cm-variable-3, +.cm-s-material .cm-type { + color: #DECB6B; +} + + +.cm-s-material .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mbo.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mbo.css new file mode 100644 index 0000000000..e164fcf42a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mbo.css @@ -0,0 +1,37 @@ +/****************************************************************/ +/* Based on mbonaci's Brackets mbo theme */ +/* https://github.com/mbonaci/global/blob/master/Mbo.tmTheme */ +/* Create your own: http://tmtheme-editor.herokuapp.com */ +/****************************************************************/ + +.cm-s-mbo.CodeMirror { background: #2c2c2c; color: #ffffec; } +.cm-s-mbo div.CodeMirror-selected { background: #716C62; } +.cm-s-mbo .CodeMirror-line::selection, .cm-s-mbo .CodeMirror-line > span::selection, .cm-s-mbo .CodeMirror-line > span > span::selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo .CodeMirror-line::-moz-selection, .cm-s-mbo .CodeMirror-line > span::-moz-selection, .cm-s-mbo .CodeMirror-line > span > span::-moz-selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo .CodeMirror-gutters { background: #4e4e4e; border-right: 0px; } +.cm-s-mbo .CodeMirror-guttermarker { color: white; } +.cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; } +.cm-s-mbo .CodeMirror-linenumber { color: #dadada; } +.cm-s-mbo .CodeMirror-cursor { border-left: 1px solid #ffffec; } + +.cm-s-mbo span.cm-comment { color: #95958a; } +.cm-s-mbo span.cm-atom { color: #00a8c6; } +.cm-s-mbo span.cm-number { color: #00a8c6; } + +.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute { color: #9ddfe9; } +.cm-s-mbo span.cm-keyword { color: #ffb928; } +.cm-s-mbo span.cm-string { color: #ffcf6c; } +.cm-s-mbo span.cm-string.cm-property { color: #ffffec; } + +.cm-s-mbo span.cm-variable { color: #ffffec; } +.cm-s-mbo span.cm-variable-2 { color: #00a8c6; } +.cm-s-mbo span.cm-def { color: #ffffec; } +.cm-s-mbo span.cm-bracket { color: #fffffc; font-weight: bold; } +.cm-s-mbo span.cm-tag { color: #9ddfe9; } +.cm-s-mbo span.cm-link { color: #f54b07; } +.cm-s-mbo span.cm-error { border-bottom: #636363; color: #ffffec; } +.cm-s-mbo span.cm-qualifier { color: #ffffec; } + +.cm-s-mbo .CodeMirror-activeline-background { background: #494b41; } +.cm-s-mbo .CodeMirror-matchingbracket { color: #ffb928 !important; } +.cm-s-mbo .CodeMirror-matchingtag { background: rgba(255, 255, 255, .37); } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mdn-like.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mdn-like.css new file mode 100644 index 0000000000..622ed3efb7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/mdn-like.css @@ -0,0 +1,46 @@ +/* + MDN-LIKE Theme - Mozilla + Ported to CodeMirror by Peter Kroon + Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues + GitHub: @peterkroon + + The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation + +*/ +.cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; } +.cm-s-mdn-like div.CodeMirror-selected { background: #cfc; } +.cm-s-mdn-like .CodeMirror-line::selection, .cm-s-mdn-like .CodeMirror-line > span::selection, .cm-s-mdn-like .CodeMirror-line > span > span::selection { background: #cfc; } +.cm-s-mdn-like .CodeMirror-line::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span > span::-moz-selection { background: #cfc; } + +.cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; } +.cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; padding-left: 8px; } +.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; } + +.cm-s-mdn-like .cm-keyword { color: #6262FF; } +.cm-s-mdn-like .cm-atom { color: #F90; } +.cm-s-mdn-like .cm-number { color: #ca7841; } +.cm-s-mdn-like .cm-def { color: #8DA6CE; } +.cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } +.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def, .cm-s-mdn-like span.cm-type { color: #07a; } + +.cm-s-mdn-like .cm-variable { color: #07a; } +.cm-s-mdn-like .cm-property { color: #905; } +.cm-s-mdn-like .cm-qualifier { color: #690; } + +.cm-s-mdn-like .cm-operator { color: #cda869; } +.cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; } +.cm-s-mdn-like .cm-string { color:#07a; font-style:italic; } +.cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/ +.cm-s-mdn-like .cm-meta { color: #000; } /*?*/ +.cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/ +.cm-s-mdn-like .cm-tag { color: #997643; } +.cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-mdn-like .cm-header { color: #FF6400; } +.cm-s-mdn-like .cm-hr { color: #AEAEAE; } +.cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } +.cm-s-mdn-like .cm-error { border-bottom: 1px solid red; } + +div.cm-s-mdn-like .CodeMirror-activeline-background { background: #efefff; } +div.cm-s-mdn-like span.CodeMirror-matchingbracket { outline:1px solid grey; color: inherit; } + +.cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,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); } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/midnight.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/midnight.css new file mode 100644 index 0000000000..fc26474a4a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/midnight.css @@ -0,0 +1,39 @@ +/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */ + +/**/ +.cm-s-midnight .CodeMirror-activeline-background { background: #253540; } + +.cm-s-midnight.CodeMirror { + background: #0F192A; + color: #D1EDFF; +} + +.cm-s-midnight div.CodeMirror-selected { background: #314D67; } +.cm-s-midnight .CodeMirror-line::selection, .cm-s-midnight .CodeMirror-line > span::selection, .cm-s-midnight .CodeMirror-line > span > span::selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight .CodeMirror-line::-moz-selection, .cm-s-midnight .CodeMirror-line > span::-moz-selection, .cm-s-midnight .CodeMirror-line > span > span::-moz-selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight .CodeMirror-gutters { background: #0F192A; border-right: 1px solid; } +.cm-s-midnight .CodeMirror-guttermarker { color: white; } +.cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-midnight .CodeMirror-linenumber { color: #D0D0D0; } +.cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0; } + +.cm-s-midnight span.cm-comment { color: #428BDD; } +.cm-s-midnight span.cm-atom { color: #AE81FF; } +.cm-s-midnight span.cm-number { color: #D1EDFF; } + +.cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute { color: #A6E22E; } +.cm-s-midnight span.cm-keyword { color: #E83737; } +.cm-s-midnight span.cm-string { color: #1DC116; } + +.cm-s-midnight span.cm-variable { color: #FFAA3E; } +.cm-s-midnight span.cm-variable-2 { color: #FFAA3E; } +.cm-s-midnight span.cm-def { color: #4DD; } +.cm-s-midnight span.cm-bracket { color: #D1EDFF; } +.cm-s-midnight span.cm-tag { color: #449; } +.cm-s-midnight span.cm-link { color: #AE81FF; } +.cm-s-midnight span.cm-error { background: #F92672; color: #F8F8F0; } + +.cm-s-midnight .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/monokai.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/monokai.css new file mode 100644 index 0000000000..cd4cd55720 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/monokai.css @@ -0,0 +1,41 @@ +/* Based on Sublime Text's Monokai theme */ + +.cm-s-monokai.CodeMirror { background: #272822; color: #f8f8f2; } +.cm-s-monokai div.CodeMirror-selected { background: #49483E; } +.cm-s-monokai .CodeMirror-line::selection, .cm-s-monokai .CodeMirror-line > span::selection, .cm-s-monokai .CodeMirror-line > span > span::selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai .CodeMirror-line::-moz-selection, .cm-s-monokai .CodeMirror-line > span::-moz-selection, .cm-s-monokai .CodeMirror-line > span > span::-moz-selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai .CodeMirror-gutters { background: #272822; border-right: 0px; } +.cm-s-monokai .CodeMirror-guttermarker { color: white; } +.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-monokai .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-monokai .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } + +.cm-s-monokai span.cm-comment { color: #75715e; } +.cm-s-monokai span.cm-atom { color: #ae81ff; } +.cm-s-monokai span.cm-number { color: #ae81ff; } + +.cm-s-monokai span.cm-comment.cm-attribute { color: #97b757; } +.cm-s-monokai span.cm-comment.cm-def { color: #bc9262; } +.cm-s-monokai span.cm-comment.cm-tag { color: #bc6283; } +.cm-s-monokai span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute { color: #a6e22e; } +.cm-s-monokai span.cm-keyword { color: #f92672; } +.cm-s-monokai span.cm-builtin { color: #66d9ef; } +.cm-s-monokai span.cm-string { color: #e6db74; } + +.cm-s-monokai span.cm-variable { color: #f8f8f2; } +.cm-s-monokai span.cm-variable-2 { color: #9effff; } +.cm-s-monokai span.cm-variable-3, .cm-s-monokai span.cm-type { color: #66d9ef; } +.cm-s-monokai span.cm-def { color: #fd971f; } +.cm-s-monokai span.cm-bracket { color: #f8f8f2; } +.cm-s-monokai span.cm-tag { color: #f92672; } +.cm-s-monokai span.cm-header { color: #ae81ff; } +.cm-s-monokai span.cm-link { color: #ae81ff; } +.cm-s-monokai span.cm-error { background: #f92672; color: #f8f8f0; } + +.cm-s-monokai .CodeMirror-activeline-background { background: #373831; } +.cm-s-monokai .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/moxer.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/moxer.css new file mode 100644 index 0000000000..b3ca35e385 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/moxer.css @@ -0,0 +1,143 @@ +/* + Name: Moxer Theme + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://github.com/moxer-theme/moxer-code +*/ + +.cm-s-moxer.CodeMirror { + background-color: #090A0F; + color: #8E95B4; + line-height: 1.8; +} + +.cm-s-moxer .CodeMirror-gutters { + background: #090A0F; + color: #35394B; + border: none; +} + +.cm-s-moxer .CodeMirror-guttermarker, +.cm-s-moxer .CodeMirror-guttermarker-subtle, +.cm-s-moxer .CodeMirror-linenumber { + color: #35394B; +} + + +.cm-s-moxer .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} + +.cm-s-moxer div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-moxer.CodeMirror-focused div.CodeMirror-selected { + background: #212431; +} + +.cm-s-moxer .CodeMirror-line::selection, +.cm-s-moxer .CodeMirror-line>span::selection, +.cm-s-moxer .CodeMirror-line>span>span::selection { + background: #212431; +} + +.cm-s-moxer .CodeMirror-line::-moz-selection, +.cm-s-moxer .CodeMirror-line>span::-moz-selection, +.cm-s-moxer .CodeMirror-line>span>span::-moz-selection { + background: #212431; +} + +.cm-s-moxer .CodeMirror-activeline-background, +.cm-s-moxer .CodeMirror-activeline-gutter .CodeMirror-linenumber { + background: rgba(33, 36, 49, 0.5); +} + +.cm-s-moxer .cm-keyword { + color: #D46C6C; +} + +.cm-s-moxer .cm-operator { + color: #D46C6C; +} + +.cm-s-moxer .cm-variable-2 { + color: #81C5DA; +} + + +.cm-s-moxer .cm-variable-3, +.cm-s-moxer .cm-type { + color: #f07178; +} + +.cm-s-moxer .cm-builtin { + color: #FFCB6B; +} + +.cm-s-moxer .cm-atom { + color: #A99BE2; +} + +.cm-s-moxer .cm-number { + color: #7CA4C0; +} + +.cm-s-moxer .cm-def { + color: #F5DFA5; +} + +.cm-s-moxer .CodeMirror-line .cm-def ~ .cm-def { + color: #81C5DA; +} + +.cm-s-moxer .cm-string { + color: #B2E4AE; +} + +.cm-s-moxer .cm-string-2 { + color: #f07178; +} + +.cm-s-moxer .cm-comment { + color: #3F445A; +} + +.cm-s-moxer .cm-variable { + color: #8E95B4; +} + +.cm-s-moxer .cm-tag { + color: #FF5370; +} + +.cm-s-moxer .cm-meta { + color: #FFCB6B; +} + +.cm-s-moxer .cm-attribute { + color: #C792EA; +} + +.cm-s-moxer .cm-property { + color: #81C5DA; +} + +.cm-s-moxer .cm-qualifier { + color: #DECB6B; +} + +.cm-s-moxer .cm-variable-3, +.cm-s-moxer .cm-type { + color: #DECB6B; +} + + +.cm-s-moxer .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-moxer .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neat.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neat.css new file mode 100644 index 0000000000..4267b1a37d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neat.css @@ -0,0 +1,12 @@ +.cm-s-neat span.cm-comment { color: #a86; } +.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } +.cm-s-neat span.cm-string { color: #a22; } +.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } +.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } +.cm-s-neat span.cm-variable { color: black; } +.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } +.cm-s-neat span.cm-meta { color: #555; } +.cm-s-neat span.cm-link { color: #3a3; } + +.cm-s-neat .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-neat .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neo.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neo.css new file mode 100644 index 0000000000..b28d5c65fa --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/neo.css @@ -0,0 +1,43 @@ +/* neo theme for codemirror */ + +/* Color scheme */ + +.cm-s-neo.CodeMirror { + background-color:#ffffff; + color:#2e383c; + line-height:1.4375; +} +.cm-s-neo .cm-comment { color:#75787b; } +.cm-s-neo .cm-keyword, .cm-s-neo .cm-property { color:#1d75b3; } +.cm-s-neo .cm-atom,.cm-s-neo .cm-number { color:#75438a; } +.cm-s-neo .cm-node,.cm-s-neo .cm-tag { color:#9c3328; } +.cm-s-neo .cm-string { color:#b35e14; } +.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier { color:#047d65; } + + +/* Editor styling */ + +.cm-s-neo pre { + padding:0; +} + +.cm-s-neo .CodeMirror-gutters { + border:none; + border-right:10px solid transparent; + background-color:transparent; +} + +.cm-s-neo .CodeMirror-linenumber { + padding:0; + color:#e0e2e5; +} + +.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } +.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } + +.cm-s-neo .CodeMirror-cursor { + width: auto; + border: 0; + background: rgba(155,157,162,0.37); + z-index: 1; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/night.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/night.css new file mode 100644 index 0000000000..f631bf42c7 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/night.css @@ -0,0 +1,27 @@ +/* Loosely based on the Midnight Textmate theme */ + +.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-night div.CodeMirror-selected { background: #447; } +.cm-s-night .CodeMirror-line::selection, .cm-s-night .CodeMirror-line > span::selection, .cm-s-night .CodeMirror-line > span > span::selection { background: rgba(68, 68, 119, .99); } +.cm-s-night .CodeMirror-line::-moz-selection, .cm-s-night .CodeMirror-line > span::-moz-selection, .cm-s-night .CodeMirror-line > span > span::-moz-selection { background: rgba(68, 68, 119, .99); } +.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-night .CodeMirror-guttermarker { color: white; } +.cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; } +.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-night .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-night span.cm-comment { color: #8900d1; } +.cm-s-night span.cm-atom { color: #845dc4; } +.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } +.cm-s-night span.cm-keyword { color: #599eff; } +.cm-s-night span.cm-string { color: #37f14a; } +.cm-s-night span.cm-meta { color: #7678e2; } +.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } +.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def, .cm-s-night span.cm-type { color: white; } +.cm-s-night span.cm-bracket { color: #8da6ce; } +.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } +.cm-s-night span.cm-link { color: #845dc4; } +.cm-s-night span.cm-error { color: #9d1e15; } + +.cm-s-night .CodeMirror-activeline-background { background: #1C005A; } +.cm-s-night .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/nord.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/nord.css new file mode 100644 index 0000000000..41a8ad7782 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/nord.css @@ -0,0 +1,42 @@ +/* Based on arcticicestudio's Nord theme */ +/* https://github.com/arcticicestudio/nord */ + +.cm-s-nord.CodeMirror { background: #2e3440; color: #d8dee9; } +.cm-s-nord div.CodeMirror-selected { background: #434c5e; } +.cm-s-nord .CodeMirror-line::selection, .cm-s-nord .CodeMirror-line > span::selection, .cm-s-nord .CodeMirror-line > span > span::selection { background: #3b4252; } +.cm-s-nord .CodeMirror-line::-moz-selection, .cm-s-nord .CodeMirror-line > span::-moz-selection, .cm-s-nord .CodeMirror-line > span > span::-moz-selection { background: #3b4252; } +.cm-s-nord .CodeMirror-gutters { background: #2e3440; border-right: 0px; } +.cm-s-nord .CodeMirror-guttermarker { color: #4c566a; } +.cm-s-nord .CodeMirror-guttermarker-subtle { color: #4c566a; } +.cm-s-nord .CodeMirror-linenumber { color: #4c566a; } +.cm-s-nord .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } + +.cm-s-nord span.cm-comment { color: #4c566a; } +.cm-s-nord span.cm-atom { color: #b48ead; } +.cm-s-nord span.cm-number { color: #b48ead; } + +.cm-s-nord span.cm-comment.cm-attribute { color: #97b757; } +.cm-s-nord span.cm-comment.cm-def { color: #bc9262; } +.cm-s-nord span.cm-comment.cm-tag { color: #bc6283; } +.cm-s-nord span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-nord span.cm-property, .cm-s-nord span.cm-attribute { color: #8FBCBB; } +.cm-s-nord span.cm-keyword { color: #81A1C1; } +.cm-s-nord span.cm-builtin { color: #81A1C1; } +.cm-s-nord span.cm-string { color: #A3BE8C; } + +.cm-s-nord span.cm-variable { color: #d8dee9; } +.cm-s-nord span.cm-variable-2 { color: #d8dee9; } +.cm-s-nord span.cm-variable-3, .cm-s-nord span.cm-type { color: #d8dee9; } +.cm-s-nord span.cm-def { color: #8FBCBB; } +.cm-s-nord span.cm-bracket { color: #81A1C1; } +.cm-s-nord span.cm-tag { color: #bf616a; } +.cm-s-nord span.cm-header { color: #b48ead; } +.cm-s-nord span.cm-link { color: #b48ead; } +.cm-s-nord span.cm-error { background: #bf616a; color: #f8f8f0; } + +.cm-s-nord .CodeMirror-activeline-background { background: #3b4252; } +.cm-s-nord .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/oceanic-next.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/oceanic-next.css new file mode 100644 index 0000000000..f3d0d08acb --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/oceanic-next.css @@ -0,0 +1,46 @@ +/* + + Name: oceanic-next + Author: Filype Pereira (https://github.com/fpereira1) + + Original oceanic-next color scheme by Dmitri Voronianski (https://github.com/voronianski/oceanic-next-color-scheme) + +*/ + +.cm-s-oceanic-next.CodeMirror { background: #304148; color: #f8f8f2; } +.cm-s-oceanic-next div.CodeMirror-selected { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-line::selection, .cm-s-oceanic-next .CodeMirror-line > span::selection, .cm-s-oceanic-next .CodeMirror-line > span > span::selection { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-line::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span > span::-moz-selection { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-gutters { background: #304148; border-right: 10px; } +.cm-s-oceanic-next .CodeMirror-guttermarker { color: white; } +.cm-s-oceanic-next .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-oceanic-next .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-oceanic-next .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } +.cm-s-oceanic-next.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; } +.cm-s-oceanic-next .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-oceanic-next span.cm-comment { color: #65737E; } +.cm-s-oceanic-next span.cm-atom { color: #C594C5; } +.cm-s-oceanic-next span.cm-number { color: #F99157; } + +.cm-s-oceanic-next span.cm-property { color: #99C794; } +.cm-s-oceanic-next span.cm-attribute, +.cm-s-oceanic-next span.cm-keyword { color: #C594C5; } +.cm-s-oceanic-next span.cm-builtin { color: #66d9ef; } +.cm-s-oceanic-next span.cm-string { color: #99C794; } + +.cm-s-oceanic-next span.cm-variable, +.cm-s-oceanic-next span.cm-variable-2, +.cm-s-oceanic-next span.cm-variable-3 { color: #f8f8f2; } +.cm-s-oceanic-next span.cm-def { color: #6699CC; } +.cm-s-oceanic-next span.cm-bracket { color: #5FB3B3; } +.cm-s-oceanic-next span.cm-tag { color: #C594C5; } +.cm-s-oceanic-next span.cm-header { color: #C594C5; } +.cm-s-oceanic-next span.cm-link { color: #C594C5; } +.cm-s-oceanic-next span.cm-error { background: #C594C5; color: #f8f8f0; } + +.cm-s-oceanic-next .CodeMirror-activeline-background { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/panda-syntax.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/panda-syntax.css new file mode 100644 index 0000000000..de14e91124 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/panda-syntax.css @@ -0,0 +1,85 @@ +/* + Name: Panda Syntax + Author: Siamak Mokhtari (http://github.com/siamak/) + CodeMirror template by Siamak Mokhtari (https://github.com/siamak/atom-panda-syntax) +*/ +.cm-s-panda-syntax { + background: #292A2B; + color: #E6E6E6; + line-height: 1.5; + font-family: 'Operator Mono', 'Source Code Pro', Menlo, Monaco, Consolas, Courier New, monospace; +} +.cm-s-panda-syntax .CodeMirror-cursor { border-color: #ff2c6d; } +.cm-s-panda-syntax .CodeMirror-activeline-background { + background: rgba(99, 123, 156, 0.1); +} +.cm-s-panda-syntax .CodeMirror-selected { + background: #FFF; +} +.cm-s-panda-syntax .cm-comment { + font-style: italic; + color: #676B79; +} +.cm-s-panda-syntax .cm-operator { + color: #f3f3f3; +} +.cm-s-panda-syntax .cm-string { + color: #19F9D8; +} +.cm-s-panda-syntax .cm-string-2 { + color: #FFB86C; +} + +.cm-s-panda-syntax .cm-tag { + color: #ff2c6d; +} +.cm-s-panda-syntax .cm-meta { + color: #b084eb; +} + +.cm-s-panda-syntax .cm-number { + color: #FFB86C; +} +.cm-s-panda-syntax .cm-atom { + color: #ff2c6d; +} +.cm-s-panda-syntax .cm-keyword { + color: #FF75B5; +} +.cm-s-panda-syntax .cm-variable { + color: #ffb86c; +} +.cm-s-panda-syntax .cm-variable-2 { + color: #ff9ac1; +} +.cm-s-panda-syntax .cm-variable-3, .cm-s-panda-syntax .cm-type { + color: #ff9ac1; +} + +.cm-s-panda-syntax .cm-def { + color: #e6e6e6; +} +.cm-s-panda-syntax .cm-property { + color: #f3f3f3; +} +.cm-s-panda-syntax .cm-unit { + color: #ffb86c; +} + +.cm-s-panda-syntax .cm-attribute { + color: #ffb86c; +} + +.cm-s-panda-syntax .CodeMirror-matchingbracket { + border-bottom: 1px dotted #19F9D8; + padding-bottom: 2px; + color: #e6e6e6; +} +.cm-s-panda-syntax .CodeMirror-gutters { + background: #292a2b; + border-right-color: rgba(255, 255, 255, 0.1); +} +.cm-s-panda-syntax .CodeMirror-linenumber { + color: #e6e6e6; + opacity: 0.6; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-dark.css new file mode 100644 index 0000000000..aa9d207e6d --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-dark.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Dark) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-dark.CodeMirror { background: #2f1e2e; color: #b9b6b0; } +.cm-s-paraiso-dark div.CodeMirror-selected { background: #41323f; } +.cm-s-paraiso-dark .CodeMirror-line::selection, .cm-s-paraiso-dark .CodeMirror-line > span::selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark .CodeMirror-line::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark .CodeMirror-gutters { background: #2f1e2e; border-right: 0px; } +.cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; } +.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; } +.cm-s-paraiso-dark .CodeMirror-linenumber { color: #776e71; } +.cm-s-paraiso-dark .CodeMirror-cursor { border-left: 1px solid #8d8687; } + +.cm-s-paraiso-dark span.cm-comment { color: #e96ba8; } +.cm-s-paraiso-dark span.cm-atom { color: #815ba4; } +.cm-s-paraiso-dark span.cm-number { color: #815ba4; } + +.cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute { color: #48b685; } +.cm-s-paraiso-dark span.cm-keyword { color: #ef6155; } +.cm-s-paraiso-dark span.cm-string { color: #fec418; } + +.cm-s-paraiso-dark span.cm-variable { color: #48b685; } +.cm-s-paraiso-dark span.cm-variable-2 { color: #06b6ef; } +.cm-s-paraiso-dark span.cm-def { color: #f99b15; } +.cm-s-paraiso-dark span.cm-bracket { color: #b9b6b0; } +.cm-s-paraiso-dark span.cm-tag { color: #ef6155; } +.cm-s-paraiso-dark span.cm-link { color: #815ba4; } +.cm-s-paraiso-dark span.cm-error { background: #ef6155; color: #8d8687; } + +.cm-s-paraiso-dark .CodeMirror-activeline-background { background: #4D344A; } +.cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-light.css new file mode 100644 index 0000000000..ae0c755f89 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/paraiso-light.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Light) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-light.CodeMirror { background: #e7e9db; color: #41323f; } +.cm-s-paraiso-light div.CodeMirror-selected { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-line::selection, .cm-s-paraiso-light .CodeMirror-line > span::selection, .cm-s-paraiso-light .CodeMirror-line > span > span::selection { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-line::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span > span::-moz-selection { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-gutters { background: #e7e9db; border-right: 0px; } +.cm-s-paraiso-light .CodeMirror-guttermarker { color: black; } +.cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; } +.cm-s-paraiso-light .CodeMirror-linenumber { color: #8d8687; } +.cm-s-paraiso-light .CodeMirror-cursor { border-left: 1px solid #776e71; } + +.cm-s-paraiso-light span.cm-comment { color: #e96ba8; } +.cm-s-paraiso-light span.cm-atom { color: #815ba4; } +.cm-s-paraiso-light span.cm-number { color: #815ba4; } + +.cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute { color: #48b685; } +.cm-s-paraiso-light span.cm-keyword { color: #ef6155; } +.cm-s-paraiso-light span.cm-string { color: #fec418; } + +.cm-s-paraiso-light span.cm-variable { color: #48b685; } +.cm-s-paraiso-light span.cm-variable-2 { color: #06b6ef; } +.cm-s-paraiso-light span.cm-def { color: #f99b15; } +.cm-s-paraiso-light span.cm-bracket { color: #41323f; } +.cm-s-paraiso-light span.cm-tag { color: #ef6155; } +.cm-s-paraiso-light span.cm-link { color: #815ba4; } +.cm-s-paraiso-light span.cm-error { background: #ef6155; color: #776e71; } + +.cm-s-paraiso-light .CodeMirror-activeline-background { background: #CFD1C4; } +.cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/pastel-on-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/pastel-on-dark.css new file mode 100644 index 0000000000..60435dd15e --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/pastel-on-dark.css @@ -0,0 +1,52 @@ +/** + * Pastel On Dark theme ported from ACE editor + * @license MIT + * @copyright AtomicPages LLC 2014 + * @author Dennis Thompson, AtomicPages LLC + * @version 1.1 + * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme + */ + +.cm-s-pastel-on-dark.CodeMirror { + background: #2c2827; + color: #8F938F; + line-height: 1.5; +} +.cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2); } +.cm-s-pastel-on-dark .CodeMirror-line::selection, .cm-s-pastel-on-dark .CodeMirror-line > span::selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::selection { background: rgba(221,240,255,0.2); } +.cm-s-pastel-on-dark .CodeMirror-line::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(221,240,255,0.2); } + +.cm-s-pastel-on-dark .CodeMirror-gutters { + background: #34302f; + border-right: 0px; + padding: 0 3px; +} +.cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; } +.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7; } +.cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; } +.cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; } +.cm-s-pastel-on-dark span.cm-property { color: #8F938F; } +.cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; } +.cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-string { color: #66A968; } +.cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } +.cm-s-pastel-on-dark span.cm-variable-3, .cm-s-pastel-on-dark span.cm-type { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-def { color: #757aD8; } +.cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } +.cm-s-pastel-on-dark span.cm-tag { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-link { color: #ae81ff; } +.cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-error { + background: #757aD8; + color: #f8f8f0; +} +.cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031); } +.cm-s-pastel-on-dark .CodeMirror-matchingbracket { + border: 1px solid rgba(255,255,255,0.25); + color: #8F938F !important; + margin: -1px -1px 0 -1px; +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/railscasts.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/railscasts.css new file mode 100644 index 0000000000..aeff0449d5 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/railscasts.css @@ -0,0 +1,34 @@ +/* + + Name: Railscasts + Author: Ryan Bates (http://railscasts.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-railscasts.CodeMirror {background: #2b2b2b; color: #f4f1ed;} +.cm-s-railscasts div.CodeMirror-selected {background: #272935 !important;} +.cm-s-railscasts .CodeMirror-gutters {background: #2b2b2b; border-right: 0px;} +.cm-s-railscasts .CodeMirror-linenumber {color: #5a647e;} +.cm-s-railscasts .CodeMirror-cursor {border-left: 1px solid #d4cfc9 !important;} + +.cm-s-railscasts span.cm-comment {color: #bc9458;} +.cm-s-railscasts span.cm-atom {color: #b6b3eb;} +.cm-s-railscasts span.cm-number {color: #b6b3eb;} + +.cm-s-railscasts span.cm-property, .cm-s-railscasts span.cm-attribute {color: #a5c261;} +.cm-s-railscasts span.cm-keyword {color: #da4939;} +.cm-s-railscasts span.cm-string {color: #ffc66d;} + +.cm-s-railscasts span.cm-variable {color: #a5c261;} +.cm-s-railscasts span.cm-variable-2 {color: #6d9cbe;} +.cm-s-railscasts span.cm-def {color: #cc7833;} +.cm-s-railscasts span.cm-error {background: #da4939; color: #d4cfc9;} +.cm-s-railscasts span.cm-bracket {color: #f4f1ed;} +.cm-s-railscasts span.cm-tag {color: #da4939;} +.cm-s-railscasts span.cm-link {color: #b6b3eb;} + +.cm-s-railscasts .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-railscasts .CodeMirror-activeline-background { background: #303040; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/rubyblue.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/rubyblue.css new file mode 100644 index 0000000000..1f181b06ec --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/rubyblue.css @@ -0,0 +1,25 @@ +.cm-s-rubyblue.CodeMirror { background: #112435; color: white; } +.cm-s-rubyblue div.CodeMirror-selected { background: #38566F; } +.cm-s-rubyblue .CodeMirror-line::selection, .cm-s-rubyblue .CodeMirror-line > span::selection, .cm-s-rubyblue .CodeMirror-line > span > span::selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue .CodeMirror-line::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } +.cm-s-rubyblue .CodeMirror-guttermarker { color: white; } +.cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; } +.cm-s-rubyblue .CodeMirror-linenumber { color: white; } +.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } +.cm-s-rubyblue span.cm-atom { color: #F4C20B; } +.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } +.cm-s-rubyblue span.cm-keyword { color: #F0F; } +.cm-s-rubyblue span.cm-string { color: #F08047; } +.cm-s-rubyblue span.cm-meta { color: #F0F; } +.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } +.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def, .cm-s-rubyblue span.cm-type { color: white; } +.cm-s-rubyblue span.cm-bracket { color: #F0F; } +.cm-s-rubyblue span.cm-link { color: #F4C20B; } +.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } +.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } +.cm-s-rubyblue span.cm-error { color: #AF2018; } + +.cm-s-rubyblue .CodeMirror-activeline-background { background: #173047; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/seti.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/seti.css new file mode 100644 index 0000000000..814f76f7de --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/seti.css @@ -0,0 +1,44 @@ +/* + + Name: seti + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original seti color scheme by Jesse Weed (https://github.com/jesseweed/seti-syntax) + +*/ + + +.cm-s-seti.CodeMirror { + background-color: #151718 !important; + color: #CFD2D1 !important; + border: none; +} +.cm-s-seti .CodeMirror-gutters { + color: #404b53; + background-color: #0E1112; + border: none; +} +.cm-s-seti .CodeMirror-cursor { border-left: solid thin #f8f8f0; } +.cm-s-seti .CodeMirror-linenumber { color: #6D8A88; } +.cm-s-seti.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti .CodeMirror-line::selection, .cm-s-seti .CodeMirror-line > span::selection, .cm-s-seti .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti .CodeMirror-line::-moz-selection, .cm-s-seti .CodeMirror-line > span::-moz-selection, .cm-s-seti .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti span.cm-comment { color: #41535b; } +.cm-s-seti span.cm-string, .cm-s-seti span.cm-string-2 { color: #55b5db; } +.cm-s-seti span.cm-number { color: #cd3f45; } +.cm-s-seti span.cm-variable { color: #55b5db; } +.cm-s-seti span.cm-variable-2 { color: #a074c4; } +.cm-s-seti span.cm-def { color: #55b5db; } +.cm-s-seti span.cm-keyword { color: #ff79c6; } +.cm-s-seti span.cm-operator { color: #9fca56; } +.cm-s-seti span.cm-keyword { color: #e6cd69; } +.cm-s-seti span.cm-atom { color: #cd3f45; } +.cm-s-seti span.cm-meta { color: #55b5db; } +.cm-s-seti span.cm-tag { color: #55b5db; } +.cm-s-seti span.cm-attribute { color: #9fca56; } +.cm-s-seti span.cm-qualifier { color: #9fca56; } +.cm-s-seti span.cm-property { color: #a074c4; } +.cm-s-seti span.cm-variable-3, .cm-s-seti span.cm-type { color: #9fca56; } +.cm-s-seti span.cm-builtin { color: #9fca56; } +.cm-s-seti .CodeMirror-activeline-background { background: #101213; } +.cm-s-seti .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/shadowfox.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/shadowfox.css new file mode 100644 index 0000000000..32d59b139a --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/shadowfox.css @@ -0,0 +1,52 @@ +/* + + Name: shadowfox + Author: overdodactyl (http://github.com/overdodactyl) + + Original shadowfox color scheme by Firefox + +*/ + +.cm-s-shadowfox.CodeMirror { background: #2a2a2e; color: #b1b1b3; } +.cm-s-shadowfox div.CodeMirror-selected { background: #353B48; } +.cm-s-shadowfox .CodeMirror-line::selection, .cm-s-shadowfox .CodeMirror-line > span::selection, .cm-s-shadowfox .CodeMirror-line > span > span::selection { background: #353B48; } +.cm-s-shadowfox .CodeMirror-line::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span > span::-moz-selection { background: #353B48; } +.cm-s-shadowfox .CodeMirror-gutters { background: #0c0c0d ; border-right: 1px solid #0c0c0d; } +.cm-s-shadowfox .CodeMirror-guttermarker { color: #555; } +.cm-s-shadowfox .CodeMirror-linenumber { color: #939393; } +.cm-s-shadowfox .CodeMirror-cursor { border-left: 1px solid #fff; } + +.cm-s-shadowfox span.cm-comment { color: #939393; } +.cm-s-shadowfox span.cm-atom { color: #FF7DE9; } +.cm-s-shadowfox span.cm-quote { color: #FF7DE9; } +.cm-s-shadowfox span.cm-builtin { color: #FF7DE9; } +.cm-s-shadowfox span.cm-attribute { color: #FF7DE9; } +.cm-s-shadowfox span.cm-keyword { color: #FF7DE9; } +.cm-s-shadowfox span.cm-error { color: #FF7DE9; } + +.cm-s-shadowfox span.cm-number { color: #6B89FF; } +.cm-s-shadowfox span.cm-string { color: #6B89FF; } +.cm-s-shadowfox span.cm-string-2 { color: #6B89FF; } + +.cm-s-shadowfox span.cm-meta { color: #939393; } +.cm-s-shadowfox span.cm-hr { color: #939393; } + +.cm-s-shadowfox span.cm-header { color: #75BFFF; } +.cm-s-shadowfox span.cm-qualifier { color: #75BFFF; } +.cm-s-shadowfox span.cm-variable-2 { color: #75BFFF; } + +.cm-s-shadowfox span.cm-property { color: #86DE74; } + +.cm-s-shadowfox span.cm-def { color: #75BFFF; } +.cm-s-shadowfox span.cm-bracket { color: #75BFFF; } +.cm-s-shadowfox span.cm-tag { color: #75BFFF; } +.cm-s-shadowfox span.cm-link:visited { color: #75BFFF; } + +.cm-s-shadowfox span.cm-variable { color: #B98EFF; } +.cm-s-shadowfox span.cm-variable-3 { color: #d7d7db; } +.cm-s-shadowfox span.cm-link { color: #737373; } +.cm-s-shadowfox span.cm-operator { color: #b1b1b3; } +.cm-s-shadowfox span.cm-special { color: #d7d7db; } + +.cm-s-shadowfox .CodeMirror-activeline-background { background: rgba(185, 215, 253, .15) } +.cm-s-shadowfox .CodeMirror-matchingbracket { outline: solid 1px rgba(255, 255, 255, .25); color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/solarized.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/solarized.css new file mode 100644 index 0000000000..e978fec9b0 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/solarized.css @@ -0,0 +1,165 @@ +/* +Solarized theme for code-mirror +http://ethanschoonover.com/solarized +*/ + +/* +Solarized color palette +http://ethanschoonover.com/solarized/img/solarized-palette.png +*/ + +.solarized.base03 { color: #002b36; } +.solarized.base02 { color: #073642; } +.solarized.base01 { color: #586e75; } +.solarized.base00 { color: #657b83; } +.solarized.base0 { color: #839496; } +.solarized.base1 { color: #93a1a1; } +.solarized.base2 { color: #eee8d5; } +.solarized.base3 { color: #fdf6e3; } +.solarized.solar-yellow { color: #b58900; } +.solarized.solar-orange { color: #cb4b16; } +.solarized.solar-red { color: #dc322f; } +.solarized.solar-magenta { color: #d33682; } +.solarized.solar-violet { color: #6c71c4; } +.solarized.solar-blue { color: #268bd2; } +.solarized.solar-cyan { color: #2aa198; } +.solarized.solar-green { color: #859900; } + +/* Color scheme for code-mirror */ + +.cm-s-solarized { + line-height: 1.45em; + color-profile: sRGB; + rendering-intent: auto; +} +.cm-s-solarized.cm-s-dark { + color: #839496; + background-color: #002b36; +} +.cm-s-solarized.cm-s-light { + background-color: #fdf6e3; + color: #657b83; +} + +.cm-s-solarized .CodeMirror-widget { + text-shadow: none; +} + +.cm-s-solarized .cm-header { color: #586e75; } +.cm-s-solarized .cm-quote { color: #93a1a1; } + +.cm-s-solarized .cm-keyword { color: #cb4b16; } +.cm-s-solarized .cm-atom { color: #d33682; } +.cm-s-solarized .cm-number { color: #d33682; } +.cm-s-solarized .cm-def { color: #2aa198; } + +.cm-s-solarized .cm-variable { color: #839496; } +.cm-s-solarized .cm-variable-2 { color: #b58900; } +.cm-s-solarized .cm-variable-3, .cm-s-solarized .cm-type { color: #6c71c4; } + +.cm-s-solarized .cm-property { color: #2aa198; } +.cm-s-solarized .cm-operator { color: #6c71c4; } + +.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } + +.cm-s-solarized .cm-string { color: #859900; } +.cm-s-solarized .cm-string-2 { color: #b58900; } + +.cm-s-solarized .cm-meta { color: #859900; } +.cm-s-solarized .cm-qualifier { color: #b58900; } +.cm-s-solarized .cm-builtin { color: #d33682; } +.cm-s-solarized .cm-bracket { color: #cb4b16; } +.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } +.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } +.cm-s-solarized .cm-tag { color: #93a1a1; } +.cm-s-solarized .cm-attribute { color: #2aa198; } +.cm-s-solarized .cm-hr { + color: transparent; + border-top: 1px solid #586e75; + display: block; +} +.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } +.cm-s-solarized .cm-special { color: #6c71c4; } +.cm-s-solarized .cm-em { + color: #999; + text-decoration: underline; + text-decoration-style: dotted; +} +.cm-s-solarized .cm-error, +.cm-s-solarized .cm-invalidchar { + color: #586e75; + border-bottom: 1px dotted #dc322f; +} + +.cm-s-solarized.cm-s-dark div.CodeMirror-selected { background: #073642; } +.cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); } +.cm-s-solarized.cm-s-dark .CodeMirror-line::-moz-selection, .cm-s-dark .CodeMirror-line > span::-moz-selection, .cm-s-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(7, 54, 66, 0.99); } + +.cm-s-solarized.cm-s-light div.CodeMirror-selected { background: #eee8d5; } +.cm-s-solarized.cm-s-light .CodeMirror-line::selection, .cm-s-light .CodeMirror-line > span::selection, .cm-s-light .CodeMirror-line > span > span::selection { background: #eee8d5; } +.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection, .cm-s-light .CodeMirror-line > span::-moz-selection, .cm-s-light .CodeMirror-line > span > span::-moz-selection { background: #eee8d5; } + +/* Editor styling */ + + + +/* Little shadow on the view-port of the buffer view */ +.cm-s-solarized.CodeMirror { + -moz-box-shadow: inset 7px 0 12px -6px #000; + -webkit-box-shadow: inset 7px 0 12px -6px #000; + box-shadow: inset 7px 0 12px -6px #000; +} + +/* Remove gutter border */ +.cm-s-solarized .CodeMirror-gutters { + border-right: 0; +} + +/* Gutter colors and line number styling based of color scheme (dark / light) */ + +/* Dark */ +.cm-s-solarized.cm-s-dark .CodeMirror-gutters { + background-color: #073642; +} + +.cm-s-solarized.cm-s-dark .CodeMirror-linenumber { + color: #586e75; +} + +/* Light */ +.cm-s-solarized.cm-s-light .CodeMirror-gutters { + background-color: #eee8d5; +} + +.cm-s-solarized.cm-s-light .CodeMirror-linenumber { + color: #839496; +} + +/* Common */ +.cm-s-solarized .CodeMirror-linenumber { + padding: 0 5px; +} +.cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; } +.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; } +.cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; } + +.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { + color: #586e75; +} + +/* Cursor */ +.cm-s-solarized .CodeMirror-cursor { border-left: 1px solid #819090; } + +/* Fat cursor */ +.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor { background: #77ee77; } +.cm-s-solarized.cm-s-light .cm-animate-fat-cursor { background-color: #77ee77; } +.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor { background: #586e75; } +.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor { background-color: #586e75; } + +/* Active line */ +.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background { + background: rgba(255, 255, 255, 0.06); +} +.cm-s-solarized.cm-s-light .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.06); +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ssms.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ssms.css new file mode 100644 index 0000000000..9494c14c20 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ssms.css @@ -0,0 +1,16 @@ +.cm-s-ssms span.cm-keyword { color: blue; } +.cm-s-ssms span.cm-comment { color: darkgreen; } +.cm-s-ssms span.cm-string { color: red; } +.cm-s-ssms span.cm-def { color: black; } +.cm-s-ssms span.cm-variable { color: black; } +.cm-s-ssms span.cm-variable-2 { color: black; } +.cm-s-ssms span.cm-atom { color: darkgray; } +.cm-s-ssms .CodeMirror-linenumber { color: teal; } +.cm-s-ssms .CodeMirror-activeline-background { background: #ffffff; } +.cm-s-ssms span.cm-string-2 { color: #FF00FF; } +.cm-s-ssms span.cm-operator, +.cm-s-ssms span.cm-bracket, +.cm-s-ssms span.cm-punctuation { color: darkgray; } +.cm-s-ssms .CodeMirror-gutters { border-right: 3px solid #ffee62; background-color: #ffffff; } +.cm-s-ssms div.CodeMirror-selected { background: #ADD6FF; } + diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/the-matrix.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/the-matrix.css new file mode 100644 index 0000000000..c4c93c11ea --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/the-matrix.css @@ -0,0 +1,30 @@ +.cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; } +.cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D; } +.cm-s-the-matrix .CodeMirror-line::selection, .cm-s-the-matrix .CodeMirror-line > span::selection, .cm-s-the-matrix .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix .CodeMirror-line::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; } +.cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; } +.cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; } +.cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; } +.cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00; } + +.cm-s-the-matrix span.cm-keyword { color: #008803; font-weight: bold; } +.cm-s-the-matrix span.cm-atom { color: #3FF; } +.cm-s-the-matrix span.cm-number { color: #FFB94F; } +.cm-s-the-matrix span.cm-def { color: #99C; } +.cm-s-the-matrix span.cm-variable { color: #F6C; } +.cm-s-the-matrix span.cm-variable-2 { color: #C6F; } +.cm-s-the-matrix span.cm-variable-3, .cm-s-the-matrix span.cm-type { color: #96F; } +.cm-s-the-matrix span.cm-property { color: #62FFA0; } +.cm-s-the-matrix span.cm-operator { color: #999; } +.cm-s-the-matrix span.cm-comment { color: #CCCCCC; } +.cm-s-the-matrix span.cm-string { color: #39C; } +.cm-s-the-matrix span.cm-meta { color: #C9F; } +.cm-s-the-matrix span.cm-qualifier { color: #FFF700; } +.cm-s-the-matrix span.cm-builtin { color: #30a; } +.cm-s-the-matrix span.cm-bracket { color: #cc7; } +.cm-s-the-matrix span.cm-tag { color: #FFBD40; } +.cm-s-the-matrix span.cm-attribute { color: #FFF700; } +.cm-s-the-matrix span.cm-error { color: #FF0000; } + +.cm-s-the-matrix .CodeMirror-activeline-background { background: #040; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-bright.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-bright.css new file mode 100644 index 0000000000..b6dd4a9278 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-bright.css @@ -0,0 +1,35 @@ +/* + + Name: Tomorrow Night - Bright + Author: Chris Kempson + + Port done by Gerard Braad + +*/ + +.cm-s-tomorrow-night-bright.CodeMirror { background: #000000; color: #eaeaea; } +.cm-s-tomorrow-night-bright div.CodeMirror-selected { background: #424242; } +.cm-s-tomorrow-night-bright .CodeMirror-gutters { background: #000000; border-right: 0px; } +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; } +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-bright .CodeMirror-linenumber { color: #424242; } +.cm-s-tomorrow-night-bright .CodeMirror-cursor { border-left: 1px solid #6A6A6A; } + +.cm-s-tomorrow-night-bright span.cm-comment { color: #d27b53; } +.cm-s-tomorrow-night-bright span.cm-atom { color: #a16a94; } +.cm-s-tomorrow-night-bright span.cm-number { color: #a16a94; } + +.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute { color: #99cc99; } +.cm-s-tomorrow-night-bright span.cm-keyword { color: #d54e53; } +.cm-s-tomorrow-night-bright span.cm-string { color: #e7c547; } + +.cm-s-tomorrow-night-bright span.cm-variable { color: #b9ca4a; } +.cm-s-tomorrow-night-bright span.cm-variable-2 { color: #7aa6da; } +.cm-s-tomorrow-night-bright span.cm-def { color: #e78c45; } +.cm-s-tomorrow-night-bright span.cm-bracket { color: #eaeaea; } +.cm-s-tomorrow-night-bright span.cm-tag { color: #d54e53; } +.cm-s-tomorrow-night-bright span.cm-link { color: #a16a94; } +.cm-s-tomorrow-night-bright span.cm-error { background: #d54e53; color: #6A6A6A; } + +.cm-s-tomorrow-night-bright .CodeMirror-activeline-background { background: #2a2a2a; } +.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-eighties.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-eighties.css new file mode 100644 index 0000000000..2a9debc327 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/tomorrow-night-eighties.css @@ -0,0 +1,38 @@ +/* + + Name: Tomorrow Night - Eighties + Author: Chris Kempson + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-tomorrow-night-eighties.CodeMirror { background: #000000; color: #CCCCCC; } +.cm-s-tomorrow-night-eighties div.CodeMirror-selected { background: #2D2D2D; } +.cm-s-tomorrow-night-eighties .CodeMirror-line::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties .CodeMirror-line::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties .CodeMirror-gutters { background: #000000; border-right: 0px; } +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; } +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-eighties .CodeMirror-linenumber { color: #515151; } +.cm-s-tomorrow-night-eighties .CodeMirror-cursor { border-left: 1px solid #6A6A6A; } + +.cm-s-tomorrow-night-eighties span.cm-comment { color: #d27b53; } +.cm-s-tomorrow-night-eighties span.cm-atom { color: #a16a94; } +.cm-s-tomorrow-night-eighties span.cm-number { color: #a16a94; } + +.cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute { color: #99cc99; } +.cm-s-tomorrow-night-eighties span.cm-keyword { color: #f2777a; } +.cm-s-tomorrow-night-eighties span.cm-string { color: #ffcc66; } + +.cm-s-tomorrow-night-eighties span.cm-variable { color: #99cc99; } +.cm-s-tomorrow-night-eighties span.cm-variable-2 { color: #6699cc; } +.cm-s-tomorrow-night-eighties span.cm-def { color: #f99157; } +.cm-s-tomorrow-night-eighties span.cm-bracket { color: #CCCCCC; } +.cm-s-tomorrow-night-eighties span.cm-tag { color: #f2777a; } +.cm-s-tomorrow-night-eighties span.cm-link { color: #a16a94; } +.cm-s-tomorrow-night-eighties span.cm-error { background: #f2777a; color: #6A6A6A; } + +.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background { background: #343600; } +.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ttcn.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ttcn.css new file mode 100644 index 0000000000..0b14ac35d6 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/ttcn.css @@ -0,0 +1,64 @@ +.cm-s-ttcn .cm-quote { color: #090; } +.cm-s-ttcn .cm-negative { color: #d44; } +.cm-s-ttcn .cm-positive { color: #292; } +.cm-s-ttcn .cm-header, .cm-strong { font-weight: bold; } +.cm-s-ttcn .cm-em { font-style: italic; } +.cm-s-ttcn .cm-link { text-decoration: underline; } +.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; } +.cm-s-ttcn .cm-header { color: #00f; font-weight: bold; } + +.cm-s-ttcn .cm-atom { color: #219; } +.cm-s-ttcn .cm-attribute { color: #00c; } +.cm-s-ttcn .cm-bracket { color: #997; } +.cm-s-ttcn .cm-comment { color: #333333; } +.cm-s-ttcn .cm-def { color: #00f; } +.cm-s-ttcn .cm-em { font-style: italic; } +.cm-s-ttcn .cm-error { color: #f00; } +.cm-s-ttcn .cm-hr { color: #999; } +.cm-s-ttcn .cm-invalidchar { color: #f00; } +.cm-s-ttcn .cm-keyword { font-weight:bold; } +.cm-s-ttcn .cm-link { color: #00c; text-decoration: underline; } +.cm-s-ttcn .cm-meta { color: #555; } +.cm-s-ttcn .cm-negative { color: #d44; } +.cm-s-ttcn .cm-positive { color: #292; } +.cm-s-ttcn .cm-qualifier { color: #555; } +.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; } +.cm-s-ttcn .cm-string { color: #006400; } +.cm-s-ttcn .cm-string-2 { color: #f50; } +.cm-s-ttcn .cm-strong { font-weight: bold; } +.cm-s-ttcn .cm-tag { color: #170; } +.cm-s-ttcn .cm-variable { color: #8B2252; } +.cm-s-ttcn .cm-variable-2 { color: #05a; } +.cm-s-ttcn .cm-variable-3, .cm-s-ttcn .cm-type { color: #085; } + +.cm-s-ttcn .cm-invalidchar { color: #f00; } + +/* ASN */ +.cm-s-ttcn .cm-accessTypes, +.cm-s-ttcn .cm-compareTypes { color: #27408B; } +.cm-s-ttcn .cm-cmipVerbs { color: #8B2252; } +.cm-s-ttcn .cm-modifier { color:#D2691E; } +.cm-s-ttcn .cm-status { color:#8B4545; } +.cm-s-ttcn .cm-storage { color:#A020F0; } +.cm-s-ttcn .cm-tags { color:#006400; } + +/* CFG */ +.cm-s-ttcn .cm-externalCommands { color: #8B4545; font-weight:bold; } +.cm-s-ttcn .cm-fileNCtrlMaskOptions, +.cm-s-ttcn .cm-sectionTitle { color: #2E8B57; font-weight:bold; } + +/* TTCN */ +.cm-s-ttcn .cm-booleanConsts, +.cm-s-ttcn .cm-otherConsts, +.cm-s-ttcn .cm-verdictConsts { color: #006400; } +.cm-s-ttcn .cm-configOps, +.cm-s-ttcn .cm-functionOps, +.cm-s-ttcn .cm-portOps, +.cm-s-ttcn .cm-sutOps, +.cm-s-ttcn .cm-timerOps, +.cm-s-ttcn .cm-verdictOps { color: #0000FF; } +.cm-s-ttcn .cm-preprocessor, +.cm-s-ttcn .cm-templateMatch, +.cm-s-ttcn .cm-ttcn3Macros { color: #27408B; } +.cm-s-ttcn .cm-types { color: #A52A2A; font-weight:bold; } +.cm-s-ttcn .cm-visibilityModifiers { font-weight:bold; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/twilight.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/twilight.css new file mode 100644 index 0000000000..b2b1b2aa93 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/twilight.css @@ -0,0 +1,32 @@ +.cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ +.cm-s-twilight div.CodeMirror-selected { background: #323232; } /**/ +.cm-s-twilight .CodeMirror-line::selection, .cm-s-twilight .CodeMirror-line > span::selection, .cm-s-twilight .CodeMirror-line > span > span::selection { background: rgba(50, 50, 50, 0.99); } +.cm-s-twilight .CodeMirror-line::-moz-selection, .cm-s-twilight .CodeMirror-line > span::-moz-selection, .cm-s-twilight .CodeMirror-line > span > span::-moz-selection { background: rgba(50, 50, 50, 0.99); } + +.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } +.cm-s-twilight .CodeMirror-guttermarker { color: white; } +.cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; } +.cm-s-twilight .CodeMirror-linenumber { color: #aaa; } +.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ +.cm-s-twilight .cm-atom { color: #FC0; } +.cm-s-twilight .cm-number { color: #ca7841; } /**/ +.cm-s-twilight .cm-def { color: #8DA6CE; } +.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ +.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/ +.cm-s-twilight .cm-operator { color: #cda869; } /**/ +.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ +.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ +.cm-s-twilight .cm-string-2 { color:#bd6b18; } /*?*/ +.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ +.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ +.cm-s-twilight .cm-tag { color: #997643; } /**/ +.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-twilight .cm-header { color: #FF6400; } +.cm-s-twilight .cm-hr { color: #AEAEAE; } +.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ +.cm-s-twilight .cm-error { border-bottom: 1px solid red; } + +.cm-s-twilight .CodeMirror-activeline-background { background: #27282E; } +.cm-s-twilight .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/vibrant-ink.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/vibrant-ink.css new file mode 100644 index 0000000000..6358ad3655 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/vibrant-ink.css @@ -0,0 +1,34 @@ +/* Taken from the popular Visual Studio Vibrant Ink Schema */ + +.cm-s-vibrant-ink.CodeMirror { background: black; color: white; } +.cm-s-vibrant-ink div.CodeMirror-selected { background: #35493c; } +.cm-s-vibrant-ink .CodeMirror-line::selection, .cm-s-vibrant-ink .CodeMirror-line > span::selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::selection { background: rgba(53, 73, 60, 0.99); } +.cm-s-vibrant-ink .CodeMirror-line::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::-moz-selection { background: rgba(53, 73, 60, 0.99); } + +.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; } +.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-vibrant-ink .cm-keyword { color: #CC7832; } +.cm-s-vibrant-ink .cm-atom { color: #FC0; } +.cm-s-vibrant-ink .cm-number { color: #FFEE98; } +.cm-s-vibrant-ink .cm-def { color: #8DA6CE; } +.cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D; } +.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def, .cm-s-vibrant span.cm-type { color: #FFC66D; } +.cm-s-vibrant-ink .cm-operator { color: #888; } +.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } +.cm-s-vibrant-ink .cm-string { color: #A5C25C; } +.cm-s-vibrant-ink .cm-string-2 { color: red; } +.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } +.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-header { color: #FF6400; } +.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } +.cm-s-vibrant-ink .cm-link { color: #5656F3; } +.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } + +.cm-s-vibrant-ink .CodeMirror-activeline-background { background: #27282E; } +.cm-s-vibrant-ink .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-dark.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-dark.css new file mode 100644 index 0000000000..7da1a0f705 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-dark.css @@ -0,0 +1,53 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-xq-dark div.CodeMirror-selected { background: #27007A; } +.cm-s-xq-dark .CodeMirror-line::selection, .cm-s-xq-dark .CodeMirror-line > span::selection, .cm-s-xq-dark .CodeMirror-line > span > span::selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark .CodeMirror-line::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-xq-dark span.cm-keyword { color: #FFBD40; } +.cm-s-xq-dark span.cm-atom { color: #6C8CD5; } +.cm-s-xq-dark span.cm-number { color: #164; } +.cm-s-xq-dark span.cm-def { color: #FFF; text-decoration:underline; } +.cm-s-xq-dark span.cm-variable { color: #FFF; } +.cm-s-xq-dark span.cm-variable-2 { color: #EEE; } +.cm-s-xq-dark span.cm-variable-3, .cm-s-xq-dark span.cm-type { color: #DDD; } +.cm-s-xq-dark span.cm-property {} +.cm-s-xq-dark span.cm-operator {} +.cm-s-xq-dark span.cm-comment { color: gray; } +.cm-s-xq-dark span.cm-string { color: #9FEE00; } +.cm-s-xq-dark span.cm-meta { color: yellow; } +.cm-s-xq-dark span.cm-qualifier { color: #FFF700; } +.cm-s-xq-dark span.cm-builtin { color: #30a; } +.cm-s-xq-dark span.cm-bracket { color: #cc7; } +.cm-s-xq-dark span.cm-tag { color: #FFBD40; } +.cm-s-xq-dark span.cm-attribute { color: #FFF700; } +.cm-s-xq-dark span.cm-error { color: #f00; } + +.cm-s-xq-dark .CodeMirror-activeline-background { background: #27282E; } +.cm-s-xq-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-light.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-light.css new file mode 100644 index 0000000000..7b182ea997 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/xq-light.css @@ -0,0 +1,43 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-light span.cm-keyword { line-height: 1em; font-weight: bold; color: #5A5CAD; } +.cm-s-xq-light span.cm-atom { color: #6C8CD5; } +.cm-s-xq-light span.cm-number { color: #164; } +.cm-s-xq-light span.cm-def { text-decoration:underline; } +.cm-s-xq-light span.cm-variable { color: black; } +.cm-s-xq-light span.cm-variable-2 { color:black; } +.cm-s-xq-light span.cm-variable-3, .cm-s-xq-light span.cm-type { color: black; } +.cm-s-xq-light span.cm-property {} +.cm-s-xq-light span.cm-operator {} +.cm-s-xq-light span.cm-comment { color: #0080FF; font-style: italic; } +.cm-s-xq-light span.cm-string { color: red; } +.cm-s-xq-light span.cm-meta { color: yellow; } +.cm-s-xq-light span.cm-qualifier { color: grey; } +.cm-s-xq-light span.cm-builtin { color: #7EA656; } +.cm-s-xq-light span.cm-bracket { color: #cc7; } +.cm-s-xq-light span.cm-tag { color: #3F7F7F; } +.cm-s-xq-light span.cm-attribute { color: #7F007F; } +.cm-s-xq-light span.cm-error { color: #f00; } + +.cm-s-xq-light .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-xq-light .CodeMirror-matchingbracket { outline:1px solid grey;color:black !important;background:yellow; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yeti.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yeti.css new file mode 100644 index 0000000000..d085f72497 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yeti.css @@ -0,0 +1,44 @@ +/* + + Name: yeti + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original yeti color scheme by Jesse Weed (https://github.com/jesseweed/yeti-syntax) + +*/ + + +.cm-s-yeti.CodeMirror { + background-color: #ECEAE8 !important; + color: #d1c9c0 !important; + border: none; +} + +.cm-s-yeti .CodeMirror-gutters { + color: #adaba6; + background-color: #E5E1DB; + border: none; +} +.cm-s-yeti .CodeMirror-cursor { border-left: solid thin #d1c9c0; } +.cm-s-yeti .CodeMirror-linenumber { color: #adaba6; } +.cm-s-yeti.CodeMirror-focused div.CodeMirror-selected { background: #DCD8D2; } +.cm-s-yeti .CodeMirror-line::selection, .cm-s-yeti .CodeMirror-line > span::selection, .cm-s-yeti .CodeMirror-line > span > span::selection { background: #DCD8D2; } +.cm-s-yeti .CodeMirror-line::-moz-selection, .cm-s-yeti .CodeMirror-line > span::-moz-selection, .cm-s-yeti .CodeMirror-line > span > span::-moz-selection { background: #DCD8D2; } +.cm-s-yeti span.cm-comment { color: #d4c8be; } +.cm-s-yeti span.cm-string, .cm-s-yeti span.cm-string-2 { color: #96c0d8; } +.cm-s-yeti span.cm-number { color: #a074c4; } +.cm-s-yeti span.cm-variable { color: #55b5db; } +.cm-s-yeti span.cm-variable-2 { color: #a074c4; } +.cm-s-yeti span.cm-def { color: #55b5db; } +.cm-s-yeti span.cm-operator { color: #9fb96e; } +.cm-s-yeti span.cm-keyword { color: #9fb96e; } +.cm-s-yeti span.cm-atom { color: #a074c4; } +.cm-s-yeti span.cm-meta { color: #96c0d8; } +.cm-s-yeti span.cm-tag { color: #96c0d8; } +.cm-s-yeti span.cm-attribute { color: #9fb96e; } +.cm-s-yeti span.cm-qualifier { color: #96c0d8; } +.cm-s-yeti span.cm-property { color: #a074c4; } +.cm-s-yeti span.cm-builtin { color: #a074c4; } +.cm-s-yeti span.cm-variable-3, .cm-s-yeti span.cm-type { color: #96c0d8; } +.cm-s-yeti .CodeMirror-activeline-background { background: #E7E4E0; } +.cm-s-yeti .CodeMirror-matchingbracket { text-decoration: underline; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yonce.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yonce.css new file mode 100644 index 0000000000..975f0788a2 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/yonce.css @@ -0,0 +1,59 @@ +/* + + Name: yoncé + Author: Thomas MacLean (http://github.com/thomasmaclean) + + Original yoncé color scheme by Mina Markham (https://github.com/minamarkham) + +*/ + +.cm-s-yonce.CodeMirror { background: #1C1C1C; color: #d4d4d4; } /**/ +.cm-s-yonce div.CodeMirror-selected { background: rgba(252, 69, 133, 0.478); } /**/ +.cm-s-yonce .CodeMirror-selectedtext, +.cm-s-yonce .CodeMirror-selected, +.cm-s-yonce .CodeMirror-line::selection, +.cm-s-yonce .CodeMirror-line > span::selection, +.cm-s-yonce .CodeMirror-line > span > span::selection, +.cm-s-yonce .CodeMirror-line::-moz-selection, +.cm-s-yonce .CodeMirror-line > span::-moz-selection, +.cm-s-yonce .CodeMirror-line > span > span::-moz-selection { background: rgba(252, 67, 132, 0.47); } + +.cm-s-yonce.CodeMirror pre { padding-left: 0px; } +.cm-s-yonce .CodeMirror-gutters {background: #1C1C1C; border-right: 0px;} +.cm-s-yonce .CodeMirror-linenumber {color: #777777; padding-right: 10px; } +.cm-s-yonce .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: #1C1C1C; color: #fc4384; } +.cm-s-yonce .CodeMirror-linenumber { color: #777; } +.cm-s-yonce .CodeMirror-cursor { border-left: 2px solid #FC4384; } +.cm-s-yonce .cm-searching { background: rgba(243, 155, 53, .3) !important; outline: 1px solid #F39B35; } +.cm-s-yonce .cm-searching.CodeMirror-selectedtext { background: rgba(243, 155, 53, .7) !important; color: white; } + +.cm-s-yonce .cm-keyword { color: #00A7AA; } /**/ +.cm-s-yonce .cm-atom { color: #F39B35; } +.cm-s-yonce .cm-number, .cm-s-yonce span.cm-type { color: #A06FCA; } /**/ +.cm-s-yonce .cm-def { color: #98E342; } +.cm-s-yonce .cm-property, +.cm-s-yonce span.cm-variable { color: #D4D4D4; font-style: italic; } +.cm-s-yonce span.cm-variable-2 { color: #da7dae; font-style: italic; } +.cm-s-yonce span.cm-variable-3 { color: #A06FCA; } +.cm-s-yonce .cm-type.cm-def { color: #FC4384; font-style: normal; text-decoration: underline; } +.cm-s-yonce .cm-property.cm-def { color: #FC4384; font-style: normal; } +.cm-s-yonce .cm-callee { color: #FC4384; font-style: normal; } +.cm-s-yonce .cm-operator { color: #FC4384; } /**/ +.cm-s-yonce .cm-qualifier, +.cm-s-yonce .cm-tag { color: #FC4384; } +.cm-s-yonce .cm-tag.cm-bracket { color: #D4D4D4; } +.cm-s-yonce .cm-attribute { color: #A06FCA; } +.cm-s-yonce .cm-comment { color:#696d70; font-style:italic; font-weight:normal; } /**/ +.cm-s-yonce .cm-comment.cm-tag { color: #FC4384 } +.cm-s-yonce .cm-comment.cm-attribute { color: #D4D4D4; } +.cm-s-yonce .cm-string { color:#E6DB74; } /**/ +.cm-s-yonce .cm-string-2 { color:#F39B35; } /*?*/ +.cm-s-yonce .cm-meta { color: #D4D4D4; background: inherit; } +.cm-s-yonce .cm-builtin { color: #FC4384; } /*?*/ +.cm-s-yonce .cm-header { color: #da7dae; } +.cm-s-yonce .cm-hr { color: #98E342; } +.cm-s-yonce .cm-link { color:#696d70; font-style:italic; text-decoration:none; } /**/ +.cm-s-yonce .cm-error { border-bottom: 1px solid #C42412; } + +.cm-s-yonce .CodeMirror-activeline-background { background: #272727; } +.cm-s-yonce .CodeMirror-matchingbracket { outline:1px solid grey; color:#D4D4D4 !important; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/zenburn.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/zenburn.css new file mode 100644 index 0000000000..4eb4247c92 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/codemirror/theme/zenburn.css @@ -0,0 +1,37 @@ +/** + * " + * Using Zenburn color palette from the Emacs Zenburn Theme + * https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el + * + * Also using parts of https://github.com/xavi/coderay-lighttable-theme + * " + * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css + */ + +.cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; } +.cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; } +.cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-zenburn.CodeMirror { background-color: #3f3f3f; color: #dcdccc; } +.cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; } +.cm-s-zenburn span.cm-comment { color: #7f9f7f; } +.cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; } +.cm-s-zenburn span.cm-atom { color: #bfebbf; } +.cm-s-zenburn span.cm-def { color: #dcdccc; } +.cm-s-zenburn span.cm-variable { color: #dfaf8f; } +.cm-s-zenburn span.cm-variable-2 { color: #dcdccc; } +.cm-s-zenburn span.cm-string { color: #cc9393; } +.cm-s-zenburn span.cm-string-2 { color: #cc9393; } +.cm-s-zenburn span.cm-number { color: #dcdccc; } +.cm-s-zenburn span.cm-tag { color: #93e0e3; } +.cm-s-zenburn span.cm-property { color: #dfaf8f; } +.cm-s-zenburn span.cm-attribute { color: #dfaf8f; } +.cm-s-zenburn span.cm-qualifier { color: #7cb8bb; } +.cm-s-zenburn span.cm-meta { color: #f0dfaf; } +.cm-s-zenburn span.cm-header { color: #f0efd0; } +.cm-s-zenburn span.cm-operator { color: #f0efd0; } +.cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; } +.cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; } +.cm-s-zenburn .CodeMirror-activeline { background: #000000; } +.cm-s-zenburn .CodeMirror-activeline-background { background: #000000; } +.cm-s-zenburn div.CodeMirror-selected { background: #545454; } +.cm-s-zenburn .CodeMirror-focused div.CodeMirror-selected { background: #4f4f4f; } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index cedf508cc2..92b8cbcfbd 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,234 +41,243 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/cms-kit.admin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-5.2.1.tgz#f685e8533366fa7a7db9641a61681f664af6d979" - integrity sha512-KkT3eJMR0XCzlIY3KXNId3KfN8rQmGuThTZIPo5cifGg0mpW/HdkCfI4Dmv6v2xkUnZ/o5dOf+cXkvFrt6zzfg== +"@abp/cms-kit.admin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-5.3.0-rc.1.tgz#741350a9669532d3bd8e703c2a8cde5e693b1b9d" + integrity sha512-xmdfrlAOBDB1Fi/aBjpkNEG5m4OBiSOo1xt88fG1KJiKxfDYsH84XB+V7rJ/3IWtlaQJDzdnYFrqoex/5h0S/A== dependencies: - "@abp/jstree" "~5.2.1" - "@abp/slugify" "~5.2.1" - "@abp/tui-editor" "~5.2.1" - "@abp/uppy" "~5.2.1" + "@abp/codemirror" "~5.3.0-rc.1" + "@abp/jstree" "~5.3.0-rc.1" + "@abp/slugify" "~5.3.0-rc.1" + "@abp/tui-editor" "~5.3.0-rc.1" + "@abp/uppy" "~5.3.0-rc.1" -"@abp/cms-kit.public@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-5.2.1.tgz#8f4860b17470f57fce3bbd732a7954031a244d14" - integrity sha512-dOhzJjWuXO74GFUg78JRhLOJCaUXjwOHuQMbzpWHnMyrj88nEJkEtHwYs1vxf9GWvyhhES6h7ZyusxJhy+Ybww== +"@abp/cms-kit.public@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-5.3.0-rc.1.tgz#4f0fe30a5c6f5450dfde265162d68239e00e2f9b" + integrity sha512-B9FX1bq9Ki9bouatcY9MJRbOo8/QLFmq24Ua3ASgmMhMwwSpUUu+GBUtxpUkRepWcpPze4m3rWIn5Ff8ZVnOEw== dependencies: - "@abp/highlight.js" "~5.2.1" - "@abp/star-rating-svg" "~5.2.1" + "@abp/highlight.js" "~5.3.0-rc.1" + "@abp/star-rating-svg" "~5.3.0-rc.1" -"@abp/cms-kit@5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-5.2.1.tgz#2cab9de4bb4e14ec39f8a2086b16fc38556af6bb" - integrity sha512-SuIJYj8LAdYeATYrpLxRGg7gMQ52Wq2gApriv7c7pC45mPQosi57wjEMvsI2MKAurEwQqTf7J38R3UJNRgmQbQ== +"@abp/cms-kit@5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-5.3.0-rc.1.tgz#da749badac6681d8049a4d6c522c172fdb72f02b" + integrity sha512-ACKZf69dGti9W8M0ZZWn0UiZA+LlGqQtEx9rkTnzrzma4uePsDvIFvbMGyK8UZLSVGHOVVhE2kN1OGTioeqgGw== dependencies: - "@abp/cms-kit.admin" "~5.2.1" - "@abp/cms-kit.public" "~5.2.1" + "@abp/cms-kit.admin" "~5.3.0-rc.1" + "@abp/cms-kit.public" "~5.3.0-rc.1" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/codemirror@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-5.3.0-rc.1.tgz#20386caeffa7f0a65030a635532935d669fc5295" + integrity sha512-46AeZEeHEvOKjA6KS/SkhiizoLqQUB9cRJfOgT7NKP18OKx5ra4+Cj2CGtoq2N+FjuA7hgdnbbjX8E1GkfHAPg== dependencies: - "@abp/utils" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" + codemirror "^5.65.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" + +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== + dependencies: + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/highlight.js@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-5.2.1.tgz#345e826047b2e87861d08b5ca2a9e5a313c22bda" - integrity sha512-Pi/pMWqdvdBr0E63UrhapuUtNNoY9Jt3R1Py52JQ0r90r53k5fmYOIaSwmaFlVZ8T/JApJt2D9i0Z4k8Tcn7Vg== +"@abp/highlight.js@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-5.3.0-rc.1.tgz#a6dad18c759ff4c1488b6aef4898d88d55e0ce1a" + integrity sha512-z4vvoETKcciumaED4hnpgrUnjWhtRejG+nW/er+X1dxrUJk58oh6ReFs0/xb+xlrKc/ALOYTh0VY5LBU2KU5Qw== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@highlightjs/cdn-assets" "~11.4.0" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/jstree@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-5.2.1.tgz#27f8c80053fbd7f5b242cc144b3ebdc33a668b9d" - integrity sha512-KYcdkjm33OEOBH/HHgOvIoVX8Bg/KlTJ4muyWYzPK0JK8T61rjrAw8cnlvMl5fqnuzdUUWFgfpuZq7HhgU30NQ== +"@abp/jstree@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-5.3.0-rc.1.tgz#e6c4a3ed1afe23ba3029674833c3135ac37dceda" + integrity sha512-MKJX2IXtTijjNfGNoy486/XdQ7nncIaoUSAZUcah0NXP1cyBC+PMl+zI9y1G/nJsAjX7zSpmWh8TXkbP20HZBQ== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jstree "^3.3.12" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/slugify@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-5.2.1.tgz#97c8b54fcfc271e7fb2f1697fafa3dff30ba6891" - integrity sha512-e/QxzbeOJYgKdYJQSCeP7QnnraLEafxB/AAzQDDJH2hKid9lNDeUxjggw/xCSiiRCG9Qz8OYuei6bNaYDHcxbQ== +"@abp/slugify@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-5.3.0-rc.1.tgz#dfebf924365d8627a6dae770394396ffa383a960" + integrity sha512-gPHLGVfrXSiuUMxEdPpZm6ie+ZkOVk2SXb9B2/+ndL+Wy8FYJiP6v2xn0SJ3ENqGL4nvuZdDOfAGKbrICpb/Pg== dependencies: slugify "^1.6.5" -"@abp/star-rating-svg@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-5.2.1.tgz#f8cd6a965079acfa3633731eacf653e142886c1e" - integrity sha512-QofOzA0kjpXEm80tkxBptKYTUZa4uolHRy4KNTzDFdcf8TyC6hT8I6kmUS9ym7F3HKLjLhDWfRsd1kKaDwxzQw== +"@abp/star-rating-svg@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-5.3.0-rc.1.tgz#1589d7407932c6113312a6dbc43be32363363314" + integrity sha512-o7fP05qMm7OP9A1TPf5ysSqnujC6WWMQEUceIqRdp2UWiLKd8c/3GrtLbA+NDDN7ddES8JPrU98ENdfRxqb6CA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/tui-editor@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.2.1.tgz#06be1a029de754868fa11ce3479be3fbc90ba103" - integrity sha512-Mi3preBkGEU1hrtSNCkOjeXPc9c74DFt8BL82sPIVDglYcVrVLXbnNTWE/CHP0spmKWh33ek4FoH1Pt0TePMuw== +"@abp/tui-editor@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0-rc.1.tgz#d5b6e46c922e9743216395bc055ed8208c2ead0b" + integrity sha512-wMEph23kwGJyAGweivKn2EDTRQQD0UG0X23qMd4Cv285qdu4AoYL2/shBDFKiXfhN0Q7EZ06mhOyTuhJmTnNUg== dependencies: - "@abp/jquery" "~5.2.1" - "@abp/prismjs" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" -"@abp/uppy@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-5.2.1.tgz#560bbb363a0b0b493cc2f1c20f4f7b51e95cb331" - integrity sha512-cLqeGHrfwuOgPKjIBTq7H/l3P494sEgmrdH3UW9wVIjD5OAIbK/2AeZ2xTIIg0Mn+ALm+rqfsw0+qBoBug1WHQ== +"@abp/uppy@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-5.3.0-rc.1.tgz#19f2e09eb6a34e70e08f7d79189624012ab265dd" + integrity sha512-a4V1MzvLdCfI4va8U7nxvUfsh/+h4UG+Utu/HFJ2iHPpH/cj/xIBbCWljDt4uToHUIiZ2kXVCE+0TfWiYV+JJQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" uppy "^1.16.1" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" @@ -999,6 +1008,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codemirror@^5.65.1: + version "5.65.3" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.3.tgz#2d029930d5a293bc5fb96ceea64654803c0d4ac7" + integrity sha512-kCC0iwGZOVZXHEKW3NDTObvM7pTIyowjty4BUqeREROc/3I6bWbgZDA3fGDwlA+rbgRjvnRnfqs9SfXynel1AQ== + collection-map@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 2ec4d524e2..bfd84f86a8 100644 --- a/modules/docs/app/VoloDocs.Web/package.json +++ b/modules/docs/app/VoloDocs.Web/package.json @@ -3,7 +3,7 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/docs": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/docs": "^5.3.0-rc.1" } } diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md index 6329ab4686..2d792fe64d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md @@ -1,40 +1,129 @@ # Prism Changelog +## 1.28.0 (2022-04-17) + +### New components + +* __Ado__ & __Mata__ (Stata) ([#3383](https://github.com/PrismJS/prism/issues/3383)) [`63806d57`](https://github.com/PrismJS/prism/commit/63806d57) +* __ARM Assembly__ ([#3376](https://github.com/PrismJS/prism/issues/3376)) [`554ff324`](https://github.com/PrismJS/prism/commit/554ff324) +* __Arturo__ ([#3403](https://github.com/PrismJS/prism/issues/3403)) [`e2fe1f79`](https://github.com/PrismJS/prism/commit/e2fe1f79) +* __AWK__ & __GAWK__ ([#3374](https://github.com/PrismJS/prism/issues/3374)) [`ea8a0f40`](https://github.com/PrismJS/prism/commit/ea8a0f40) +* __Cooklang__ ([#3337](https://github.com/PrismJS/prism/issues/3337)) [`4eb928c3`](https://github.com/PrismJS/prism/commit/4eb928c3) +* __CUE__ ([#3375](https://github.com/PrismJS/prism/issues/3375)) [`a1340666`](https://github.com/PrismJS/prism/commit/a1340666) +* __gettext__ ([#3369](https://github.com/PrismJS/prism/issues/3369)) [`dfef9b61`](https://github.com/PrismJS/prism/commit/dfef9b61) +* __GNU Linker Script__ ([#3373](https://github.com/PrismJS/prism/issues/3373)) [`33f2cf95`](https://github.com/PrismJS/prism/commit/33f2cf95) +* __Odin__ ([#3424](https://github.com/PrismJS/prism/issues/3424)) [`8a3fef6d`](https://github.com/PrismJS/prism/commit/8a3fef6d) +* __PlantUML__ ([#3372](https://github.com/PrismJS/prism/issues/3372)) [`0d49553c`](https://github.com/PrismJS/prism/commit/0d49553c) +* __ReScript__ ([#3435](https://github.com/PrismJS/prism/issues/3435)) [`cbef9af7`](https://github.com/PrismJS/prism/commit/cbef9af7) +* __SuperCollider__ ([#3371](https://github.com/PrismJS/prism/issues/3371)) [`1b1d6731`](https://github.com/PrismJS/prism/commit/1b1d6731) + +### Updated components + +* __.properties__ + * Use `key`, `value` for token names; `attr-name`, `attr-value` as aliases ([#3377](https://github.com/PrismJS/prism/issues/3377)) [`b94a664d`](https://github.com/PrismJS/prism/commit/b94a664d) +* __ABAP__ + * Sorted keyword list ([#3368](https://github.com/PrismJS/prism/issues/3368)) [`7bda2bf1`](https://github.com/PrismJS/prism/commit/7bda2bf1) +* __Ada__ + * Changed `attr-name` to `attribute`; Use `attr-name` as alias ([#3381](https://github.com/PrismJS/prism/issues/3381)) [`cde0b5b2`](https://github.com/PrismJS/prism/commit/cde0b5b2) + * Added `or` keyword ([#3380](https://github.com/PrismJS/prism/issues/3380)) [`c30b736f`](https://github.com/PrismJS/prism/commit/c30b736f) +* __Atmel AVR Assembly__ + * Fixed `&=` and `|=` operators ([#3395](https://github.com/PrismJS/prism/issues/3395)) [`8c4ae5a5`](https://github.com/PrismJS/prism/commit/8c4ae5a5) +* __AutoHotkey__ + * Use standard tokens ([#3385](https://github.com/PrismJS/prism/issues/3385)) [`61c460e8`](https://github.com/PrismJS/prism/commit/61c460e8) + * Use general pattern instead of name list for directives ([#3384](https://github.com/PrismJS/prism/issues/3384)) [`7ac84dda`](https://github.com/PrismJS/prism/commit/7ac84dda) +* __CFScript__ + * Simplified operator regex ([#3396](https://github.com/PrismJS/prism/issues/3396)) [`6a215fe0`](https://github.com/PrismJS/prism/commit/6a215fe0) +* __CMake__ + * Simplified `variable` and `operator` regexes ([#3398](https://github.com/PrismJS/prism/issues/3398)) [`8e59744b`](https://github.com/PrismJS/prism/commit/8e59744b) +* __Erlang__ + * Added `begin` keyword ([#3387](https://github.com/PrismJS/prism/issues/3387)) [`cf38d059`](https://github.com/PrismJS/prism/commit/cf38d059) +* __Excel Formula__ + * Use more fitting aliases for `function-name`, `range`, and `cell` ([#3391](https://github.com/PrismJS/prism/issues/3391)) [`ef0ec02a`](https://github.com/PrismJS/prism/commit/ef0ec02a) +* __Flow__ + * Changed alias of `type` to `class-name` ([#3390](https://github.com/PrismJS/prism/issues/3390)) [`ce41434d`](https://github.com/PrismJS/prism/commit/ce41434d) + * Recognise `[Ss]ymbol` as a type ([#3388](https://github.com/PrismJS/prism/issues/3388)) [`3916883a`](https://github.com/PrismJS/prism/commit/3916883a) +* __GEDCOM__ + * Update `tag` to `record` ([#3386](https://github.com/PrismJS/prism/issues/3386)) [`f8f95340`](https://github.com/PrismJS/prism/commit/f8f95340) +* __Groovy__ + * Added string interpolation without hook ([#3366](https://github.com/PrismJS/prism/issues/3366)) [`5617765f`](https://github.com/PrismJS/prism/commit/5617765f) +* __Handlebars__ + * Added Mustache alias ([#3422](https://github.com/PrismJS/prism/issues/3422)) [`cb5229af`](https://github.com/PrismJS/prism/commit/cb5229af) +* __Java__ + * Improved class name detection ([#3351](https://github.com/PrismJS/prism/issues/3351)) [`4cb3d038`](https://github.com/PrismJS/prism/commit/4cb3d038) + * Fixed `record` false positives ([#3348](https://github.com/PrismJS/prism/issues/3348)) [`3bd8fdb1`](https://github.com/PrismJS/prism/commit/3bd8fdb1) +* __JavaScript__ + * Added support for new regex syntax ([#3399](https://github.com/PrismJS/prism/issues/3399)) [`ca78cde6`](https://github.com/PrismJS/prism/commit/ca78cde6) +* __Keyman__ + * Added new keywords ([#3401](https://github.com/PrismJS/prism/issues/3401)) [`bac36827`](https://github.com/PrismJS/prism/commit/bac36827) +* __MEL__ + * Improved functions, code, and comments ([#3393](https://github.com/PrismJS/prism/issues/3393)) [`8e648dab`](https://github.com/PrismJS/prism/commit/8e648dab) +* __NEON__ + * Change alias of `key` to `property` ([#3394](https://github.com/PrismJS/prism/issues/3394)) [`1c533f4a`](https://github.com/PrismJS/prism/commit/1c533f4a) +* __PHP__ + * Added `never` return type + minor fix of named arguments ([#3421](https://github.com/PrismJS/prism/issues/3421)) [`4ffab525`](https://github.com/PrismJS/prism/commit/4ffab525) + * Added `readonly` keyword ([#3349](https://github.com/PrismJS/prism/issues/3349)) [`4c3f1969`](https://github.com/PrismJS/prism/commit/4c3f1969) +* __PureBasic__ + * Added support for pointer to string operator ([#3362](https://github.com/PrismJS/prism/issues/3362)) [`499b1fa0`](https://github.com/PrismJS/prism/commit/499b1fa0) +* __Razor C#__ + * Added support for `@helper` and inline C# inside attribute values ([#3355](https://github.com/PrismJS/prism/issues/3355)) [`31a38d0c`](https://github.com/PrismJS/prism/commit/31a38d0c) +* __VHDL__ + * Add `private`, `view` keywords; Distinguish `attribute` from `keyword` ([#3389](https://github.com/PrismJS/prism/issues/3389)) [`d1a5ce30`](https://github.com/PrismJS/prism/commit/d1a5ce30) +* __Wolfram language__ + * Simplified `operator` regex ([#3397](https://github.com/PrismJS/prism/issues/3397)) [`10ae6da3`](https://github.com/PrismJS/prism/commit/10ae6da3) + +### Updated plugins + +* __Autolinker__ + * Fixed URL regex to match more valid URLs ([#3358](https://github.com/PrismJS/prism/issues/3358)) [`17ed9160`](https://github.com/PrismJS/prism/commit/17ed9160) +* __Command Line__ + * Add support for command continuation prefix ([#3344](https://github.com/PrismJS/prism/issues/3344)) [`b53832cd`](https://github.com/PrismJS/prism/commit/b53832cd) + * Increased prompt opacity ([#3352](https://github.com/PrismJS/prism/issues/3352)) [`f95dd190`](https://github.com/PrismJS/prism/commit/f95dd190) +* __Keep Markup__ + * Use original nodes instead of clones ([#3365](https://github.com/PrismJS/prism/issues/3365)) [`8a843a17`](https://github.com/PrismJS/prism/commit/8a843a17) + +### Other + +* __Infrastructure__ + * Use terser ([#3407](https://github.com/PrismJS/prism/issues/3407)) [`11c54624`](https://github.com/PrismJS/prism/commit/11c54624) + * Tests: Cache results for exp backtracking check ([#3356](https://github.com/PrismJS/prism/issues/3356)) [`ead22e1e`](https://github.com/PrismJS/prism/commit/ead22e1e) +* __Website__ + * More documentation for language definitons ([#3427](https://github.com/PrismJS/prism/issues/3427)) [`333bd590`](https://github.com/PrismJS/prism/commit/333bd590) + ## 1.27.0 (2022-02-17) ### New components -* __UO Razor Script__ (#3309) [`3f8cc5a0`](https://github.com/PrismJS/prism/commit/3f8cc5a0) +* __UO Razor Script__ ([#3309](https://github.com/PrismJS/prism/issues/3309)) [`3f8cc5a0`](https://github.com/PrismJS/prism/commit/3f8cc5a0) ### Updated components * __AutoIt__ - * Allow hyphen in directive (#3308) [`bcb2e2c8`](https://github.com/PrismJS/prism/commit/bcb2e2c8) + * Allow hyphen in directive ([#3308](https://github.com/PrismJS/prism/issues/3308)) [`bcb2e2c8`](https://github.com/PrismJS/prism/commit/bcb2e2c8) * __EditorConfig__ - * Change alias of `section` from `keyword` to `selector` (#3305) [`e46501b9`](https://github.com/PrismJS/prism/commit/e46501b9) + * Change alias of `section` from `keyword` to `selector` ([#3305](https://github.com/PrismJS/prism/issues/3305)) [`e46501b9`](https://github.com/PrismJS/prism/commit/e46501b9) * __Ini__ - * Swap out `header` for `section` (#3304) [`deb3a97f`](https://github.com/PrismJS/prism/commit/deb3a97f) + * Swap out `header` for `section` ([#3304](https://github.com/PrismJS/prism/issues/3304)) [`deb3a97f`](https://github.com/PrismJS/prism/commit/deb3a97f) * __MongoDB__ - * Added v5 support (#3297) [`8458c41f`](https://github.com/PrismJS/prism/commit/8458c41f) + * Added v5 support ([#3297](https://github.com/PrismJS/prism/issues/3297)) [`8458c41f`](https://github.com/PrismJS/prism/commit/8458c41f) * __PureBasic__ - * Added missing keyword and fixed constants ending with `$` (#3320) [`d6c53726`](https://github.com/PrismJS/prism/commit/d6c53726) + * Added missing keyword and fixed constants ending with `$` ([#3320](https://github.com/PrismJS/prism/issues/3320)) [`d6c53726`](https://github.com/PrismJS/prism/commit/d6c53726) * __Scala__ - * Added support for interpolated strings (#3293) [`441a1422`](https://github.com/PrismJS/prism/commit/441a1422) + * Added support for interpolated strings ([#3293](https://github.com/PrismJS/prism/issues/3293)) [`441a1422`](https://github.com/PrismJS/prism/commit/441a1422) * __Systemd configuration file__ - * Swap out `operator` for `punctuation` (#3306) [`2eb89e15`](https://github.com/PrismJS/prism/commit/2eb89e15) + * Swap out `operator` for `punctuation` ([#3306](https://github.com/PrismJS/prism/issues/3306)) [`2eb89e15`](https://github.com/PrismJS/prism/commit/2eb89e15) ### Updated plugins * __Command Line__ - * Escape markup in command line output (#3341) [`e002e78c`](https://github.com/PrismJS/prism/commit/e002e78c) - * Add support for line continuation and improved colors (#3326) [`1784b175`](https://github.com/PrismJS/prism/commit/1784b175) - * Added span around command and output (#3312) [`82d0ca15`](https://github.com/PrismJS/prism/commit/82d0ca15) + * Escape markup in command line output ([#3341](https://github.com/PrismJS/prism/issues/3341)) [`e002e78c`](https://github.com/PrismJS/prism/commit/e002e78c) + * Add support for line continuation and improved colors ([#3326](https://github.com/PrismJS/prism/issues/3326)) [`1784b175`](https://github.com/PrismJS/prism/commit/1784b175) + * Added span around command and output ([#3312](https://github.com/PrismJS/prism/issues/3312)) [`82d0ca15`](https://github.com/PrismJS/prism/commit/82d0ca15) ### Other * __Core__ - * Added better error message for missing grammars (#3311) [`2cc4660b`](https://github.com/PrismJS/prism/commit/2cc4660b) + * Added better error message for missing grammars ([#3311](https://github.com/PrismJS/prism/issues/3311)) [`2cc4660b`](https://github.com/PrismJS/prism/commit/2cc4660b) ## 1.26.0 (2022-01-06) diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js index 6d3c1562e0..d58ff9037b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js @@ -1,2 +1,2 @@ -var components = {"core":{"meta":{"path":"components/prism-core.js","option":"mandatory"},"core":"Core"},"themes":{"meta":{"path":"themes/{id}.css","link":"index.html?theme={id}","exclusive":true},"prism":{"title":"Default","option":"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{"title":"Okaidia","owner":"ocodia"},"prism-twilight":{"title":"Twilight","owner":"remybach"},"prism-coy":{"title":"Coy","owner":"tshedor"},"prism-solarizedlight":{"title":"Solarized Light","owner":"hectormatos2011 "},"prism-tomorrow":{"title":"Tomorrow Night","owner":"Rosey"}},"languages":{"meta":{"path":"components/prism-{id}","noCSS":true,"examplesPath":"examples/prism-{id}","addCheckAll":true},"markup":{"title":"Markup","alias":["html","xml","svg","mathml","ssml","atom","rss"],"aliasTitles":{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","ssml":"SSML","atom":"Atom","rss":"RSS"},"option":"default"},"css":{"title":"CSS","option":"default","modify":"markup"},"clike":{"title":"C-like","option":"default"},"javascript":{"title":"JavaScript","require":"clike","modify":"markup","optional":"regex","alias":"js","option":"default"},"abap":{"title":"ABAP","owner":"dellagustin"},"abnf":{"title":"ABNF","owner":"RunDevelopment"},"actionscript":{"title":"ActionScript","require":"javascript","modify":"markup","owner":"Golmote"},"ada":{"title":"Ada","owner":"Lucretia"},"agda":{"title":"Agda","owner":"xy-ren"},"al":{"title":"AL","owner":"RunDevelopment"},"antlr4":{"title":"ANTLR4","alias":"g4","owner":"RunDevelopment"},"apacheconf":{"title":"Apache Configuration","owner":"GuiTeK"},"apex":{"title":"Apex","require":["clike","sql"],"owner":"RunDevelopment"},"apl":{"title":"APL","owner":"ngn"},"applescript":{"title":"AppleScript","owner":"Golmote"},"aql":{"title":"AQL","owner":"RunDevelopment"},"arduino":{"title":"Arduino","require":"cpp","alias":"ino","owner":"dkern"},"arff":{"title":"ARFF","owner":"Golmote"},"asciidoc":{"alias":"adoc","title":"AsciiDoc","owner":"Golmote"},"aspnet":{"title":"ASP.NET (C#)","require":["markup","csharp"],"owner":"nauzilus"},"asm6502":{"title":"6502 Assembly","owner":"kzurawel"},"asmatmel":{"title":"Atmel AVR Assembly","owner":"cerkit"},"autohotkey":{"title":"AutoHotkey","owner":"aviaryan"},"autoit":{"title":"AutoIt","owner":"Golmote"},"avisynth":{"title":"AviSynth","alias":"avs","owner":"Zinfidel"},"avro-idl":{"title":"Avro IDL","alias":"avdl","owner":"RunDevelopment"},"bash":{"title":"Bash","alias":"shell","aliasTitles":{"shell":"Shell"},"owner":"zeitgeist87"},"basic":{"title":"BASIC","owner":"Golmote"},"batch":{"title":"Batch","owner":"Golmote"},"bbcode":{"title":"BBcode","alias":"shortcode","aliasTitles":{"shortcode":"Shortcode"},"owner":"RunDevelopment"},"bicep":{"title":"Bicep","owner":"johnnyreilly"},"birb":{"title":"Birb","require":"clike","owner":"Calamity210"},"bison":{"title":"Bison","require":"c","owner":"Golmote"},"bnf":{"title":"BNF","alias":"rbnf","aliasTitles":{"rbnf":"RBNF"},"owner":"RunDevelopment"},"brainfuck":{"title":"Brainfuck","owner":"Golmote"},"brightscript":{"title":"BrightScript","owner":"RunDevelopment"},"bro":{"title":"Bro","owner":"wayward710"},"bsl":{"title":"BSL (1C:Enterprise)","alias":"oscript","aliasTitles":{"oscript":"OneScript"},"owner":"Diversus23"},"c":{"title":"C","require":"clike","owner":"zeitgeist87"},"csharp":{"title":"C#","require":"clike","alias":["cs","dotnet"],"owner":"mvalipour"},"cpp":{"title":"C++","require":"c","owner":"zeitgeist87"},"cfscript":{"title":"CFScript","require":"clike","alias":"cfc","owner":"mjclemente"},"chaiscript":{"title":"ChaiScript","require":["clike","cpp"],"owner":"RunDevelopment"},"cil":{"title":"CIL","owner":"sbrl"},"clojure":{"title":"Clojure","owner":"troglotit"},"cmake":{"title":"CMake","owner":"mjrogozinski"},"cobol":{"title":"COBOL","owner":"RunDevelopment"},"coffeescript":{"title":"CoffeeScript","require":"javascript","alias":"coffee","owner":"R-osey"},"concurnas":{"title":"Concurnas","alias":"conc","owner":"jasontatton"},"csp":{"title":"Content-Security-Policy","owner":"ScottHelme"},"coq":{"title":"Coq","owner":"RunDevelopment"},"crystal":{"title":"Crystal","require":"ruby","owner":"MakeNowJust"},"css-extras":{"title":"CSS Extras","require":"css","modify":"css","owner":"milesj"},"csv":{"title":"CSV","owner":"RunDevelopment"},"cypher":{"title":"Cypher","owner":"RunDevelopment"},"d":{"title":"D","require":"clike","owner":"Golmote"},"dart":{"title":"Dart","require":"clike","owner":"Golmote"},"dataweave":{"title":"DataWeave","owner":"machaval"},"dax":{"title":"DAX","owner":"peterbud"},"dhall":{"title":"Dhall","owner":"RunDevelopment"},"diff":{"title":"Diff","owner":"uranusjr"},"django":{"title":"Django/Jinja2","require":"markup-templating","alias":"jinja2","owner":"romanvm"},"dns-zone-file":{"title":"DNS zone file","owner":"RunDevelopment","alias":"dns-zone"},"docker":{"title":"Docker","alias":"dockerfile","owner":"JustinBeckwith"},"dot":{"title":"DOT (Graphviz)","alias":"gv","optional":"markup","owner":"RunDevelopment"},"ebnf":{"title":"EBNF","owner":"RunDevelopment"},"editorconfig":{"title":"EditorConfig","owner":"osipxd"},"eiffel":{"title":"Eiffel","owner":"Conaclos"},"ejs":{"title":"EJS","require":["javascript","markup-templating"],"owner":"RunDevelopment","alias":"eta","aliasTitles":{"eta":"Eta"}},"elixir":{"title":"Elixir","owner":"Golmote"},"elm":{"title":"Elm","owner":"zwilias"},"etlua":{"title":"Embedded Lua templating","require":["lua","markup-templating"],"owner":"RunDevelopment"},"erb":{"title":"ERB","require":["ruby","markup-templating"],"owner":"Golmote"},"erlang":{"title":"Erlang","owner":"Golmote"},"excel-formula":{"title":"Excel Formula","alias":["xlsx","xls"],"owner":"RunDevelopment"},"fsharp":{"title":"F#","require":"clike","owner":"simonreynolds7"},"factor":{"title":"Factor","owner":"catb0t"},"false":{"title":"False","owner":"edukisto"},"firestore-security-rules":{"title":"Firestore security rules","require":"clike","owner":"RunDevelopment"},"flow":{"title":"Flow","require":"javascript","owner":"Golmote"},"fortran":{"title":"Fortran","owner":"Golmote"},"ftl":{"title":"FreeMarker Template Language","require":"markup-templating","owner":"RunDevelopment"},"gml":{"title":"GameMaker Language","alias":"gamemakerlanguage","require":"clike","owner":"LiarOnce"},"gap":{"title":"GAP (CAS)","owner":"RunDevelopment"},"gcode":{"title":"G-code","owner":"RunDevelopment"},"gdscript":{"title":"GDScript","owner":"RunDevelopment"},"gedcom":{"title":"GEDCOM","owner":"Golmote"},"gherkin":{"title":"Gherkin","owner":"hason"},"git":{"title":"Git","owner":"lgiraudel"},"glsl":{"title":"GLSL","require":"c","owner":"Golmote"},"gn":{"title":"GN","alias":"gni","owner":"RunDevelopment"},"go":{"title":"Go","require":"clike","owner":"arnehormann"},"go-module":{"title":"Go module","alias":"go-mod","owner":"RunDevelopment"},"graphql":{"title":"GraphQL","optional":"markdown","owner":"Golmote"},"groovy":{"title":"Groovy","require":"clike","owner":"robfletcher"},"haml":{"title":"Haml","require":"ruby","optional":["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],"owner":"Golmote"},"handlebars":{"title":"Handlebars","require":"markup-templating","alias":"hbs","owner":"Golmote"},"haskell":{"title":"Haskell","alias":"hs","owner":"bholst"},"haxe":{"title":"Haxe","require":"clike","optional":"regex","owner":"Golmote"},"hcl":{"title":"HCL","owner":"outsideris"},"hlsl":{"title":"HLSL","require":"c","owner":"RunDevelopment"},"hoon":{"title":"Hoon","owner":"matildepark"},"http":{"title":"HTTP","optional":["csp","css","hpkp","hsts","javascript","json","markup","uri"],"owner":"danielgtaylor"},"hpkp":{"title":"HTTP Public-Key-Pins","owner":"ScottHelme"},"hsts":{"title":"HTTP Strict-Transport-Security","owner":"ScottHelme"},"ichigojam":{"title":"IchigoJam","owner":"BlueCocoa"},"icon":{"title":"Icon","owner":"Golmote"},"icu-message-format":{"title":"ICU Message Format","owner":"RunDevelopment"},"idris":{"title":"Idris","alias":"idr","owner":"KeenS","require":"haskell"},"ignore":{"title":".ignore","owner":"osipxd","alias":["gitignore","hgignore","npmignore"],"aliasTitles":{"gitignore":".gitignore","hgignore":".hgignore","npmignore":".npmignore"}},"inform7":{"title":"Inform 7","owner":"Golmote"},"ini":{"title":"Ini","owner":"aviaryan"},"io":{"title":"Io","owner":"AlesTsurko"},"j":{"title":"J","owner":"Golmote"},"java":{"title":"Java","require":"clike","owner":"sherblot"},"javadoc":{"title":"JavaDoc","require":["markup","java","javadoclike"],"modify":"java","optional":"scala","owner":"RunDevelopment"},"javadoclike":{"title":"JavaDoc-like","modify":["java","javascript","php"],"owner":"RunDevelopment"},"javastacktrace":{"title":"Java stack trace","owner":"RunDevelopment"},"jexl":{"title":"Jexl","owner":"czosel"},"jolie":{"title":"Jolie","require":"clike","owner":"thesave"},"jq":{"title":"JQ","owner":"RunDevelopment"},"jsdoc":{"title":"JSDoc","require":["javascript","javadoclike","typescript"],"modify":"javascript","optional":["actionscript","coffeescript"],"owner":"RunDevelopment"},"js-extras":{"title":"JS Extras","require":"javascript","modify":"javascript","optional":["actionscript","coffeescript","flow","n4js","typescript"],"owner":"RunDevelopment"},"json":{"title":"JSON","alias":"webmanifest","aliasTitles":{"webmanifest":"Web App Manifest"},"owner":"CupOfTea696"},"json5":{"title":"JSON5","require":"json","owner":"RunDevelopment"},"jsonp":{"title":"JSONP","require":"json","owner":"RunDevelopment"},"jsstacktrace":{"title":"JS stack trace","owner":"sbrl"},"js-templates":{"title":"JS Templates","require":"javascript","modify":"javascript","optional":["css","css-extras","graphql","markdown","markup","sql"],"owner":"RunDevelopment"},"julia":{"title":"Julia","owner":"cdagnino"},"keepalived":{"title":"Keepalived Configure","owner":"dev-itsheng"},"keyman":{"title":"Keyman","owner":"mcdurdin"},"kotlin":{"title":"Kotlin","alias":["kt","kts"],"aliasTitles":{"kts":"Kotlin Script"},"require":"clike","owner":"Golmote"},"kumir":{"title":"KuMir (КуМир)","alias":"kum","owner":"edukisto"},"kusto":{"title":"Kusto","owner":"RunDevelopment"},"latex":{"title":"LaTeX","alias":["tex","context"],"aliasTitles":{"tex":"TeX","context":"ConTeXt"},"owner":"japborst"},"latte":{"title":"Latte","require":["clike","markup-templating","php"],"owner":"nette"},"less":{"title":"Less","require":"css","optional":"css-extras","owner":"Golmote"},"lilypond":{"title":"LilyPond","require":"scheme","alias":"ly","owner":"RunDevelopment"},"liquid":{"title":"Liquid","require":"markup-templating","owner":"cinhtau"},"lisp":{"title":"Lisp","alias":["emacs","elisp","emacs-lisp"],"owner":"JuanCaicedo"},"livescript":{"title":"LiveScript","owner":"Golmote"},"llvm":{"title":"LLVM IR","owner":"porglezomp"},"log":{"title":"Log file","optional":"javastacktrace","owner":"RunDevelopment"},"lolcode":{"title":"LOLCODE","owner":"Golmote"},"lua":{"title":"Lua","owner":"Golmote"},"magma":{"title":"Magma (CAS)","owner":"RunDevelopment"},"makefile":{"title":"Makefile","owner":"Golmote"},"markdown":{"title":"Markdown","require":"markup","optional":"yaml","alias":"md","owner":"Golmote"},"markup-templating":{"title":"Markup templating","require":"markup","owner":"Golmote"},"matlab":{"title":"MATLAB","owner":"Golmote"},"maxscript":{"title":"MAXScript","owner":"RunDevelopment"},"mel":{"title":"MEL","owner":"Golmote"},"mermaid":{"title":"Mermaid","owner":"RunDevelopment"},"mizar":{"title":"Mizar","owner":"Golmote"},"mongodb":{"title":"MongoDB","owner":"airs0urce","require":"javascript"},"monkey":{"title":"Monkey","owner":"Golmote"},"moonscript":{"title":"MoonScript","alias":"moon","owner":"RunDevelopment"},"n1ql":{"title":"N1QL","owner":"TMWilds"},"n4js":{"title":"N4JS","require":"javascript","optional":"jsdoc","alias":"n4jsd","owner":"bsmith-n4"},"nand2tetris-hdl":{"title":"Nand To Tetris HDL","owner":"stephanmax"},"naniscript":{"title":"Naninovel Script","owner":"Elringus","alias":"nani"},"nasm":{"title":"NASM","owner":"rbmj"},"neon":{"title":"NEON","owner":"nette"},"nevod":{"title":"Nevod","owner":"nezaboodka"},"nginx":{"title":"nginx","owner":"volado"},"nim":{"title":"Nim","owner":"Golmote"},"nix":{"title":"Nix","owner":"Golmote"},"nsis":{"title":"NSIS","owner":"idleberg"},"objectivec":{"title":"Objective-C","require":"c","alias":"objc","owner":"uranusjr"},"ocaml":{"title":"OCaml","owner":"Golmote"},"opencl":{"title":"OpenCL","require":"c","modify":["c","cpp"],"owner":"Milania1"},"openqasm":{"title":"OpenQasm","alias":"qasm","owner":"RunDevelopment"},"oz":{"title":"Oz","owner":"Golmote"},"parigp":{"title":"PARI/GP","owner":"Golmote"},"parser":{"title":"Parser","require":"markup","owner":"Golmote"},"pascal":{"title":"Pascal","alias":"objectpascal","aliasTitles":{"objectpascal":"Object Pascal"},"owner":"Golmote"},"pascaligo":{"title":"Pascaligo","owner":"DefinitelyNotAGoat"},"psl":{"title":"PATROL Scripting Language","owner":"bertysentry"},"pcaxis":{"title":"PC-Axis","alias":"px","owner":"RunDevelopment"},"peoplecode":{"title":"PeopleCode","alias":"pcode","owner":"RunDevelopment"},"perl":{"title":"Perl","owner":"Golmote"},"php":{"title":"PHP","require":"markup-templating","owner":"milesj"},"phpdoc":{"title":"PHPDoc","require":["php","javadoclike"],"modify":"php","owner":"RunDevelopment"},"php-extras":{"title":"PHP Extras","require":"php","modify":"php","owner":"milesj"},"plsql":{"title":"PL/SQL","require":"sql","owner":"Golmote"},"powerquery":{"title":"PowerQuery","alias":["pq","mscript"],"owner":"peterbud"},"powershell":{"title":"PowerShell","owner":"nauzilus"},"processing":{"title":"Processing","require":"clike","owner":"Golmote"},"prolog":{"title":"Prolog","owner":"Golmote"},"promql":{"title":"PromQL","owner":"arendjr"},"properties":{"title":".properties","owner":"Golmote"},"protobuf":{"title":"Protocol Buffers","require":"clike","owner":"just-boris"},"pug":{"title":"Pug","require":["markup","javascript"],"optional":["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],"owner":"Golmote"},"puppet":{"title":"Puppet","owner":"Golmote"},"pure":{"title":"Pure","optional":["c","cpp","fortran"],"owner":"Golmote"},"purebasic":{"title":"PureBasic","require":"clike","alias":"pbfasm","owner":"HeX0R101"},"purescript":{"title":"PureScript","require":"haskell","alias":"purs","owner":"sriharshachilakapati"},"python":{"title":"Python","alias":"py","owner":"multipetros"},"qsharp":{"title":"Q#","require":"clike","alias":"qs","owner":"fedonman"},"q":{"title":"Q (kdb+ database)","owner":"Golmote"},"qml":{"title":"QML","require":"javascript","owner":"RunDevelopment"},"qore":{"title":"Qore","require":"clike","owner":"temnroegg"},"r":{"title":"R","owner":"Golmote"},"racket":{"title":"Racket","require":"scheme","alias":"rkt","owner":"RunDevelopment"},"cshtml":{"title":"Razor C#","alias":"razor","require":["markup","csharp"],"optional":["css","css-extras","javascript","js-extras"],"owner":"RunDevelopment"},"jsx":{"title":"React JSX","require":["markup","javascript"],"optional":["jsdoc","js-extras","js-templates"],"owner":"vkbansal"},"tsx":{"title":"React TSX","require":["jsx","typescript"]},"reason":{"title":"Reason","require":"clike","owner":"Golmote"},"regex":{"title":"Regex","owner":"RunDevelopment"},"rego":{"title":"Rego","owner":"JordanSh"},"renpy":{"title":"Ren'py","alias":"rpy","owner":"HyuchiaDiego"},"rest":{"title":"reST (reStructuredText)","owner":"Golmote"},"rip":{"title":"Rip","owner":"ravinggenius"},"roboconf":{"title":"Roboconf","owner":"Golmote"},"robotframework":{"title":"Robot Framework","alias":"robot","owner":"RunDevelopment"},"ruby":{"title":"Ruby","require":"clike","alias":"rb","owner":"samflores"},"rust":{"title":"Rust","owner":"Golmote"},"sas":{"title":"SAS","optional":["groovy","lua","sql"],"owner":"Golmote"},"sass":{"title":"Sass (Sass)","require":"css","optional":"css-extras","owner":"Golmote"},"scss":{"title":"Sass (Scss)","require":"css","optional":"css-extras","owner":"MoOx"},"scala":{"title":"Scala","require":"java","owner":"jozic"},"scheme":{"title":"Scheme","owner":"bacchus123"},"shell-session":{"title":"Shell session","require":"bash","alias":["sh-session","shellsession"],"owner":"RunDevelopment"},"smali":{"title":"Smali","owner":"RunDevelopment"},"smalltalk":{"title":"Smalltalk","owner":"Golmote"},"smarty":{"title":"Smarty","require":"markup-templating","optional":"php","owner":"Golmote"},"sml":{"title":"SML","alias":"smlnj","aliasTitles":{"smlnj":"SML/NJ"},"owner":"RunDevelopment"},"solidity":{"title":"Solidity (Ethereum)","alias":"sol","require":"clike","owner":"glachaud"},"solution-file":{"title":"Solution file","alias":"sln","owner":"RunDevelopment"},"soy":{"title":"Soy (Closure Template)","require":"markup-templating","owner":"Golmote"},"sparql":{"title":"SPARQL","require":"turtle","owner":"Triply-Dev","alias":"rq"},"splunk-spl":{"title":"Splunk SPL","owner":"RunDevelopment"},"sqf":{"title":"SQF: Status Quo Function (Arma 3)","require":"clike","owner":"RunDevelopment"},"sql":{"title":"SQL","owner":"multipetros"},"squirrel":{"title":"Squirrel","require":"clike","owner":"RunDevelopment"},"stan":{"title":"Stan","owner":"RunDevelopment"},"iecst":{"title":"Structured Text (IEC 61131-3)","owner":"serhioromano"},"stylus":{"title":"Stylus","owner":"vkbansal"},"swift":{"title":"Swift","owner":"chrischares"},"systemd":{"title":"Systemd configuration file","owner":"RunDevelopment"},"t4-templating":{"title":"T4 templating","owner":"RunDevelopment"},"t4-cs":{"title":"T4 Text Templates (C#)","require":["t4-templating","csharp"],"alias":"t4","owner":"RunDevelopment"},"t4-vb":{"title":"T4 Text Templates (VB)","require":["t4-templating","vbnet"],"owner":"RunDevelopment"},"tap":{"title":"TAP","owner":"isaacs","require":"yaml"},"tcl":{"title":"Tcl","owner":"PeterChaplin"},"tt2":{"title":"Template Toolkit 2","require":["clike","markup-templating"],"owner":"gflohr"},"textile":{"title":"Textile","require":"markup","optional":"css","owner":"Golmote"},"toml":{"title":"TOML","owner":"RunDevelopment"},"tremor":{"title":"Tremor","alias":["trickle","troy"],"owner":"darach","aliasTitles":{"trickle":"trickle","troy":"troy"}},"turtle":{"title":"Turtle","alias":"trig","aliasTitles":{"trig":"TriG"},"owner":"jakubklimek"},"twig":{"title":"Twig","require":"markup-templating","owner":"brandonkelly"},"typescript":{"title":"TypeScript","require":"javascript","optional":"js-templates","alias":"ts","owner":"vkbansal"},"typoscript":{"title":"TypoScript","alias":"tsconfig","aliasTitles":{"tsconfig":"TSConfig"},"owner":"dkern"},"unrealscript":{"title":"UnrealScript","alias":["uscript","uc"],"owner":"RunDevelopment"},"uorazor":{"title":"UO Razor Script","owner":"jaseowns"},"uri":{"title":"URI","alias":"url","aliasTitles":{"url":"URL"},"owner":"RunDevelopment"},"v":{"title":"V","require":"clike","owner":"taggon"},"vala":{"title":"Vala","require":"clike","optional":"regex","owner":"TemplarVolk"},"vbnet":{"title":"VB.Net","require":"basic","owner":"Bigsby"},"velocity":{"title":"Velocity","require":"markup","owner":"Golmote"},"verilog":{"title":"Verilog","owner":"a-rey"},"vhdl":{"title":"VHDL","owner":"a-rey"},"vim":{"title":"vim","owner":"westonganger"},"visual-basic":{"title":"Visual Basic","alias":["vb","vba"],"aliasTitles":{"vba":"VBA"},"owner":"Golmote"},"warpscript":{"title":"WarpScript","owner":"RunDevelopment"},"wasm":{"title":"WebAssembly","owner":"Golmote"},"web-idl":{"title":"Web IDL","alias":"webidl","owner":"RunDevelopment"},"wiki":{"title":"Wiki markup","require":"markup","owner":"Golmote"},"wolfram":{"title":"Wolfram language","alias":["mathematica","nb","wl"],"aliasTitles":{"mathematica":"Mathematica","nb":"Mathematica Notebook"},"owner":"msollami"},"wren":{"title":"Wren","owner":"clsource"},"xeora":{"title":"Xeora","require":"markup","alias":"xeoracube","aliasTitles":{"xeoracube":"XeoraCube"},"owner":"freakmaxi"},"xml-doc":{"title":"XML doc (.net)","require":"markup","modify":["csharp","fsharp","vbnet"],"owner":"RunDevelopment"},"xojo":{"title":"Xojo (REALbasic)","owner":"Golmote"},"xquery":{"title":"XQuery","require":"markup","owner":"Golmote"},"yaml":{"title":"YAML","alias":"yml","owner":"hason"},"yang":{"title":"YANG","owner":"RunDevelopment"},"zig":{"title":"Zig","owner":"RunDevelopment"}},"plugins":{"meta":{"path":"plugins/{id}/prism-{id}","link":"plugins/{id}/"},"line-highlight":{"title":"Line Highlight","description":"Highlights specific lines and/or line ranges."},"line-numbers":{"title":"Line Numbers","description":"Line number at the beginning of code lines.","owner":"kuba-kubula"},"show-invisibles":{"title":"Show Invisibles","description":"Show hidden characters such as tabs and line breaks.","optional":["autolinker","data-uri-highlight"]},"autolinker":{"title":"Autolinker","description":"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},"wpd":{"title":"WebPlatform Docs","description":"Makes tokens link to WebPlatform.org documentation. The links open in a new tab."},"custom-class":{"title":"Custom Class","description":"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.","owner":"dvkndn","noCSS":true},"file-highlight":{"title":"File Highlight","description":"Fetch external files and highlight them with Prism. Used on the Prism website itself.","noCSS":true},"show-language":{"title":"Show Language","description":"Display the highlighted language in code blocks (inline code does not show the label).","owner":"nauzilus","noCSS":true,"require":"toolbar"},"jsonp-highlight":{"title":"JSONP Highlight","description":"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).","noCSS":true,"owner":"nauzilus"},"highlight-keywords":{"title":"Highlight Keywords","description":"Adds special CSS classes for each keyword for fine-grained highlighting.","owner":"vkbansal","noCSS":true},"remove-initial-line-feed":{"title":"Remove initial line feed","description":"Removes the initial line feed in code blocks.","owner":"Golmote","noCSS":true},"inline-color":{"title":"Inline color","description":"Adds a small inline preview for colors in style sheets.","require":"css-extras","owner":"RunDevelopment"},"previewers":{"title":"Previewers","description":"Previewers for angles, colors, gradients, easing and time.","require":"css-extras","owner":"Golmote"},"autoloader":{"title":"Autoloader","description":"Automatically loads the needed languages to highlight the code blocks.","owner":"Golmote","noCSS":true},"keep-markup":{"title":"Keep Markup","description":"Prevents custom markup from being dropped out during highlighting.","owner":"Golmote","optional":"normalize-whitespace","noCSS":true},"command-line":{"title":"Command Line","description":"Display a command line with a prompt and, optionally, the output/response from the commands.","owner":"chriswells0"},"unescaped-markup":{"title":"Unescaped Markup","description":"Write markup without having to escape anything."},"normalize-whitespace":{"title":"Normalize Whitespace","description":"Supports multiple operations to normalize whitespace in code blocks.","owner":"zeitgeist87","optional":"unescaped-markup","noCSS":true},"data-uri-highlight":{"title":"Data-URI Highlight","description":"Highlights data-URI contents.","owner":"Golmote","noCSS":true},"toolbar":{"title":"Toolbar","description":"Attach a toolbar for plugins to easily register buttons on the top of a code block.","owner":"mAAdhaTTah"},"copy-to-clipboard":{"title":"Copy to Clipboard Button","description":"Add a button that copies the code block to the clipboard when clicked.","owner":"mAAdhaTTah","require":"toolbar","noCSS":true},"download-button":{"title":"Download Button","description":"A button in the toolbar of a code block adding a convenient way to download a code file.","owner":"Golmote","require":"toolbar","noCSS":true},"match-braces":{"title":"Match braces","description":"Highlights matching braces.","owner":"RunDevelopment"},"diff-highlight":{"title":"Diff Highlight","description":"Highlights the code inside diff blocks.","owner":"RunDevelopment","require":"diff"},"filter-highlight-all":{"title":"Filter highlightAll","description":"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.","owner":"RunDevelopment","noCSS":true},"treeview":{"title":"Treeview","description":"A language with special styles to highlight file system tree structures.","owner":"Golmote"}}}; +var components = {"core":{"meta":{"path":"components/prism-core.js","option":"mandatory"},"core":"Core"},"themes":{"meta":{"path":"themes/{id}.css","link":"index.html?theme={id}","exclusive":true},"prism":{"title":"Default","option":"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{"title":"Okaidia","owner":"ocodia"},"prism-twilight":{"title":"Twilight","owner":"remybach"},"prism-coy":{"title":"Coy","owner":"tshedor"},"prism-solarizedlight":{"title":"Solarized Light","owner":"hectormatos2011 "},"prism-tomorrow":{"title":"Tomorrow Night","owner":"Rosey"}},"languages":{"meta":{"path":"components/prism-{id}","noCSS":true,"examplesPath":"examples/prism-{id}","addCheckAll":true},"markup":{"title":"Markup","alias":["html","xml","svg","mathml","ssml","atom","rss"],"aliasTitles":{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","ssml":"SSML","atom":"Atom","rss":"RSS"},"option":"default"},"css":{"title":"CSS","option":"default","modify":"markup"},"clike":{"title":"C-like","option":"default"},"javascript":{"title":"JavaScript","require":"clike","modify":"markup","optional":"regex","alias":"js","option":"default"},"abap":{"title":"ABAP","owner":"dellagustin"},"abnf":{"title":"ABNF","owner":"RunDevelopment"},"actionscript":{"title":"ActionScript","require":"javascript","modify":"markup","owner":"Golmote"},"ada":{"title":"Ada","owner":"Lucretia"},"agda":{"title":"Agda","owner":"xy-ren"},"al":{"title":"AL","owner":"RunDevelopment"},"antlr4":{"title":"ANTLR4","alias":"g4","owner":"RunDevelopment"},"apacheconf":{"title":"Apache Configuration","owner":"GuiTeK"},"apex":{"title":"Apex","require":["clike","sql"],"owner":"RunDevelopment"},"apl":{"title":"APL","owner":"ngn"},"applescript":{"title":"AppleScript","owner":"Golmote"},"aql":{"title":"AQL","owner":"RunDevelopment"},"arduino":{"title":"Arduino","require":"cpp","alias":"ino","owner":"dkern"},"arff":{"title":"ARFF","owner":"Golmote"},"armasm":{"title":"ARM Assembly","alias":"arm-asm","owner":"RunDevelopment"},"arturo":{"title":"Arturo","alias":"art","optional":["bash","css","javascript","markup","markdown","sql"],"owner":"drkameleon"},"asciidoc":{"alias":"adoc","title":"AsciiDoc","owner":"Golmote"},"aspnet":{"title":"ASP.NET (C#)","require":["markup","csharp"],"owner":"nauzilus"},"asm6502":{"title":"6502 Assembly","owner":"kzurawel"},"asmatmel":{"title":"Atmel AVR Assembly","owner":"cerkit"},"autohotkey":{"title":"AutoHotkey","owner":"aviaryan"},"autoit":{"title":"AutoIt","owner":"Golmote"},"avisynth":{"title":"AviSynth","alias":"avs","owner":"Zinfidel"},"avro-idl":{"title":"Avro IDL","alias":"avdl","owner":"RunDevelopment"},"awk":{"title":"AWK","alias":"gawk","aliasTitles":{"gawk":"GAWK"},"owner":"RunDevelopment"},"bash":{"title":"Bash","alias":"shell","aliasTitles":{"shell":"Shell"},"owner":"zeitgeist87"},"basic":{"title":"BASIC","owner":"Golmote"},"batch":{"title":"Batch","owner":"Golmote"},"bbcode":{"title":"BBcode","alias":"shortcode","aliasTitles":{"shortcode":"Shortcode"},"owner":"RunDevelopment"},"bicep":{"title":"Bicep","owner":"johnnyreilly"},"birb":{"title":"Birb","require":"clike","owner":"Calamity210"},"bison":{"title":"Bison","require":"c","owner":"Golmote"},"bnf":{"title":"BNF","alias":"rbnf","aliasTitles":{"rbnf":"RBNF"},"owner":"RunDevelopment"},"brainfuck":{"title":"Brainfuck","owner":"Golmote"},"brightscript":{"title":"BrightScript","owner":"RunDevelopment"},"bro":{"title":"Bro","owner":"wayward710"},"bsl":{"title":"BSL (1C:Enterprise)","alias":"oscript","aliasTitles":{"oscript":"OneScript"},"owner":"Diversus23"},"c":{"title":"C","require":"clike","owner":"zeitgeist87"},"csharp":{"title":"C#","require":"clike","alias":["cs","dotnet"],"owner":"mvalipour"},"cpp":{"title":"C++","require":"c","owner":"zeitgeist87"},"cfscript":{"title":"CFScript","require":"clike","alias":"cfc","owner":"mjclemente"},"chaiscript":{"title":"ChaiScript","require":["clike","cpp"],"owner":"RunDevelopment"},"cil":{"title":"CIL","owner":"sbrl"},"clojure":{"title":"Clojure","owner":"troglotit"},"cmake":{"title":"CMake","owner":"mjrogozinski"},"cobol":{"title":"COBOL","owner":"RunDevelopment"},"coffeescript":{"title":"CoffeeScript","require":"javascript","alias":"coffee","owner":"R-osey"},"concurnas":{"title":"Concurnas","alias":"conc","owner":"jasontatton"},"csp":{"title":"Content-Security-Policy","owner":"ScottHelme"},"cooklang":{"title":"Cooklang","owner":"ahue"},"coq":{"title":"Coq","owner":"RunDevelopment"},"crystal":{"title":"Crystal","require":"ruby","owner":"MakeNowJust"},"css-extras":{"title":"CSS Extras","require":"css","modify":"css","owner":"milesj"},"csv":{"title":"CSV","owner":"RunDevelopment"},"cue":{"title":"CUE","owner":"RunDevelopment"},"cypher":{"title":"Cypher","owner":"RunDevelopment"},"d":{"title":"D","require":"clike","owner":"Golmote"},"dart":{"title":"Dart","require":"clike","owner":"Golmote"},"dataweave":{"title":"DataWeave","owner":"machaval"},"dax":{"title":"DAX","owner":"peterbud"},"dhall":{"title":"Dhall","owner":"RunDevelopment"},"diff":{"title":"Diff","owner":"uranusjr"},"django":{"title":"Django/Jinja2","require":"markup-templating","alias":"jinja2","owner":"romanvm"},"dns-zone-file":{"title":"DNS zone file","owner":"RunDevelopment","alias":"dns-zone"},"docker":{"title":"Docker","alias":"dockerfile","owner":"JustinBeckwith"},"dot":{"title":"DOT (Graphviz)","alias":"gv","optional":"markup","owner":"RunDevelopment"},"ebnf":{"title":"EBNF","owner":"RunDevelopment"},"editorconfig":{"title":"EditorConfig","owner":"osipxd"},"eiffel":{"title":"Eiffel","owner":"Conaclos"},"ejs":{"title":"EJS","require":["javascript","markup-templating"],"owner":"RunDevelopment","alias":"eta","aliasTitles":{"eta":"Eta"}},"elixir":{"title":"Elixir","owner":"Golmote"},"elm":{"title":"Elm","owner":"zwilias"},"etlua":{"title":"Embedded Lua templating","require":["lua","markup-templating"],"owner":"RunDevelopment"},"erb":{"title":"ERB","require":["ruby","markup-templating"],"owner":"Golmote"},"erlang":{"title":"Erlang","owner":"Golmote"},"excel-formula":{"title":"Excel Formula","alias":["xlsx","xls"],"owner":"RunDevelopment"},"fsharp":{"title":"F#","require":"clike","owner":"simonreynolds7"},"factor":{"title":"Factor","owner":"catb0t"},"false":{"title":"False","owner":"edukisto"},"firestore-security-rules":{"title":"Firestore security rules","require":"clike","owner":"RunDevelopment"},"flow":{"title":"Flow","require":"javascript","owner":"Golmote"},"fortran":{"title":"Fortran","owner":"Golmote"},"ftl":{"title":"FreeMarker Template Language","require":"markup-templating","owner":"RunDevelopment"},"gml":{"title":"GameMaker Language","alias":"gamemakerlanguage","require":"clike","owner":"LiarOnce"},"gap":{"title":"GAP (CAS)","owner":"RunDevelopment"},"gcode":{"title":"G-code","owner":"RunDevelopment"},"gdscript":{"title":"GDScript","owner":"RunDevelopment"},"gedcom":{"title":"GEDCOM","owner":"Golmote"},"gettext":{"title":"gettext","alias":"po","owner":"RunDevelopment"},"gherkin":{"title":"Gherkin","owner":"hason"},"git":{"title":"Git","owner":"lgiraudel"},"glsl":{"title":"GLSL","require":"c","owner":"Golmote"},"gn":{"title":"GN","alias":"gni","owner":"RunDevelopment"},"linker-script":{"title":"GNU Linker Script","alias":"ld","owner":"RunDevelopment"},"go":{"title":"Go","require":"clike","owner":"arnehormann"},"go-module":{"title":"Go module","alias":"go-mod","owner":"RunDevelopment"},"graphql":{"title":"GraphQL","optional":"markdown","owner":"Golmote"},"groovy":{"title":"Groovy","require":"clike","owner":"robfletcher"},"haml":{"title":"Haml","require":"ruby","optional":["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],"owner":"Golmote"},"handlebars":{"title":"Handlebars","require":"markup-templating","alias":["hbs","mustache"],"aliasTitles":{"mustache":"Mustache"},"owner":"Golmote"},"haskell":{"title":"Haskell","alias":"hs","owner":"bholst"},"haxe":{"title":"Haxe","require":"clike","optional":"regex","owner":"Golmote"},"hcl":{"title":"HCL","owner":"outsideris"},"hlsl":{"title":"HLSL","require":"c","owner":"RunDevelopment"},"hoon":{"title":"Hoon","owner":"matildepark"},"http":{"title":"HTTP","optional":["csp","css","hpkp","hsts","javascript","json","markup","uri"],"owner":"danielgtaylor"},"hpkp":{"title":"HTTP Public-Key-Pins","owner":"ScottHelme"},"hsts":{"title":"HTTP Strict-Transport-Security","owner":"ScottHelme"},"ichigojam":{"title":"IchigoJam","owner":"BlueCocoa"},"icon":{"title":"Icon","owner":"Golmote"},"icu-message-format":{"title":"ICU Message Format","owner":"RunDevelopment"},"idris":{"title":"Idris","alias":"idr","owner":"KeenS","require":"haskell"},"ignore":{"title":".ignore","owner":"osipxd","alias":["gitignore","hgignore","npmignore"],"aliasTitles":{"gitignore":".gitignore","hgignore":".hgignore","npmignore":".npmignore"}},"inform7":{"title":"Inform 7","owner":"Golmote"},"ini":{"title":"Ini","owner":"aviaryan"},"io":{"title":"Io","owner":"AlesTsurko"},"j":{"title":"J","owner":"Golmote"},"java":{"title":"Java","require":"clike","owner":"sherblot"},"javadoc":{"title":"JavaDoc","require":["markup","java","javadoclike"],"modify":"java","optional":"scala","owner":"RunDevelopment"},"javadoclike":{"title":"JavaDoc-like","modify":["java","javascript","php"],"owner":"RunDevelopment"},"javastacktrace":{"title":"Java stack trace","owner":"RunDevelopment"},"jexl":{"title":"Jexl","owner":"czosel"},"jolie":{"title":"Jolie","require":"clike","owner":"thesave"},"jq":{"title":"JQ","owner":"RunDevelopment"},"jsdoc":{"title":"JSDoc","require":["javascript","javadoclike","typescript"],"modify":"javascript","optional":["actionscript","coffeescript"],"owner":"RunDevelopment"},"js-extras":{"title":"JS Extras","require":"javascript","modify":"javascript","optional":["actionscript","coffeescript","flow","n4js","typescript"],"owner":"RunDevelopment"},"json":{"title":"JSON","alias":"webmanifest","aliasTitles":{"webmanifest":"Web App Manifest"},"owner":"CupOfTea696"},"json5":{"title":"JSON5","require":"json","owner":"RunDevelopment"},"jsonp":{"title":"JSONP","require":"json","owner":"RunDevelopment"},"jsstacktrace":{"title":"JS stack trace","owner":"sbrl"},"js-templates":{"title":"JS Templates","require":"javascript","modify":"javascript","optional":["css","css-extras","graphql","markdown","markup","sql"],"owner":"RunDevelopment"},"julia":{"title":"Julia","owner":"cdagnino"},"keepalived":{"title":"Keepalived Configure","owner":"dev-itsheng"},"keyman":{"title":"Keyman","owner":"mcdurdin"},"kotlin":{"title":"Kotlin","alias":["kt","kts"],"aliasTitles":{"kts":"Kotlin Script"},"require":"clike","owner":"Golmote"},"kumir":{"title":"KuMir (КуМир)","alias":"kum","owner":"edukisto"},"kusto":{"title":"Kusto","owner":"RunDevelopment"},"latex":{"title":"LaTeX","alias":["tex","context"],"aliasTitles":{"tex":"TeX","context":"ConTeXt"},"owner":"japborst"},"latte":{"title":"Latte","require":["clike","markup-templating","php"],"owner":"nette"},"less":{"title":"Less","require":"css","optional":"css-extras","owner":"Golmote"},"lilypond":{"title":"LilyPond","require":"scheme","alias":"ly","owner":"RunDevelopment"},"liquid":{"title":"Liquid","require":"markup-templating","owner":"cinhtau"},"lisp":{"title":"Lisp","alias":["emacs","elisp","emacs-lisp"],"owner":"JuanCaicedo"},"livescript":{"title":"LiveScript","owner":"Golmote"},"llvm":{"title":"LLVM IR","owner":"porglezomp"},"log":{"title":"Log file","optional":"javastacktrace","owner":"RunDevelopment"},"lolcode":{"title":"LOLCODE","owner":"Golmote"},"lua":{"title":"Lua","owner":"Golmote"},"magma":{"title":"Magma (CAS)","owner":"RunDevelopment"},"makefile":{"title":"Makefile","owner":"Golmote"},"markdown":{"title":"Markdown","require":"markup","optional":"yaml","alias":"md","owner":"Golmote"},"markup-templating":{"title":"Markup templating","require":"markup","owner":"Golmote"},"mata":{"title":"Mata","owner":"RunDevelopment"},"matlab":{"title":"MATLAB","owner":"Golmote"},"maxscript":{"title":"MAXScript","owner":"RunDevelopment"},"mel":{"title":"MEL","owner":"Golmote"},"mermaid":{"title":"Mermaid","owner":"RunDevelopment"},"mizar":{"title":"Mizar","owner":"Golmote"},"mongodb":{"title":"MongoDB","owner":"airs0urce","require":"javascript"},"monkey":{"title":"Monkey","owner":"Golmote"},"moonscript":{"title":"MoonScript","alias":"moon","owner":"RunDevelopment"},"n1ql":{"title":"N1QL","owner":"TMWilds"},"n4js":{"title":"N4JS","require":"javascript","optional":"jsdoc","alias":"n4jsd","owner":"bsmith-n4"},"nand2tetris-hdl":{"title":"Nand To Tetris HDL","owner":"stephanmax"},"naniscript":{"title":"Naninovel Script","owner":"Elringus","alias":"nani"},"nasm":{"title":"NASM","owner":"rbmj"},"neon":{"title":"NEON","owner":"nette"},"nevod":{"title":"Nevod","owner":"nezaboodka"},"nginx":{"title":"nginx","owner":"volado"},"nim":{"title":"Nim","owner":"Golmote"},"nix":{"title":"Nix","owner":"Golmote"},"nsis":{"title":"NSIS","owner":"idleberg"},"objectivec":{"title":"Objective-C","require":"c","alias":"objc","owner":"uranusjr"},"ocaml":{"title":"OCaml","owner":"Golmote"},"odin":{"title":"Odin","owner":"edukisto"},"opencl":{"title":"OpenCL","require":"c","modify":["c","cpp"],"owner":"Milania1"},"openqasm":{"title":"OpenQasm","alias":"qasm","owner":"RunDevelopment"},"oz":{"title":"Oz","owner":"Golmote"},"parigp":{"title":"PARI/GP","owner":"Golmote"},"parser":{"title":"Parser","require":"markup","owner":"Golmote"},"pascal":{"title":"Pascal","alias":"objectpascal","aliasTitles":{"objectpascal":"Object Pascal"},"owner":"Golmote"},"pascaligo":{"title":"Pascaligo","owner":"DefinitelyNotAGoat"},"psl":{"title":"PATROL Scripting Language","owner":"bertysentry"},"pcaxis":{"title":"PC-Axis","alias":"px","owner":"RunDevelopment"},"peoplecode":{"title":"PeopleCode","alias":"pcode","owner":"RunDevelopment"},"perl":{"title":"Perl","owner":"Golmote"},"php":{"title":"PHP","require":"markup-templating","owner":"milesj"},"phpdoc":{"title":"PHPDoc","require":["php","javadoclike"],"modify":"php","owner":"RunDevelopment"},"php-extras":{"title":"PHP Extras","require":"php","modify":"php","owner":"milesj"},"plant-uml":{"title":"PlantUML","alias":"plantuml","owner":"RunDevelopment"},"plsql":{"title":"PL/SQL","require":"sql","owner":"Golmote"},"powerquery":{"title":"PowerQuery","alias":["pq","mscript"],"owner":"peterbud"},"powershell":{"title":"PowerShell","owner":"nauzilus"},"processing":{"title":"Processing","require":"clike","owner":"Golmote"},"prolog":{"title":"Prolog","owner":"Golmote"},"promql":{"title":"PromQL","owner":"arendjr"},"properties":{"title":".properties","owner":"Golmote"},"protobuf":{"title":"Protocol Buffers","require":"clike","owner":"just-boris"},"pug":{"title":"Pug","require":["markup","javascript"],"optional":["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],"owner":"Golmote"},"puppet":{"title":"Puppet","owner":"Golmote"},"pure":{"title":"Pure","optional":["c","cpp","fortran"],"owner":"Golmote"},"purebasic":{"title":"PureBasic","require":"clike","alias":"pbfasm","owner":"HeX0R101"},"purescript":{"title":"PureScript","require":"haskell","alias":"purs","owner":"sriharshachilakapati"},"python":{"title":"Python","alias":"py","owner":"multipetros"},"qsharp":{"title":"Q#","require":"clike","alias":"qs","owner":"fedonman"},"q":{"title":"Q (kdb+ database)","owner":"Golmote"},"qml":{"title":"QML","require":"javascript","owner":"RunDevelopment"},"qore":{"title":"Qore","require":"clike","owner":"temnroegg"},"r":{"title":"R","owner":"Golmote"},"racket":{"title":"Racket","require":"scheme","alias":"rkt","owner":"RunDevelopment"},"cshtml":{"title":"Razor C#","alias":"razor","require":["markup","csharp"],"optional":["css","css-extras","javascript","js-extras"],"owner":"RunDevelopment"},"jsx":{"title":"React JSX","require":["markup","javascript"],"optional":["jsdoc","js-extras","js-templates"],"owner":"vkbansal"},"tsx":{"title":"React TSX","require":["jsx","typescript"]},"reason":{"title":"Reason","require":"clike","owner":"Golmote"},"regex":{"title":"Regex","owner":"RunDevelopment"},"rego":{"title":"Rego","owner":"JordanSh"},"renpy":{"title":"Ren'py","alias":"rpy","owner":"HyuchiaDiego"},"rescript":{"title":"ReScript","alias":"res","owner":"vmarcosp"},"rest":{"title":"reST (reStructuredText)","owner":"Golmote"},"rip":{"title":"Rip","owner":"ravinggenius"},"roboconf":{"title":"Roboconf","owner":"Golmote"},"robotframework":{"title":"Robot Framework","alias":"robot","owner":"RunDevelopment"},"ruby":{"title":"Ruby","require":"clike","alias":"rb","owner":"samflores"},"rust":{"title":"Rust","owner":"Golmote"},"sas":{"title":"SAS","optional":["groovy","lua","sql"],"owner":"Golmote"},"sass":{"title":"Sass (Sass)","require":"css","optional":"css-extras","owner":"Golmote"},"scss":{"title":"Sass (Scss)","require":"css","optional":"css-extras","owner":"MoOx"},"scala":{"title":"Scala","require":"java","owner":"jozic"},"scheme":{"title":"Scheme","owner":"bacchus123"},"shell-session":{"title":"Shell session","require":"bash","alias":["sh-session","shellsession"],"owner":"RunDevelopment"},"smali":{"title":"Smali","owner":"RunDevelopment"},"smalltalk":{"title":"Smalltalk","owner":"Golmote"},"smarty":{"title":"Smarty","require":"markup-templating","optional":"php","owner":"Golmote"},"sml":{"title":"SML","alias":"smlnj","aliasTitles":{"smlnj":"SML/NJ"},"owner":"RunDevelopment"},"solidity":{"title":"Solidity (Ethereum)","alias":"sol","require":"clike","owner":"glachaud"},"solution-file":{"title":"Solution file","alias":"sln","owner":"RunDevelopment"},"soy":{"title":"Soy (Closure Template)","require":"markup-templating","owner":"Golmote"},"sparql":{"title":"SPARQL","require":"turtle","owner":"Triply-Dev","alias":"rq"},"splunk-spl":{"title":"Splunk SPL","owner":"RunDevelopment"},"sqf":{"title":"SQF: Status Quo Function (Arma 3)","require":"clike","owner":"RunDevelopment"},"sql":{"title":"SQL","owner":"multipetros"},"squirrel":{"title":"Squirrel","require":"clike","owner":"RunDevelopment"},"stan":{"title":"Stan","owner":"RunDevelopment"},"stata":{"title":"Stata Ado","require":["mata","java","python"],"owner":"RunDevelopment"},"iecst":{"title":"Structured Text (IEC 61131-3)","owner":"serhioromano"},"stylus":{"title":"Stylus","owner":"vkbansal"},"supercollider":{"title":"SuperCollider","alias":"sclang","owner":"RunDevelopment"},"swift":{"title":"Swift","owner":"chrischares"},"systemd":{"title":"Systemd configuration file","owner":"RunDevelopment"},"t4-templating":{"title":"T4 templating","owner":"RunDevelopment"},"t4-cs":{"title":"T4 Text Templates (C#)","require":["t4-templating","csharp"],"alias":"t4","owner":"RunDevelopment"},"t4-vb":{"title":"T4 Text Templates (VB)","require":["t4-templating","vbnet"],"owner":"RunDevelopment"},"tap":{"title":"TAP","owner":"isaacs","require":"yaml"},"tcl":{"title":"Tcl","owner":"PeterChaplin"},"tt2":{"title":"Template Toolkit 2","require":["clike","markup-templating"],"owner":"gflohr"},"textile":{"title":"Textile","require":"markup","optional":"css","owner":"Golmote"},"toml":{"title":"TOML","owner":"RunDevelopment"},"tremor":{"title":"Tremor","alias":["trickle","troy"],"owner":"darach","aliasTitles":{"trickle":"trickle","troy":"troy"}},"turtle":{"title":"Turtle","alias":"trig","aliasTitles":{"trig":"TriG"},"owner":"jakubklimek"},"twig":{"title":"Twig","require":"markup-templating","owner":"brandonkelly"},"typescript":{"title":"TypeScript","require":"javascript","optional":"js-templates","alias":"ts","owner":"vkbansal"},"typoscript":{"title":"TypoScript","alias":"tsconfig","aliasTitles":{"tsconfig":"TSConfig"},"owner":"dkern"},"unrealscript":{"title":"UnrealScript","alias":["uscript","uc"],"owner":"RunDevelopment"},"uorazor":{"title":"UO Razor Script","owner":"jaseowns"},"uri":{"title":"URI","alias":"url","aliasTitles":{"url":"URL"},"owner":"RunDevelopment"},"v":{"title":"V","require":"clike","owner":"taggon"},"vala":{"title":"Vala","require":"clike","optional":"regex","owner":"TemplarVolk"},"vbnet":{"title":"VB.Net","require":"basic","owner":"Bigsby"},"velocity":{"title":"Velocity","require":"markup","owner":"Golmote"},"verilog":{"title":"Verilog","owner":"a-rey"},"vhdl":{"title":"VHDL","owner":"a-rey"},"vim":{"title":"vim","owner":"westonganger"},"visual-basic":{"title":"Visual Basic","alias":["vb","vba"],"aliasTitles":{"vba":"VBA"},"owner":"Golmote"},"warpscript":{"title":"WarpScript","owner":"RunDevelopment"},"wasm":{"title":"WebAssembly","owner":"Golmote"},"web-idl":{"title":"Web IDL","alias":"webidl","owner":"RunDevelopment"},"wiki":{"title":"Wiki markup","require":"markup","owner":"Golmote"},"wolfram":{"title":"Wolfram language","alias":["mathematica","nb","wl"],"aliasTitles":{"mathematica":"Mathematica","nb":"Mathematica Notebook"},"owner":"msollami"},"wren":{"title":"Wren","owner":"clsource"},"xeora":{"title":"Xeora","require":"markup","alias":"xeoracube","aliasTitles":{"xeoracube":"XeoraCube"},"owner":"freakmaxi"},"xml-doc":{"title":"XML doc (.net)","require":"markup","modify":["csharp","fsharp","vbnet"],"owner":"RunDevelopment"},"xojo":{"title":"Xojo (REALbasic)","owner":"Golmote"},"xquery":{"title":"XQuery","require":"markup","owner":"Golmote"},"yaml":{"title":"YAML","alias":"yml","owner":"hason"},"yang":{"title":"YANG","owner":"RunDevelopment"},"zig":{"title":"Zig","owner":"RunDevelopment"}},"plugins":{"meta":{"path":"plugins/{id}/prism-{id}","link":"plugins/{id}/"},"line-highlight":{"title":"Line Highlight","description":"Highlights specific lines and/or line ranges."},"line-numbers":{"title":"Line Numbers","description":"Line number at the beginning of code lines.","owner":"kuba-kubula"},"show-invisibles":{"title":"Show Invisibles","description":"Show hidden characters such as tabs and line breaks.","optional":["autolinker","data-uri-highlight"]},"autolinker":{"title":"Autolinker","description":"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},"wpd":{"title":"WebPlatform Docs","description":"Makes tokens link to WebPlatform.org documentation. The links open in a new tab."},"custom-class":{"title":"Custom Class","description":"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.","owner":"dvkndn","noCSS":true},"file-highlight":{"title":"File Highlight","description":"Fetch external files and highlight them with Prism. Used on the Prism website itself.","noCSS":true},"show-language":{"title":"Show Language","description":"Display the highlighted language in code blocks (inline code does not show the label).","owner":"nauzilus","noCSS":true,"require":"toolbar"},"jsonp-highlight":{"title":"JSONP Highlight","description":"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).","noCSS":true,"owner":"nauzilus"},"highlight-keywords":{"title":"Highlight Keywords","description":"Adds special CSS classes for each keyword for fine-grained highlighting.","owner":"vkbansal","noCSS":true},"remove-initial-line-feed":{"title":"Remove initial line feed","description":"Removes the initial line feed in code blocks.","owner":"Golmote","noCSS":true},"inline-color":{"title":"Inline color","description":"Adds a small inline preview for colors in style sheets.","require":"css-extras","owner":"RunDevelopment"},"previewers":{"title":"Previewers","description":"Previewers for angles, colors, gradients, easing and time.","require":"css-extras","owner":"Golmote"},"autoloader":{"title":"Autoloader","description":"Automatically loads the needed languages to highlight the code blocks.","owner":"Golmote","noCSS":true},"keep-markup":{"title":"Keep Markup","description":"Prevents custom markup from being dropped out during highlighting.","owner":"Golmote","optional":"normalize-whitespace","noCSS":true},"command-line":{"title":"Command Line","description":"Display a command line with a prompt and, optionally, the output/response from the commands.","owner":"chriswells0"},"unescaped-markup":{"title":"Unescaped Markup","description":"Write markup without having to escape anything."},"normalize-whitespace":{"title":"Normalize Whitespace","description":"Supports multiple operations to normalize whitespace in code blocks.","owner":"zeitgeist87","optional":"unescaped-markup","noCSS":true},"data-uri-highlight":{"title":"Data-URI Highlight","description":"Highlights data-URI contents.","owner":"Golmote","noCSS":true},"toolbar":{"title":"Toolbar","description":"Attach a toolbar for plugins to easily register buttons on the top of a code block.","owner":"mAAdhaTTah"},"copy-to-clipboard":{"title":"Copy to Clipboard Button","description":"Add a button that copies the code block to the clipboard when clicked.","owner":"mAAdhaTTah","require":"toolbar","noCSS":true},"download-button":{"title":"Download Button","description":"A button in the toolbar of a code block adding a convenient way to download a code file.","owner":"Golmote","require":"toolbar","noCSS":true},"match-braces":{"title":"Match braces","description":"Highlights matching braces.","owner":"RunDevelopment"},"diff-highlight":{"title":"Diff Highlight","description":"Highlights the code inside diff blocks.","owner":"RunDevelopment","require":"diff"},"filter-highlight-all":{"title":"Filter highlightAll","description":"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.","owner":"RunDevelopment","noCSS":true},"treeview":{"title":"Treeview","description":"A language with special styles to highlight file system tree structures.","owner":"Golmote"}}}; if (typeof module !== 'undefined' && module.exports) { module.exports = components; } \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json index 903e4cfbc1..9c58e568ba 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json @@ -139,6 +139,24 @@ "title": "ARFF", "owner": "Golmote" }, + "armasm": { + "title": "ARM Assembly", + "alias": "arm-asm", + "owner": "RunDevelopment" + }, + "arturo": { + "title": "Arturo", + "alias": "art", + "optional": [ + "bash", + "css", + "javascript", + "markup", + "markdown", + "sql" + ], + "owner": "drkameleon" + }, "asciidoc": { "alias": "adoc", "title": "AsciiDoc", @@ -175,6 +193,14 @@ "alias": "avdl", "owner": "RunDevelopment" }, + "awk": { + "title": "AWK", + "alias": "gawk", + "aliasTitles": { + "gawk": "GAWK" + }, + "owner": "RunDevelopment" + }, "bash": { "title": "Bash", "alias": "shell", @@ -299,6 +325,10 @@ "title": "Content-Security-Policy", "owner": "ScottHelme" }, + "cooklang": { + "title": "Cooklang", + "owner": "ahue" + }, "coq": { "title": "Coq", "owner": "RunDevelopment" @@ -318,6 +348,10 @@ "title": "CSV", "owner": "RunDevelopment" }, + "cue": { + "title": "CUE", + "owner": "RunDevelopment" + }, "cypher": { "title": "Cypher", "owner": "RunDevelopment" @@ -472,6 +506,11 @@ "title": "GEDCOM", "owner": "Golmote" }, + "gettext": { + "title": "gettext", + "alias": "po", + "owner": "RunDevelopment" + }, "gherkin": { "title": "Gherkin", "owner": "hason" @@ -490,6 +529,11 @@ "alias": "gni", "owner": "RunDevelopment" }, + "linker-script": { + "title": "GNU Linker Script", + "alias": "ld", + "owner": "RunDevelopment" + }, "go": { "title": "Go", "require": "clike", @@ -529,7 +573,10 @@ "handlebars": { "title": "Handlebars", "require": "markup-templating", - "alias": "hbs", + "alias": ["hbs", "mustache"], + "aliasTitles": { + "mustache": "Mustache" + }, "owner": "Golmote" }, "haskell": { @@ -830,6 +877,10 @@ "require": "markup", "owner": "Golmote" }, + "mata": { + "title": "Mata", + "owner": "RunDevelopment" + }, "matlab": { "title": "MATLAB", "owner": "Golmote" @@ -922,6 +973,10 @@ "title": "OCaml", "owner": "Golmote" }, + "odin": { + "title": "Odin", + "owner": "edukisto" + }, "opencl": { "title": "OpenCL", "require": "c", @@ -996,6 +1051,11 @@ "modify": "php", "owner": "milesj" }, + "plant-uml": { + "title": "PlantUML", + "alias": "plantuml", + "owner": "RunDevelopment" + }, "plsql": { "title": "PL/SQL", "require": "sql", @@ -1152,6 +1212,11 @@ "alias": "rpy", "owner": "HyuchiaDiego" }, + "rescript": { + "title": "ReScript", + "alias": "res", + "owner": "vmarcosp" + }, "rest": { "title": "reST (reStructuredText)", "owner": "Golmote" @@ -1277,6 +1342,11 @@ "title": "Stan", "owner": "RunDevelopment" }, + "stata": { + "title": "Stata Ado", + "require": ["mata", "java", "python"], + "owner": "RunDevelopment" + }, "iecst": { "title": "Structured Text (IEC 61131-3)", "owner": "serhioromano" @@ -1285,6 +1355,11 @@ "title": "Stylus", "owner": "vkbansal" }, + "supercollider": { + "title": "SuperCollider", + "alias": "sclang", + "owner": "RunDevelopment" + }, "swift": { "title": "Swift", "owner": "chrischares" diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js index ba7c4acbbe..f086acd788 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js @@ -16,7 +16,7 @@ Prism.languages.abap = { alias: 'comment' }, 'keyword': { - pattern: /(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i, + pattern: /(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i, lookbehind: true }, /* Numbers can be only integers. Decimal or Hex appear only as strings */ diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js index dd3bf65eea..d803a51ba0 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js @@ -1 +1 @@ -Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; \ No newline at end of file +Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js index bc021e1f49..a57731024c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abnf.min.js @@ -1 +1 @@ -!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";Prism.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(); \ No newline at end of file +!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";n.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js index 21226f63a2..a537f39b0a 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js @@ -9,8 +9,11 @@ Prism.languages.ada = { pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i } ], - 'attr-name': /\b'\w+/, - 'keyword': /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i, + 'attribute': { + pattern: /\b'\w+/, + alias: 'attr-name' + }, + 'keyword': /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i, 'boolean': /\b(?:false|true)\b/i, 'operator': /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/, 'punctuation': /\.\.?|[,;():]/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js index f58b0ea9f3..57de170363 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js @@ -1 +1 @@ -Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/,keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; \ No newline at end of file +Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js index a31d259c3a..62f8d1ca23 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-agda.min.js @@ -1 +1 @@ -Prism.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}; \ No newline at end of file +!function(t){t.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js index ba2cdfabea..3cb0f96bec 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apex.min.js @@ -1 +1 @@ -!function(e){var t=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(//g,function(){return t.source});function i(e){return RegExp(e.replace(//g,function(){return n}),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism); \ No newline at end of file +!function(e){var t=/\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(//g,(function(){return t.source}));function i(e){return RegExp(e.replace(//g,(function(){return n})),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.js new file mode 100644 index 0000000000..07e93221d4 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.js @@ -0,0 +1,49 @@ +Prism.languages.armasm = { + 'comment': { + pattern: /;.*/, + greedy: true + }, + 'string': { + pattern: /"(?:[^"\r\n]|"")*"/, + greedy: true, + inside: { + 'variable': { + pattern: /((?:^|[^$])(?:\${2})*)\$\w+/, + lookbehind: true + } + } + }, + 'char': { + pattern: /'(?:[^'\r\n]{0,4}|'')'/, + greedy: true + }, + 'version-symbol': { + pattern: /\|[\w@]+\|/, + greedy: true, + alias: 'property' + }, + + 'boolean': /\b(?:FALSE|TRUE)\b/, + 'directive': { + pattern: /\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/, + alias: 'property' + }, + 'instruction': { + pattern: /((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/, + lookbehind: true, + alias: 'keyword' + }, + 'variable': /\$\w+/, + + 'number': /(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i, + + 'register': { + pattern: /\b(?:r\d|lr)\b/, + alias: 'symbol' + }, + + 'operator': /<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/, + 'punctuation': /[()[\],]/ +}; + +Prism.languages['arm-asm'] = Prism.languages.armasm; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.min.js new file mode 100644 index 0000000000..620549bd32 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-armasm.min.js @@ -0,0 +1 @@ +Prism.languages.armasm={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"/,greedy:!0,inside:{variable:{pattern:/((?:^|[^$])(?:\${2})*)\$\w+/,lookbehind:!0}}},char:{pattern:/'(?:[^'\r\n]{0,4}|'')'/,greedy:!0},"version-symbol":{pattern:/\|[\w@]+\|/,greedy:!0,alias:"property"},boolean:/\b(?:FALSE|TRUE)\b/,directive:{pattern:/\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,alias:"property"},instruction:{pattern:/((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,lookbehind:!0,alias:"keyword"},variable:/\$\w+/,number:/(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,register:{pattern:/\b(?:r\d|lr)\b/,alias:"symbol"},operator:/<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,punctuation:/[()[\],]/},Prism.languages["arm-asm"]=Prism.languages.armasm; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.js new file mode 100644 index 0000000000..d09b5e27ef --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.js @@ -0,0 +1,105 @@ +(function (Prism) { + /** + * @param {string} lang + * @param {string} pattern + */ + var createLanguageString = function (lang, pattern) { + return { + pattern: RegExp(/\{!/.source + '(?:' + (pattern || lang) + ')' + /$[\s\S]*\}/.source, 'm'), + greedy: true, + inside: { + 'embedded': { + pattern: /(^\{!\w+\b)[\s\S]+(?=\}$)/, + lookbehind: true, + alias: 'language-' + lang, + inside: Prism.languages[lang] + }, + 'string': /[\s\S]+/ + } + }; + }; + + Prism.languages.arturo = { + 'comment': { + pattern: /;.*/, + greedy: true + }, + + 'character': { + pattern: /`.`/, + alias: 'char', + greedy: true + }, + + 'number': { + pattern: /\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/, + }, + + 'string': { + pattern: /"(?:[^"\\\r\n]|\\.)*"/, + greedy: true + }, + + 'regex': { + pattern: /\{\/.*?\/\}/, + greedy: true + }, + + 'html-string': createLanguageString('html'), + 'css-string': createLanguageString('css'), + 'js-string': createLanguageString('js'), + 'md-string': createLanguageString('md'), + 'sql-string': createLanguageString('sql'), + 'sh-string': createLanguageString('shell', 'sh'), + + 'multistring': { + pattern: /».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m, + alias: 'string', + greedy: true + }, + + 'label': { + pattern: /\w+\b\??:/, + alias: 'property' + }, + + 'literal': { + pattern: /'(?:\w+\b\??:?)/, + alias: 'constant' + }, + + 'type': { + pattern: /:(?:\w+\b\??:?)/, + alias: 'class-name' + }, + + 'color': /#\w+/, + + 'predicate': { + pattern: /\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/, + alias: 'keyword' + }, + + 'builtin-function': { + pattern: /\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/, + alias: 'keyword' + }, + + 'sugar': { + pattern: /->|=>|\||::/, + alias: 'operator' + }, + + 'punctuation': /[()[\],]/, + + 'symbol': { + pattern: /<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/ + }, + + 'boolean': { + pattern: /\b(?:false|maybe|true)\b/ + } + }; + + Prism.languages.art = Prism.languages['arturo']; +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.min.js new file mode 100644 index 0000000000..f17b130a17 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arturo.min.js @@ -0,0 +1 @@ +!function(e){var a=function(a,t){return{pattern:RegExp("\\{!(?:"+(t||a)+")$[^]*\\}","m"),greedy:!0,inside:{embedded:{pattern:/(^\{!\w+\b)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-"+a,inside:e.languages[a]},string:/[\s\S]+/}}};e.languages.arturo={comment:{pattern:/;.*/,greedy:!0},character:{pattern:/`.`/,alias:"char",greedy:!0},number:{pattern:/\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/},string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},regex:{pattern:/\{\/.*?\/\}/,greedy:!0},"html-string":a("html"),"css-string":a("css"),"js-string":a("js"),"md-string":a("md"),"sql-string":a("sql"),"sh-string":a("shell","sh"),multistring:{pattern:/».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,alias:"string",greedy:!0},label:{pattern:/\w+\b\??:/,alias:"property"},literal:{pattern:/'(?:\w+\b\??:?)/,alias:"constant"},type:{pattern:/:(?:\w+\b\??:?)/,alias:"class-name"},color:/#\w+/,predicate:{pattern:/\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,alias:"keyword"},"builtin-function":{pattern:/\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,alias:"keyword"},sugar:{pattern:/->|=>|\||::/,alias:"operator"},punctuation:/[()[\],]/,symbol:{pattern:/<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/},boolean:{pattern:/\b(?:false|maybe|true)\b/}},e.languages.art=e.languages.arturo}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js index ed45a7a251..e1badd1aac 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js @@ -1 +1 @@ -!function(t){var n={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},a=t.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function i(t){for(var n={},i=0,e=(t=t.split(" ")).length;i](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|R|TM)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function e(t){for(var n={},e=0,a=(t=t.split(" ")).length;e>=?|<<=?|&&?|\|\|?|[-+*/%&|^!=<>?]=?/, + 'operator': />>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/, 'punctuation': /[(),:]/ }; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js index 6e6f8c6912..8c021f9ead 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asmatmel.min.js @@ -1 +1 @@ -Prism.languages.asmatmel={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},constant:/\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,directive:{pattern:/\.\w+(?= )/,alias:"property"},"r-register":{pattern:/\br(?:\d|[12]\d|3[01])\b/,alias:"variable"},"op-code":{pattern:/\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{2,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[acznvshtixy]\b/i,alias:"variable"},operator:/>>=?|<<=?|&&?|\|\|?|[-+*/%&|^!=<>?]=?/,punctuation:/[(),:]/}; \ No newline at end of file +Prism.languages.asmatmel={comment:{pattern:/;.*/,greedy:!0},string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},constant:/\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,directive:{pattern:/\.\w+(?= )/,alias:"property"},"r-register":{pattern:/\br(?:\d|[12]\d|3[01])\b/,alias:"variable"},"op-code":{pattern:/\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,alias:"keyword"},"hex-number":{pattern:/#?\$[\da-f]{2,4}\b/i,alias:"number"},"binary-number":{pattern:/#?%[01]+\b/,alias:"number"},"decimal-number":{pattern:/#?\b\d+\b/,alias:"number"},register:{pattern:/\b[acznvshtixy]\b/i,alias:"variable"},operator:/>>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,punctuation:/[(),:]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js index dbd0751c94..eb68d154d2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js @@ -22,7 +22,10 @@ Prism.languages.autohotkey = { 'operator': /\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/, 'boolean': /\b(?:false|true)\b/, - 'selector': /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i, + 'command': { + pattern: /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i, + alias: 'selector' + }, 'constant': /\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i, @@ -30,7 +33,10 @@ Prism.languages.autohotkey = { 'symbol': /\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i, - 'important': /#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i, + 'directive': { + pattern: /#[a-z]+\b/i, + alias: 'important' + }, 'keyword': /\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i, 'function': /[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js index d7e1894410..79e06a1a4f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js @@ -1 +1 @@ -Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,selector:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,important:/#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i,keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}; \ No newline at end of file +Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:false|true)\b/,command:{pattern:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,alias:"selector"},constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,directive:{pattern:/#[a-z]+\b/i,alias:"important"},keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,punctuation:/[{}[\]():,]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js index 14a8b68e99..851807cf74 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-avisynth.min.js @@ -1 +1 @@ -!function(e){function a(e,a,r){return RegExp(function(e,r){return e.replace(/<<(\d+)>>/g,function(e,a){return r[+a]})}(e,a),r||"")}var r="bool|clip|float|int|string|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?","apply|assert|default|eval|import|nop|select|undefined","opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)","hex(?:value)?|value","abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams","chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)","isversionorgreater|version(?:number|string)","buildpixeltype|colorspacenametopixeltype","addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode"].join("|"),["has(?:audio|video)","height|width","frame(?:count|rate)|framerate(?:denominator|numerator)","getparity|is(?:field|frame)based","bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype","audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract","addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)","blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch","animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?","imagewriter","blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism); \ No newline at end of file +!function(e){function a(e,a,r){return RegExp(function(e,a){return e.replace(/<<(\d+)>>/g,(function(e,r){return a[+r]}))}(e,a),r||"")}var r="bool|clip|float|int|string|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?","apply|assert|default|eval|import|nop|select|undefined","opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)","hex(?:value)?|value","abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams","chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)","isversionorgreater|version(?:number|string)","buildpixeltype|colorspacenametopixeltype","addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode"].join("|"),["has(?:audio|video)","height|width","frame(?:count|rate)|framerate(?:denominator|numerator)","getparity|is(?:field|frame)based","bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype","audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract","addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)","blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch","animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?","imagewriter","blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:false|no|true|yes)\b/i,keyword:/\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,constant:/\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.js new file mode 100644 index 0000000000..64cf2c0400 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.js @@ -0,0 +1,32 @@ +Prism.languages.awk = { + 'hashbang': { + pattern: /^#!.*/, + greedy: true, + alias: 'comment' + }, + 'comment': { + pattern: /#.*/, + greedy: true + }, + 'string': { + pattern: /(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/, + lookbehind: true, + greedy: true + }, + 'regex': { + pattern: /((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//, + lookbehind: true, + greedy: true + }, + + 'variable': /\$\w+/, + 'keyword': /\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/, + + 'function': /\b[a-z_]\w*(?=\s*\()/i, + 'number': /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/, + + 'operator': /--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/, + 'punctuation': /[()[\]{},;]/ +}; + +Prism.languages.gawk = Prism.languages.awk; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.min.js new file mode 100644 index 0000000000..c48925cdf3 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-awk.min.js @@ -0,0 +1 @@ +Prism.languages.awk={hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},comment:{pattern:/#.*/,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},regex:{pattern:/((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,lookbehind:!0,greedy:!0},variable:/\$\w+/,keyword:/\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,operator:/--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,punctuation:/[()[\]{},;]/},Prism.languages.gawk=Prism.languages.awk; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js index f49a688dc4..886f10c7a2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js @@ -1 +1 @@ -!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;Prism.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(); \ No newline at end of file +!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/\b(?:do|in)\b|^for\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,lookbehind:!0,inside:{keyword:/^\w+\b/,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js index e9fd550ec3..7f0cd97437 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.js @@ -19,7 +19,7 @@ Prism.languages.cfscript = Prism.languages.extend('clike', { ], 'keyword': /\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/, 'operator': [ - /\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/, + /\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/, /\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/ ], 'scope': { diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js index fcd8b79c7b..49dc2d0fef 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cfscript.min.js @@ -1 +1 @@ -Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript; \ No newline at end of file +Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js index 464705bba7..4b71c84766 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.js @@ -13,8 +13,8 @@ Prism.languages.cmake = { } } }, - 'variable': /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/, - 'property': /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/, + 'variable': /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/, + 'property': /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/, 'keyword': /\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/, 'boolean': /\b(?:FALSE|OFF|ON|TRUE)\b/, 'namespace': /\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js index 8455f5ccbf..a223df57be 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cmake.min.js @@ -1 +1 @@ -Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; \ No newline at end of file +Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:FALSE|OFF|ON|TRUE)\b/,namespace:/\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,operator:/\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.js new file mode 100644 index 0000000000..cb49ed1260 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.js @@ -0,0 +1,146 @@ +(function (Prism) { + + // see https://github.com/cooklang/spec/blob/main/EBNF.md + + var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source; + var multi_token_infix = /[^{}@#]+/.source; + var multi_token_suffix = /\{[^}#@]*\}/.source; + + var multi_token = multi_token_infix + multi_token_suffix; + + var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source; + + var amount_group_impl = { + pattern: /\{[^{}]*\}/, + inside: { + 'amount': { + pattern: /([\{|])[^{}|*%]+/, + lookbehind: true, + alias: 'number', + }, + 'unit': { + pattern: /(%)[^}]+/, + lookbehind: true, + alias: 'symbol', + }, + 'servings-scaler': { + pattern: /\*/, + alias: 'operator', + }, + 'servings-alternative-separator': { + pattern: /\|/, + alias: 'operator', + }, + 'unit-separator': { + pattern: /(?:%|(\*)%)/, + lookbehind: true, + alias: 'operator', + }, + 'punctuation': /[{}]/, + } + }; + + + Prism.languages.cooklang = { + 'comment': { + // [- comment -] + // -- comment + pattern: /\[-[\s\S]*?-\]|--.*/, + greedy: true, + }, + 'meta': { // >> key: value + pattern: />>.*:.*/, + inside: { + 'property': { // key: + pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/, + lookbehind: true, + } + } + }, + 'cookware-group': { // #...{...}, #... + pattern: new RegExp('#(?:' + + multi_token + + '|' + + single_token_suffix + + ')' + ), + inside: { + 'cookware': { + pattern: new RegExp('(^#)(?:' + + multi_token_infix + + ')' + ), + lookbehind: true, + alias: 'variable', + }, + 'cookware-keyword': { + pattern: /^#/, + alias: 'keyword', + }, + 'quantity-group': { + pattern: new RegExp(/\{[^{}@#]*\}/), + inside: { + 'quantity': { + pattern: new RegExp(/(^\{)/.source + multi_token_infix), + lookbehind: true, + alias: 'number', + }, + 'punctuation': /[{}]/, + } + } + }, + }, + 'ingredient-group': { // @...{...}, @... + pattern: new RegExp('@(?:' + + multi_token + + '|' + + single_token_suffix + + ')'), + inside: { + 'ingredient': { + pattern: new RegExp('(^@)(?:' + + multi_token_infix + + ')'), + lookbehind: true, + alias: 'variable', + }, + 'ingredient-keyword': { + pattern: /^@/, + alias: 'keyword', + }, + 'amount-group': amount_group_impl, + } + }, + 'timer-group': { // ~timer{...} + // eslint-disable-next-line regexp/sort-alternatives + pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/, + inside: { + 'timer': { + pattern: /(^~)[^{]+/, + lookbehind: true, + alias: 'variable', + }, + 'duration-group': { // {...} + pattern: /\{[^{}]*\}/, + inside: { + 'punctuation': /[{}]/, + 'unit': { + pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source), + lookbehind: true, + alias: 'symbol', + }, + 'operator': /%/, + 'duration': { + pattern: /\d+/, + alias: 'number', + }, + } + }, + 'timer-keyword': { + pattern: /^~/, + alias: 'keyword', + }, + } + } + }; +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.min.js new file mode 100644 index 0000000000..126fd8bfb1 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cooklang.min.js @@ -0,0 +1 @@ +!function(e){var a="(?:(?!\\s)[\\d$+<=a-zA-Z\\x80-\\uFFFF])+",t="[^{}@#]+\\{[^}#@]*\\}";e.languages.cooklang={comment:{pattern:/\[-[\s\S]*?-\]|--.*/,greedy:!0},meta:{pattern:/>>.*:.*/,inside:{property:{pattern:/(>>\s*)[^\s:](?:[^:]*[^\s:])?/,lookbehind:!0}}},"cookware-group":{pattern:new RegExp("#(?:"+t+"|"+a+")"),inside:{cookware:{pattern:new RegExp("(^#)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"cookware-keyword":{pattern:/^#/,alias:"keyword"},"quantity-group":{pattern:new RegExp(/\{[^{}@#]*\}/),inside:{quantity:{pattern:new RegExp("(^\\{)[^{}@#]+"),lookbehind:!0,alias:"number"},punctuation:/[{}]/}}}},"ingredient-group":{pattern:new RegExp("@(?:"+t+"|"+a+")"),inside:{ingredient:{pattern:new RegExp("(^@)(?:[^{}@#]+)"),lookbehind:!0,alias:"variable"},"ingredient-keyword":{pattern:/^@/,alias:"keyword"},"amount-group":{pattern:/\{[^{}]*\}/,inside:{amount:{pattern:/([\{|])[^{}|*%]+/,lookbehind:!0,alias:"number"},unit:{pattern:/(%)[^}]+/,lookbehind:!0,alias:"symbol"},"servings-scaler":{pattern:/\*/,alias:"operator"},"servings-alternative-separator":{pattern:/\|/,alias:"operator"},"unit-separator":{pattern:/(?:%|(\*)%)/,lookbehind:!0,alias:"operator"},punctuation:/[{}]/}}}},"timer-group":{pattern:/~(?!\s)[^@#~{}]*\{[^{}]*\}/,inside:{timer:{pattern:/(^~)[^{]+/,lookbehind:!0,alias:"variable"},"duration-group":{pattern:/\{[^{}]*\}/,inside:{punctuation:/[{}]/,unit:{pattern:new RegExp("(%\\s*)(?:h|hours|hrs|m|min|minutes)\\b"),lookbehind:!0,alias:"symbol"},operator:/%/,duration:{pattern:/\d+/,alias:"number"}}},"timer-keyword":{pattern:/^~/,alias:"keyword"}}}}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js index 8b297f5f07..c14f0027ab 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coq.min.js @@ -1 +1 @@ -!function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|)*\\*\\)",i=0;i<2;i++)t=t.replace(//g,function(){return t});t=t.replace(//g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\[\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|)*\\]'.replace(//g,function(){return t})),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism); \ No newline at end of file +!function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|)*\\*\\)",i=0;i<2;i++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\[\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|)*\\]'.replace(//g,(function(){return t}))),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js index eedbcf6e25..2e3ac2eefe 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js @@ -1 +1 @@ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,E=y;for(E+=m.value.length;E<=w;)m=m.next,E+=m.value.length;if(E-=m.value.length,y=E,m.value instanceof W)continue;for(var P=m;P!==t.tail&&(El.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),T(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function T(e,n,t){for(var r=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js index 128911e6f3..a7df36a603 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js @@ -1 +1 @@ -!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); \ No newline at end of file +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js index bd9e804084..45bb0da898 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js @@ -1 +1 @@ -!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:t("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:s.languages.csharp},keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",z=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var S=":[^}\r\n]+",j=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),A=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[j,S]),F=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),P=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,S]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,S]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[A]),lookbehind:!0,greedy:!0,inside:U(A,j)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[P]),lookbehind:!0,greedy:!0,inside:U(P,F)}],char:{pattern:RegExp(x),greedy:!0}}),s.languages.dotnet=s.languages.cs=s.languages.csharp}(Prism); \ No newline at end of file +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js index a917626aa0..4643710d3d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.js @@ -28,9 +28,15 @@ } var round = nested(/\((?:[^()'"@/]|||)*\)/.source, 2); - var square = nested(/\[(?:[^\[\]'"@/]|||)*\]/.source, 2); + var square = nested(/\[(?:[^\[\]'"@/]|||)*\]/.source, 1); var curly = nested(/\{(?:[^{}'"@/]|||)*\}/.source, 2); - var angle = nested(/<(?:[^<>'"@/]|||)*>/.source, 2); + var angle = nested(/<(?:[^<>'"@/]||)*>/.source, 1); + + var inlineCs = /@/.source + + /(?:await\b\s*)?/.source + + '(?:' + /(?!await\b)\w+\b/.source + '|' + round + ')' + + '(?:' + /[?!]?\.\w+\b/.source + '|' + '(?:' + angle + ')?' + round + '|' + square + ')*' + + /(?![?!\.(\[]|<(?!\/))/.source; // Note about the above bracket patterns: // They all ignore HTML expressions that might be in the C# code. This is a problem because HTML (like strings and @@ -44,7 +50,14 @@ // To somewhat alleviate the problem a bit, the patterns for characters (e.g. 'a') is very permissive, it also // allows invalid characters to support HTML expressions like this:

    That's it!

    . - var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?/.source; + var tagAttrInlineCs = /@(?![\w()])/.source + '|' + inlineCs; + var tagAttrValue = '(?:' + + /"[^"@]*"|'[^'@]*'|[^\s'"@>=]+(?=[\s>])/.source + + '|' + + '["\'][^"\'@]*(?:(?:' + tagAttrInlineCs + ')[^"\'@]*)+["\']' + + ')'; + + var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*|(?=[\s/>])))+)?/.source.replace(//, tagAttrValue); var tagContent = /(?!\d)[^\s>\/=$<%]+/.source + tagAttrs + /\s*\/?>/.source; var tagRegion = /\B@?/.source + @@ -110,6 +123,21 @@ inside: csharpWithHtml }; + var inlineValue = { + pattern: RegExp(/(^|[^@])/.source + inlineCs), + lookbehind: true, + greedy: true, + alias: 'variable', + inside: { + 'keyword': /^@/, + 'csharp': cs + } + }; + + Prism.languages.cshtml.tag.pattern = RegExp(/<\/?/.source + tagContent); + Prism.languages.cshtml.tag.inside['attr-value'].pattern = RegExp(/=\s*/.source + tagAttrValue); + Prism.languages.insertBefore('inside', 'punctuation', { 'value': inlineValue }, Prism.languages.cshtml.tag.inside['attr-value']); + Prism.languages.insertBefore('cshtml', 'prolog', { 'razor-comment': { pattern: /@\*[\s\S]*?\*@/, @@ -134,6 +162,8 @@ /try\s*/.source + curly + /\s*catch\s*/.source + round + /\s*/.source + curly + /\s*finally\s*/.source + curly, // @if (...) {...} else if (...) {...} else {...} /if\s*/.source + round + /\s*/.source + curly + '(?:' + /\s*else/.source + '(?:' + /\s+if\s*/.source + round + ')?' + /\s*/.source + curly + ')*', + // @helper Ident(params) { ... } + /helper\s+\w+\s*/.source + round + /\s*/.source + curly, ].join('|') + ')' ), @@ -155,21 +185,7 @@ } }, - 'value': { - pattern: RegExp( - /(^|[^@])@/.source + - /(?:await\b\s*)?/.source + - '(?:' + /\w+\b/.source + '|' + round + ')' + - '(?:' + /[?!]?\.\w+\b/.source + '|' + round + '|' + square + '|' + angle + round + ')*' - ), - lookbehind: true, - greedy: true, - alias: 'variable', - inside: { - 'keyword': /^@/, - 'csharp': cs - } - }, + 'value': inlineValue, 'delegate-operator': { pattern: /(^|[^@])@(?=<)/, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js index 537152a87f..bc2e9b809c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),r=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),t=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n=s("<(?:[^<>'\"@/]|||)*>",2),l="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?",i="(?!\\d)[^\\s>/=$<%]+"+l+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+l+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+i+")";e.languages.cshtml=e.languages.extend("markup",{});var g={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})};e.languages.insertBefore("cshtml","prolog",{"razor-comment":{pattern:/@\*[\s\S]*?\*@/,greedy:!0,alias:"comment"},block:{pattern:RegExp("(^|[^@])@(?:"+[t,"(?:code|functions)\\s*"+t,"(?:for|foreach|lock|switch|using|while)\\s*"+a+"\\s*"+t,"do\\s*"+t+"\\s*while\\s*"+a+"(?:\\s*;)?","try\\s*"+t+"\\s*catch\\s*"+a+"\\s*"+t+"\\s*finally\\s*"+t,"if\\s*"+a+"\\s*"+t+"(?:\\s*else(?:\\s+if\\s*"+a+")?\\s*"+t+")*"].join("|")+")"),lookbehind:!0,greedy:!0,inside:{keyword:/^@\w*/,csharp:g}},directive:{pattern:/^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,lookbehind:!0,greedy:!0,inside:{keyword:/^@\w+/,csharp:g}},value:{pattern:RegExp("(^|[^@])@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+r+"|"+n+a+")*"),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:g}},"delegate-operator":{pattern:/(^|[^@])@(?=<)/,lookbehind:!0,alias:"operator"}}),e.languages.razor=e.languages.cshtml}(Prism); \ No newline at end of file +!function(e){function s(e,s){for(var a=0;a/g,(function(){return"(?:"+e+")"}));return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|\'(?:(?:[^\r\n\'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})\'|(?=[^\\\\](?!\'))))').replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",1),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]||)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="(?:\"[^\"@]*\"|'[^'@]*'|[^\\s'\"@>=]+(?=[\\s>])|[\"'][^\"'@]*(?:(?:@(?![\\w()])|"+n+")[^\"'@]*)+[\"'])",i="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,l),g="(?!\\d)[^\\s>/=$<%]+"+i+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+i+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+g+")";e.languages.cshtml=e.languages.extend("markup",{});var c={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},p={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:c}};e.languages.cshtml.tag.pattern=RegExp(")*"""/.source + + // eslint-disable-next-line regexp/strict + '|' + /'''(?:[^\\']|'(?!''\2)|)*'''/.source + + // eslint-disable-next-line regexp/strict + '|' + /"(?:[^\\\r\n"]|"(?!\2)|)*"/.source + + // eslint-disable-next-line regexp/strict + '|' + /'(?:[^\\\r\n']|'(?!\2)|)*'/.source; + var stringLiteral = '(?:' + stringTypes.replace(//g, stringEscape) + ')'; + + Prism.languages.cue = { + 'comment': { + pattern: /\/\/.*/, + greedy: true + }, + 'string-literal': { + // eslint-disable-next-line regexp/strict + pattern: RegExp(/(^|[^#"'\\])(#*)/.source + stringLiteral + /(?!["'])\2/.source), + lookbehind: true, + greedy: true, + inside: { + // I'm using dirty hack here. We have to know the number hashes at the start of the string somehow, + // but we can't look back. So instead, we will use a lookahead, go to the end of the string, and + // capture the hashes at the end of the string. + 'escape': { + pattern: /(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/, + greedy: true, + alias: 'string' + }, + 'interpolation': { + pattern: /(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/, + greedy: true, + inside: { + 'punctuation': /^\\#*\(|\)$/, + 'expression': { + pattern: /[\s\S]+/, + inside: null + } + } + }, + 'string': /[\s\S]+/ + } + }, + + 'keyword': { + pattern: /(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/, + lookbehind: true + }, + 'boolean': { + pattern: /(^|[^\w$])(?:false|true)(?![\w$])/, + lookbehind: true + }, + 'builtin': { + pattern: /(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/, + lookbehind: true + }, + + 'attribute': { + pattern: /@[\w$]+(?=\s*\()/, + alias: 'function' + }, + 'function': { + pattern: /(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i, + lookbehind: true + }, + + 'number': { + pattern: /(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/, + lookbehind: true + }, + + 'operator': /\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/, + 'punctuation': /[()[\]{},.:]/ + }; + + Prism.languages.cue['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.cue; + +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.min.js new file mode 100644 index 0000000000..e88bcf519c --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cue.min.js @@ -0,0 +1 @@ +!function(e){var n="(?:"+"\"\"\"(?:[^\\\\\"]|\"(?!\"\"\\2)|)*\"\"\"|'''(?:[^\\\\']|'(?!''\\2)|)*'''|\"(?:[^\\\\\r\n\"]|\"(?!\\2)|)*\"|'(?:[^\\\\\r\n']|'(?!\\2)|)*'".replace(//g,"\\\\(?:(?!\\2)|\\2(?:[^()\r\n]|\\([^()]*\\)))")+")";e.languages.cue={comment:{pattern:/\/\/.*/,greedy:!0},"string-literal":{pattern:RegExp("(^|[^#\"'\\\\])(#*)"+n+"(?![\"'])\\2"),lookbehind:!0,greedy:!0,inside:{escape:{pattern:/(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,greedy:!0,alias:"string"},interpolation:{pattern:/(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,greedy:!0,inside:{punctuation:/^\\#*\(|\)$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},keyword:{pattern:/(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,lookbehind:!0},boolean:{pattern:/(^|[^\w$])(?:false|true)(?![\w$])/,lookbehind:!0},builtin:{pattern:/(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,lookbehind:!0},attribute:{pattern:/@[\w$]+(?=\s*\()/,alias:"function"},function:{pattern:/(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,lookbehind:!0},number:{pattern:/(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,lookbehind:!0},operator:/\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,punctuation:/[()[\]{},.:]/},e.languages.cue["string-literal"].inside.interpolation.inside.expression.inside=e.languages.cue}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js index ef2b7f9b76..98c8d86867 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dataweave.min.js @@ -1 +1 @@ -Prism.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}; \ No newline at end of file +!function(e){e.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},keyword:/\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:false|true)\b/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js index 099e998172..16d9fe0a03 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js @@ -1 +1 @@ -!function(i){i.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var r={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(r).forEach(function(e){var n=r[e],a=[];/^\w+$/.test(e)||a.push(/\w+/.exec(e)[0]),"diff"===e&&a.push("bold"),i.languages.diff[e]={pattern:RegExp("^(?:["+n+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(e)[0]}}}}),Object.defineProperty(i.languages.diff,"PREFIXES",{value:r})}(Prism); \ No newline at end of file +!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var n={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(n).forEach((function(a){var i=n[a],r=[];/^\w+$/.test(a)||r.push(/\w+/.exec(a)[0]),"diff"===a&&r.push("bold"),e.languages.diff[a]={pattern:RegExp("^(?:["+i+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(a)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:n})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js index 91bbaa7fc3..24879e50d5 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js @@ -1 +1 @@ -!function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",function(e){o.buildPlaceholders(e,"django",n)}),e.hooks.add("after-tokenize",function(e){o.tokenizePlaceholders(e,"django")}),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",function(e){o.buildPlaceholders(e,"jinja2",n)}),e.hooks.add("after-tokenize",function(e){o.tokenizePlaceholders(e,"jinja2")})}(Prism); \ No newline at end of file +!function(e){e.languages.django={comment:/^\{#[\s\S]*?#\}$/,tag:{pattern:/(^\{%[+-]?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%][+-]?|[+-]?[}%]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},filter:{pattern:/(\|)\w+/,lookbehind:!0,alias:"function"},test:{pattern:/(\bis\s+(?:not\s+)?)(?!not\b)\w+/,lookbehind:!0,alias:"function"},function:/\b[a-z_]\w+(?=\s*\()/i,keyword:/\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Ff]alse|[Nn]one|[Tt]rue/,variable:/\b\w+\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"django",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"django")})),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",(function(e){o.buildPlaceholders(e,"jinja2",n)})),e.hooks.add("after-tokenize",(function(e){o.tokenizePlaceholders(e,"jinja2")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js index 3d23e8a719..dd5622a1c4 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js @@ -1 +1 @@ -!function(e){var r="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"}),n="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,function(){return n}),o={pattern:RegExp(n),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,n){return e=e.replace(//g,function(){return t}).replace(//g,function(){return r}),RegExp(e,n)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); \ No newline at end of file +!function(e){var n="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,(function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"})),r="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,(function(){return r})),o={pattern:RegExp(r),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,r){return e=e.replace(//g,(function(){return t})).replace(//g,(function(){return n})),RegExp(e,r)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js index 457ed17e2c..6af79d24ec 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dot.min.js @@ -1 +1 @@ -!function(e){var n="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",a={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,a){return RegExp(e.replace(//g,function(){return n}),a)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:a},"attr-value":{pattern:r("(=[ \t\r\n]*)"),lookbehind:!0,greedy:!0,inside:a},"attr-name":{pattern:r("([\\[;, \t\r\n])(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:a},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])"),lookbehind:!0,greedy:!0,inside:a},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism); \ No newline at end of file +!function(e){var a="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",n={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,n){return RegExp(e.replace(//g,(function(){return a})),n)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:n},"attr-value":{pattern:r("(=[ \t\r\n]*)"),lookbehind:!0,greedy:!0,inside:n},"attr-name":{pattern:r("([\\[;, \t\r\n])(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:n},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])"),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js index 1a07bdb8f1..84affeef07 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ejs.min.js @@ -1 +1 @@ -!function(e){e.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:e.languages.javascript}},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"ejs",/<%(?!%)[\s\S]+?%>/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"ejs")}),e.languages.eta=e.languages.ejs}(Prism); \ No newline at end of file +!function(a){a.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:a.languages.javascript}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"ejs",/<%(?!%)[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"ejs")})),a.languages.eta=a.languages.ejs}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js index ec0d974d78..e885b9f134 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js @@ -1 +1 @@ -Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js index 9e38fee156..4b9da608d8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js @@ -1 +1 @@ -!function(n){n.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:n.languages.ruby}},n.hooks.add("before-tokenize",function(e){n.languages["markup-templating"].buildPlaceholders(e,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"erb")})}(Prism); \ No newline at end of file +!function(e){e.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:e.languages.ruby}},e.hooks.add("before-tokenize",(function(n){e.languages["markup-templating"].buildPlaceholders(n,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"erb")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js index fba6254b2c..ccb92a1f12 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js @@ -13,7 +13,7 @@ Prism.languages.erlang = { alias: 'atom' }, 'boolean': /\b(?:false|true)\b/, - 'keyword': /\b(?:after|case|catch|end|fun|if|of|receive|try|when)\b/, + 'keyword': /\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/, 'number': [ /\$\\?./, /\b\d+#[a-z0-9]+/i, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js index 7d041ab6f2..806d0b16ea 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js @@ -1 +1 @@ -Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; \ No newline at end of file +Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:false|true)\b/,keyword:/\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js index 635bae5929..431aa61aff 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-etlua.min.js @@ -1 +1 @@ -!function(e){e.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:e.languages.lua}},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"etlua",/<%[\s\S]+?%>/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"etlua")})}(Prism); \ No newline at end of file +!function(a){a.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:a.languages.lua}},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"etlua",/<%[\s\S]+?%>/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"etlua")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js index 5b298ac0e1..b2a7e8b5b0 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.js @@ -39,11 +39,11 @@ Prism.languages['excel-formula'] = { }, 'function-name': { pattern: /\b[A-Z]\w*(?=\()/i, - alias: 'keyword' + alias: 'builtin' }, 'range': { pattern: /\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i, - alias: 'property', + alias: 'selector', inside: { 'operator': /:/, 'cell': /\$?[A-Z]+\$?\d+/i, @@ -55,7 +55,7 @@ Prism.languages['excel-formula'] = { // Excel is case insensitive, so the string "foo1" could be either a variable or a cell. // To combat this, we match cells case insensitive, if the contain at least one "$", and case sensitive otherwise. pattern: /\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/, - alias: 'property' + alias: 'selector' }, 'number': /(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i, 'boolean': /\b(?:FALSE|TRUE)\b/i, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js index 1f012d96f3..bdf842f32d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-excel-formula.min.js @@ -1 +1 @@ -Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"keyword"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"property",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"property"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"]; \ No newline at end of file +Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"builtin"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"selector",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"selector"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:FALSE|TRUE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"]; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js index 58a01e35ba..37b8a6395e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-factor.min.js @@ -1 +1 @@ -!function(e){var t={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach(function(e){i[e].pattern=r(a[e])});i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"]),e.languages.factor=i}(Prism); \ No newline at end of file +!function(e){var t={function:/\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|eval|execute)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach((function(e){i[e].pattern=r(a[e])})),i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"]),e.languages.factor=i}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js index 3565417201..bd533dcf04 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-false.min.js @@ -1 +1 @@ -Prism.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism); \ No newline at end of file +!function(a){a.languages.flow=a.languages.extend("javascript",{}),a.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),a.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js index ce9b3b69b5..2b2a431a96 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ftl.min.js @@ -1 +1 @@ -!function(n){for(var i="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",e=0;e<2;e++)i=i.replace(//g,function(){return i});i=i.replace(//g,"[^\\s\\S]");var t={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,function(){return i})),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,function(){return i})),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};t.string[1].inside.interpolation.inside.rest=t,n.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:t}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:t}}}},n.hooks.add("before-tokenize",function(e){var t=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,function(){return i}),"gi");n.languages["markup-templating"].buildPlaceholders(e,"ftl",t)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"ftl")})}(Prism); \ No newline at end of file +!function(e){for(var t="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,"[^\\s\\S]");var i={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,(function(){return t}))),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,(function(){return t}))),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:false|true)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};i.string[1].inside.interpolation.inside.rest=i,e.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:i}}}},e.hooks.add("before-tokenize",(function(n){var i=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,(function(){return t})),"gi");e.languages["markup-templating"].buildPlaceholders(n,"ftl",i)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"ftl")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js index 7fbbc3ddc5..b3ac0d67a2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js @@ -10,11 +10,11 @@ Prism.languages.gedcom = { } } }, - 'tag': { + 'record': { // Preceded by level and optional pointer pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m, lookbehind: true, - alias: 'string' + alias: 'tag' }, 'level': { pattern: /(^[\t ]*)\d+/m, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js index 9b199672c2..c16feee9a1 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js @@ -1 +1 @@ -Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},tag:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"string"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; \ No newline at end of file +Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},record:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"tag"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.js new file mode 100644 index 0000000000..c8cf59d948 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.js @@ -0,0 +1,43 @@ +Prism.languages.gettext = { + 'comment': [ + { + pattern: /# .*/, + greedy: true, + alias: 'translator-comment' + }, + { + pattern: /#\..*/, + greedy: true, + alias: 'extracted-comment' + }, + { + pattern: /#:.*/, + greedy: true, + alias: 'reference-comment' + }, + { + pattern: /#,.*/, + greedy: true, + alias: 'flag-comment' + }, + { + pattern: /#\|.*/, + greedy: true, + alias: 'previously-untranslated-comment' + }, + { + pattern: /#.*/, + greedy: true + }, + ], + 'string': { + pattern: /(^|[^\\])"(?:[^"\\]|\\.)*"/, + lookbehind: true, + greedy: true + }, + 'keyword': /^msg(?:ctxt|id|id_plural|str)\b/m, + 'number': /\b\d+\b/, + 'punctuation': /[\[\]]/ +}; + +Prism.languages.po = Prism.languages.gettext; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.min.js new file mode 100644 index 0000000000..f542a249c5 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gettext.min.js @@ -0,0 +1 @@ +Prism.languages.gettext={comment:[{pattern:/# .*/,greedy:!0,alias:"translator-comment"},{pattern:/#\..*/,greedy:!0,alias:"extracted-comment"},{pattern:/#:.*/,greedy:!0,alias:"reference-comment"},{pattern:/#,.*/,greedy:!0,alias:"flag-comment"},{pattern:/#\|.*/,greedy:!0,alias:"previously-untranslated-comment"},{pattern:/#.*/,greedy:!0}],string:{pattern:/(^|[^\\])"(?:[^"\\]|\\.)*"/,lookbehind:!0,greedy:!0},keyword:/^msg(?:ctxt|id|id_plural|str)\b/m,number:/\b\d+\b/,punctuation:/[\[\]]/},Prism.languages.po=Prism.languages.gettext; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js index 3a702b6db1..183dac72dd 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js @@ -1 +1 @@ -!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";Prism.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(); \ No newline at end of file +!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";a.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js index b60589c308..3a5133fc1b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js @@ -1 +1 @@ -Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",function(n){if("graphql"===n.language)for(var o=n.tokens.filter(function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type}),s=0;s0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var u=e;u=0&&b(p,"variable-input")}}}}function l(n){return t[e+n]}function c(n,t){t=t||0;for(var e=0;e]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/, + lookbehind: true + }, + 'punctuation': /\.+|[{}[\];(),:$]/ + }); + + Prism.languages.insertBefore('groovy', 'string', { + 'shebang': { + pattern: /#!.+/, + alias: 'comment', + greedy: true + }, + 'interpolation-string': { // TODO: Slash strings (e.g. /foo/) can contain line breaks but this will cause a lot of trouble with // simple division (see JS regex), so find a fix maybe? - pattern: /(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/, - greedy: true + pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/, + greedy: true, + inside: { + 'interpolation': interpolation, + 'string': /[\s\S]+/ + } } - ], - 'keyword': /\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/, - 'number': /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i, - 'operator': { - pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/, - lookbehind: true - }, - 'punctuation': /\.+|[{}[\];(),:$]/ -}); - -Prism.languages.insertBefore('groovy', 'string', { - 'shebang': { - pattern: /#!.+/, - alias: 'comment' - } -}); - -Prism.languages.insertBefore('groovy', 'punctuation', { - 'spock-block': /\b(?:and|cleanup|expect|given|setup|then|when|where):/ -}); - -Prism.languages.insertBefore('groovy', 'function', { - 'annotation': { - pattern: /(^|[^.])@\w+/, - lookbehind: true, - alias: 'punctuation' - } -}); + }); -// Handle string interpolation -Prism.hooks.add('wrap', function (env) { - if (env.language === 'groovy' && env.type === 'string') { - var delimiter = env.content[0]; + Prism.languages.insertBefore('groovy', 'punctuation', { + 'spock-block': /\b(?:and|cleanup|expect|given|setup|then|when|where):/ + }); - if (delimiter != "'") { - var pattern = /([^\\])(?:\$(?:\{.*?\}|[\w.]+))/; - if (delimiter === '$') { - pattern = /([^\$])(?:\$(?:\{.*?\}|[\w.]+))/; - } - - // To prevent double HTML-encoding we have to decode env.content first - env.content = env.content.replace(/</g, '<').replace(/&/g, '&'); + Prism.languages.insertBefore('groovy', 'function', { + 'annotation': { + pattern: /(^|[^.])@\w+/, + lookbehind: true, + alias: 'punctuation' + } + }); - env.content = Prism.highlight(env.content, { - 'expression': { - pattern: pattern, - lookbehind: true, - inside: Prism.languages.groovy - } - }); + interpolation.inside.expression.inside = Prism.languages.groovy; - env.classes.push(delimiter === '/' ? 'regex' : 'gstring'); - } - } -}); +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js index fa3203b359..2242f9f61c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js @@ -1 +1 @@ -Prism.languages.groovy=Prism.languages.extend("clike",{string:[{pattern:/("""|''')(?:[^\\]|\\[\s\S])*?\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0},{pattern:/(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),Prism.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment"}}),Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),Prism.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),Prism.hooks.add("wrap",function(e){if("groovy"===e.language&&"string"===e.type){var t=e.content[0];if("'"!=t){var n=/([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;"$"===t&&(n=/([^\$])(?:\$(?:\{.*?\}|[\w.]+))/),e.content=e.content.replace(/</g,"<").replace(/&/g,"&"),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push("/"===t?"regex":"gstring")}}}); \ No newline at end of file +!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.groovy}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js index db9c658fa5..7b81c0ca70 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js @@ -1 +1 @@ -!function(n){n.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:n.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:n.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"symbol"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:n.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:n.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:n.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:n.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:n.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var e=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=e.length;r@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"handlebars")}),e.languages.hbs=e.languages.handlebars}(Prism); \ No newline at end of file +!function(a){a.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},a.hooks.add("before-tokenize",(function(e){a.languages["markup-templating"].buildPlaceholders(e,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),a.hooks.add("after-tokenize",(function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"handlebars")})),a.languages.hbs=a.languages.handlebars,a.languages.mustache=a.languages.handlebars}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js index 91df7ec8e4..94a7f07b71 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js @@ -1 +1 @@ -!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n,s,i=t.languages,p={"application/javascript":i.javascript,"application/json":i.json||i.javascript,"application/xml":i.xml,"text/xml":i.xml,"text/html":i.html,"text/css":i.css,"text/plain":i.plain},r={"application/json":!0,"application/xml":!0};for(var l in p)if(p[l]){e=e||{};var o=r[l]?(void 0,s=(n=l).replace(/^[a-z]+\//,""),"(?:"+n+"|\\w+/(?:[\\w.-]+\\+)+"+s+"(?![+\\w.-]))"):l;e[l.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+o+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:p[l]}}e&&t.languages.insertBefore("http","header",e)}(Prism); \ No newline at end of file +!function(t){function a(t){return RegExp("(^(?:"+t+"):[ \t]*(?![ \t]))[^]+","i")}t.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:a("Content-Security-Policy"),lookbehind:!0,alias:["csp","languages-csp"],inside:t.languages.csp},{pattern:a("Public-Key-Pins(?:-Report-Only)?"),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:t.languages.hpkp},{pattern:a("Strict-Transport-Security"),lookbehind:!0,alias:["hsts","languages-hsts"],inside:t.languages.hsts},{pattern:a("[^:]+"),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var e,n=t.languages,s={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css,"text/plain":n.plain},i={"application/json":!0,"application/xml":!0};function r(t){var a=t.replace(/^[a-z]+\//,"");return"(?:"+t+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"}for(var p in s)if(s[p]){e=e||{};var l=i[p]?r(p):p;e[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+l+"(?:(?:\r\n?|\n)[\\w-].*)*(?:\r(?:\n|(?!\n))|\n))[^ \t\\w-][^]*","i"),lookbehind:!0,inside:s[p]}}e&&t.languages.insertBefore("http","header",e)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js index 7849a573ff..412677d1ad 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icu-message-format.min.js @@ -1 +1 @@ -!function(e){function s(e,t){return t<=0?"[]":e.replace(//g,function(){return s(e,t-1)})}var t=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:t,greedy:!0,inside:{escape:n}},a=s("\\{(?:[^{}']|'(?![{},'])|''||)*\\}".replace(//g,function(){return t.source}),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+s("(?:[^{}']|'[^']*'|\\{(?:)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism); \ No newline at end of file +!function(e){function t(e,s){return s<=0?"[]":e.replace(//g,(function(){return t(e,s-1)}))}var s=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:s,greedy:!0,inside:{escape:n}},a=t("\\{(?:[^{}']|'(?![{},'])|''||)*\\}".replace(//g,(function(){return s.source})),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:few|many|one|other|two|zero)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:date|duration|number|ordinal|spellout|time)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+t("(?:[^{}']|'[^']*'|\\{(?:)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js index 9fe9f695f9..9d10f2fe62 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js @@ -1,13 +1,13 @@ (function (Prism) { - var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; // full package (optional) + parent classes (optional) - var classNamePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; + var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; // based on the java naming conventions var className = { - pattern: RegExp(classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), lookbehind: true, inside: { 'namespace': { @@ -29,9 +29,16 @@ 'class-name': [ className, { - // variables and parameters + // variables, parameters, and constructor references // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods) - pattern: RegExp(classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source), + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source), + lookbehind: true, + inside: className.inside + }, + { + // class names based on keyword + // this to support class names (or generic parameters) which do not contain a lower case letter (also works for methods) + pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source), lookbehind: true, inside: className.inside } @@ -79,6 +86,30 @@ 'operator': /[?&|]/ } }, + 'import': [ + { + pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source), + lookbehind: true, + inside: { + 'namespace': className.inside.namespace, + 'punctuation': /\./, + 'operator': /\*/, + 'class-name': /\w+/ + } + }, + { + pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source), + lookbehind: true, + alias: 'static', + inside: { + 'namespace': className.inside.namespace, + 'static': /\b\w+$/, + 'punctuation': /\./, + 'operator': /\*/, + 'class-name': /\w+/ + } + } + ], 'namespace': { pattern: RegExp( /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/ diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js index 897da4e88c..d240e5076e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js @@ -1 +1 @@ -!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); \ No newline at end of file +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js index 5cdc8bfcb3..d7f0f13f29 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoc.min.js @@ -1 +1 @@ -!function(a){var e=/(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m,n="(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*)?|".replace(//g,function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"});a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); \ No newline at end of file +!function(a){var e=/(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m,n="(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*)?|".replace(//g,(function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"}));a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js index 52e19ba937..429dd491ea 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javadoclike.min.js @@ -1 +1 @@ -!function(p){var a=p.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(a,"addSupport",{value:function(a,e){"string"==typeof a&&(a=[a]),a.forEach(function(a){!function(a,e){var n="doc-comment",t=p.languages[a];if(t){var r=t[n];if(!r){var o={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}};r=(t=p.languages.insertBefore(a,"comment",o))[n]}if(r instanceof RegExp&&(r=t[n]={pattern:r}),Array.isArray(r))for(var i=0,s=r.length;i|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; \ No newline at end of file +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js index e96a55f710..c9c5eeb3ea 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jq.min.js @@ -1 +1 @@ -!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,function(){return n})),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); \ No newline at end of file +!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('(^|[^\\\\])"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,(function(){return n}))),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),lookbehind:!0,greedy:!0,inside:i},string:{pattern:t,lookbehind:!0,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:false|true)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js index 390d8edd4f..8d8cba12f4 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-js-extras.min.js @@ -1 +1 @@ -!function(a){function e(a,e){return RegExp(a.replace(//g,function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"}),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r/g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r=v.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=v[f],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++f;var o=i.substring(0,s),p=d(y[a]),l=i.substring(s+a.length),g=[];if(o&&g.push(o),g.push(p),l){var u=[l];e(u),g.push.apply(g,u)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):r.content=g}}else{var c=r.content;Array.isArray(c)?e(c):e([c])}}}(n),new u.Token(i,n,"language-"+i,a)}u.languages.javascript["template-string"]=[t("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),t("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),t("svg","\\bsvg"),t("markdown","\\b(?:markdown|md)"),t("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),t("sql","\\bsql"),e].filter(Boolean);var o={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}u.hooks.add("after-tokenize",function(e){e.language in o&&!function e(t){for(var n=0,r=t.length;n=c.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=c[o],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++o;var p=i.substring(0,s),u=l(g[a]),f=i.substring(s+a.length),y=[];if(p&&y.push(p),y.push(u),f){var v=[f];e(v),y.push.apply(y,v)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(y)),n+=y.length-1):r.content=y}}else{var d=r.content;Array.isArray(d)?e(d):e([d])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),o("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),o("svg","\\bsvg"),o("markdown","\\b(?:markdown|md)"),o("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),o("sql","\\bsql"),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function c(e){return"string"==typeof e?e:Array.isArray(e)?e.map(c).join(""):c(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,function(){return n})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); \ No newline at end of file +!function(e){var a=e.languages.javascript,n="\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}",t="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(t+"(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)"),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(t+"\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)"),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\\s+(?:\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js index 0534a54e86..8aa6362fa3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js @@ -1 +1 @@ -!function(o){var t=o.util.clone(o.languages.javascript),e="(?:\\{*\\.{3}(?:[^{}]|)*\\})";function n(t,n){return t=t.replace(//g,function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"}).replace(//g,function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"}).replace(//g,function(){return e}),RegExp(t,n)}e=n(e).source,o.languages.jsx=o.languages.extend("markup",t),o.languages.jsx.tag.pattern=n("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),o.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,o.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,o.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,o.languages.jsx.tag.inside.comment=t.comment,o.languages.insertBefore("inside","attr-name",{spread:{pattern:n(""),inside:o.languages.jsx}},o.languages.jsx.tag),o.languages.insertBefore("inside","special-attr",{script:{pattern:n("="),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:o.languages.jsx}}},o.languages.jsx.tag);var i=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(i).join(""):""},r=function(t){for(var n=[],e=0;e"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):0*\\.{3}(?:[^{}]|)*\\})";function a(t,n){return t=t.replace(//g,(function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"})).replace(//g,(function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"})).replace(//g,(function(){return e})),RegExp(t,n)}e=a(e).source,t.languages.jsx=t.languages.extend("markup",n),t.languages.jsx.tag.pattern=a("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),t.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,t.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,t.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,t.languages.jsx.tag.inside.comment=n.comment,t.languages.insertBefore("inside","attr-name",{spread:{pattern:a(""),inside:t.languages.jsx}},t.languages.jsx.tag),t.languages.insertBefore("inside","special-attr",{script:{pattern:a("="),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:t.languages.jsx}}},t.languages.jsx.tag);var s=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(s).join(""):""},g=function(n){for(var e=[],a=0;a0&&e[e.length-1].tagName===s(o.content[0].content[1])&&e.pop():"/>"===o.content[o.content.length-1].content||e.push({tagName:s(o.content[0].content[1]),openedBraces:0}):e.length>0&&"punctuation"===o.type&&"{"===o.content?e[e.length-1].openedBraces++:e.length>0&&e[e.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?e[e.length-1].openedBraces--:i=!0),(i||"string"==typeof o)&&e.length>0&&0===e[e.length-1].openedBraces){var r=s(o);a0&&("string"==typeof n[a-1]||"plain-text"===n[a-1].type)&&(r=s(n[a-1])+r,n.splice(a-1,1),a--),n[a]=new t.Token("plain-text",r,null,r)}o.content&&"string"!=typeof o.content&&g(o.content)}};t.hooks.add("after-tokenize",(function(t){"jsx"!==t.language&&"tsx"!==t.language||g(t.tokens)}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js index e5eb79b5f3..8a82b4ca48 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keepalived.min.js @@ -1 +1 @@ -Prism.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp("\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}|(?:[\\da-f]{1,4}:){0,5}:|::(?:[\\da-f]{1,4}:){0,5}|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:/\\d{1,3})?|(?:/\\d{1,2})?)\\b".replace(//g,function(){return"(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))"}),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}; \ No newline at end of file +Prism.languages.keepalived={comment:{pattern:/[#!].*/,greedy:!0},string:{pattern:/(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,lookbehind:!0,greedy:!0},ip:{pattern:RegExp("\\b(?:(?:(?:[\\da-f]{1,4}:){7}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}:[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){5}:(?:[\\da-f]{1,4}:)?[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){4}:(?:[\\da-f]{1,4}:){0,2}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){3}:(?:[\\da-f]{1,4}:){0,3}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){2}:(?:[\\da-f]{1,4}:){0,4}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){6}|(?:[\\da-f]{1,4}:){0,5}:|::(?:[\\da-f]{1,4}:){0,5}|[\\da-f]{1,4}::(?:[\\da-f]{1,4}:){0,5}[\\da-f]{1,4}|::(?:[\\da-f]{1,4}:){0,6}[\\da-f]{1,4}|(?:[\\da-f]{1,4}:){1,7}:)(?:/\\d{1,3})?|(?:/\\d{1,2})?)\\b".replace(//g,(function(){return"(?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))"})),"i"),alias:"number"},path:{pattern:/(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,lookbehind:!0,alias:"string"},variable:/\$\{?\w+\}?/,email:{pattern:/[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,alias:"string"},"conditional-configuration":{pattern:/@\^?[\w-]+/,alias:"variable"},operator:/=/,property:/\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,constant:/\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,number:{pattern:/(^|[^\w.-])-?\d+(?:\.\d+)?/,lookbehind:!0},boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\{\}]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js index 55f76c96e9..18f6bded2e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js @@ -28,7 +28,7 @@ Prism.languages.keyman = { alias: 'keyword' }, 'structural-keyword': { - pattern: /\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i, + pattern: /\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i, alias: 'keyword' }, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js index 749507f544..f24968c0a9 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js @@ -1 +1 @@ -Prism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}; \ No newline at end of file +Prism.languages.keyman={comment:{pattern:/\bc .*/i,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},"virtual-key":{pattern:/\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,greedy:!0,alias:"function"},"header-keyword":{pattern:/&\w+/,alias:"bold"},"header-statement":{pattern:/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,alias:"bold"},"rule-keyword":{pattern:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,alias:"keyword"},"structural-keyword":{pattern:/\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,alias:"keyword"},"compile-target":{pattern:/\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,alias:"property"},number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\$]|\.\./,punctuation:/[()=,]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js index 5f19298508..3d86f031f0 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latte.min.js @@ -1 +1 @@ -!function(t){t.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:t.languages.php}};var e=t.languages.extend("markup",{});t.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:t.languages.php}}}}}},e.tag),t.hooks.add("before-tokenize",function(a){if("latte"===a.language){t.languages["markup-templating"].buildPlaceholders(a,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),a.grammar=e}}),t.hooks.add("after-tokenize",function(a){t.languages["markup-templating"].tokenizePlaceholders(a,"latte")})}(Prism); \ No newline at end of file +!function(a){a.languages.latte={comment:/^\{\*[\s\S]*/,"latte-tag":{pattern:/(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,lookbehind:!0,alias:"important"},delimiter:{pattern:/^\{\/?|\}$/,alias:"punctuation"},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:a.languages.php}};var t=a.languages.extend("markup",{});a.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:a.languages.php}}}}}},t.tag),a.hooks.add("before-tokenize",(function(e){"latte"===e.language&&(a.languages["markup-templating"].buildPlaceholders(e,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g),e.grammar=t)})),a.hooks.add("after-tokenize",(function(t){a.languages["markup-templating"].tokenizePlaceholders(t,"latte")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js index 49ce96e9a4..0ca11e5b64 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lilypond.min.js @@ -1 +1 @@ -!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,function(){return n});n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,function(){return n}),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); \ No newline at end of file +!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,(function(){return n}));n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,(function(){return n})),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.js new file mode 100644 index 0000000000..7a0b5619c3 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.js @@ -0,0 +1,30 @@ +Prism.languages['linker-script'] = { + 'comment': { + pattern: /(^|\s)\/\*[\s\S]*?(?:$|\*\/)/, + lookbehind: true, + greedy: true + }, + 'identifier': { + pattern: /"[^"\r\n]*"/, + greedy: true + }, + + 'location-counter': { + pattern: /\B\.\B/, + alias: 'important' + }, + + 'section': { + pattern: /(^|[^\w*])\.\w+\b/, + lookbehind: true, + alias: 'keyword' + }, + 'function': /\b[A-Z][A-Z_]*(?=\s*\()/, + + 'number': /\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/, + + 'operator': />>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/, + 'punctuation': /[(){},;]/ +}; + +Prism.languages['ld'] = Prism.languages['linker-script']; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.min.js new file mode 100644 index 0000000000..1cf2981243 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-linker-script.min.js @@ -0,0 +1 @@ +Prism.languages["linker-script"]={comment:{pattern:/(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,lookbehind:!0,greedy:!0},identifier:{pattern:/"[^"\r\n]*"/,greedy:!0},"location-counter":{pattern:/\B\.\B/,alias:"important"},section:{pattern:/(^|[^\w*])\.\w+\b/,lookbehind:!0,alias:"keyword"},function:/\b[A-Z][A-Z_]*(?=\s*\()/,number:/\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,operator:/>>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,punctuation:/[(){},;]/},Prism.languages.ld=Prism.languages["linker-script"]; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js index a405414fac..9829caedf7 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js @@ -1 +1 @@ -Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",function(e){var i=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,function(e){var t=/^\{%-?\s*(\w+)/.exec(e);if(t){var n=t[1];if("raw"===n&&!i)return i=!0;if("endraw"===n)return!(i=!1)}return!i})}),Prism.hooks.add("after-tokenize",function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")}); \ No newline at end of file +Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:false|nil|true)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",(function(e){var t=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,(function(e){var n=/^\{%-?\s*(\w+)/.exec(e);if(n){var i=n[1];if("raw"===i&&!t)return t=!0,!0;if("endraw"===i)return t=!1,!0}return!t}))})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js index 4ee5290b13..66f74bdce3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js @@ -1 +1 @@ -!function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?=\\s)",s="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",l={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp(r+"(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)"+i),lookbehind:!0},{pattern:RegExp(r+"(?:append|by|collect|concat|do|finally|for|in|return)"+i),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp(r+"def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp(r+"(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+s+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp(r+"lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},o={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+s+"\\)"),inside:l},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:l},p="\\S+(?:\\s+\\S+)*",d={pattern:RegExp(r+s+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+p),inside:o},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+p),inside:o},keys:{pattern:RegExp("&key\\s+"+p+"(?:\\s+&allow-other-keys)?"),inside:o},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};l.lambda.inside.arguments=d,l.defun.inside.arguments=e.util.clone(d),l.defun.inside.arguments.inside.sublist=d,e.languages.lisp=l,e.languages.elisp=l,e.languages.emacs=l,e.languages["emacs-lisp"]=l}(Prism); \ No newline at end of file +!function(e){function n(e){return RegExp("(\\()(?:"+e+")(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])(?:"+e+")(?=[\\s)])")}var t="(?!\\d)[-+*/~!@$%^=<>{}\\w]+",r="(\\()",i="(?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\))*\\))*\\))*",s={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp("(\\()(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)(?=\\s)"),lookbehind:!0},{pattern:RegExp("(\\()(?:append|by|collect|concat|do|finally|for|in|return)(?=\\s)"),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("nil|t"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp("(\\()def(?:const|custom|group|var)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp("(\\()(?:cl-)?(?:defmacro|defun\\*?)\\s+"+t+"\\s+\\("+i+"\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp("(\\()lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},l={"lisp-marker":RegExp("&(?!\\d)[-+*/~!@$%^=<>{}\\w]+"),varform:{pattern:RegExp("\\("+t+"\\s+(?=\\S)"+i+"\\)"),inside:s},argument:{pattern:RegExp("(^|[\\s(])"+t),lookbehind:!0,alias:"variable"},rest:s},o="\\S+(?:\\s+\\S+)*",p={pattern:RegExp(r+i+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+o),inside:l},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+o),inside:l},keys:{pattern:RegExp("&key\\s+"+o+"(?:\\s+&allow-other-keys)?"),inside:l},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};s.lambda.inside.arguments=p,s.defun.inside.arguments=e.util.clone(p),s.defun.inside.arguments.inside.sublist=p,e.languages.lisp=s,e.languages.elisp=s,e.languages.emacs=s,e.languages["emacs-lisp"]=s}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js index 7e178801b5..9088cbd53c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-llvm.min.js @@ -1 +1 @@ -Prism.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}; \ No newline at end of file +!function(a){a.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:false|true)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js index cc9f7b28da..2b16ba515f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js @@ -1 +1 @@ -!function(s){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";s.languages.markdown=s.languages.extend("markup",{}),s.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:s.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:s.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:s.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike","code-snippet"].forEach(function(n){e!==n&&(s.languages.markdown[e].inside.content.inside[n]=s.languages.markdown[n])})}),s.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},u=String.fromCodePoint||String.fromCharCode;s.languages.md=s.languages.markdown}(Prism); \ No newline at end of file +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js index eaf10acfa7..3a171d0431 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js @@ -1 +1 @@ -!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js index 738b2decd8..ee4b23ac66 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js @@ -1 +1 @@ -Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; \ No newline at end of file +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.js new file mode 100644 index 0000000000..6a38e1728c --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.js @@ -0,0 +1,50 @@ +// https://www.stata.com/manuals/m.pdf + +(function (Prism) { + + var orgType = /\b(?:(?:col|row)?vector|matrix|scalar)\b/.source; + var type = /\bvoid\b||\b(?:complex|numeric|pointer(?:\s*\([^()]*\))?|real|string|(?:class|struct)\s+\w+|transmorphic)(?:\s*)?/.source + .replace(//g, orgType); + + Prism.languages.mata = { + 'comment': { + pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//, + greedy: true + }, + 'string': { + pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/, + greedy: true + }, + + 'class-name': { + pattern: /(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/, + lookbehind: true + }, + 'type': { + pattern: RegExp(type), + alias: 'class-name', + inside: { + 'punctuation': /[()]/, + 'keyword': /\b(?:class|function|struct|void)\b/ + } + }, + 'keyword': /\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/, + 'constant': /\bNULL\b/, + + 'number': { + pattern: /(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i, + lookbehind: true + }, + 'missing': { + pattern: /(^|[^\w.])(?:\.[a-z]?)(?![\w.])/, + lookbehind: true, + alias: 'symbol' + }, + + 'function': /\b[a-z_]\w*(?=\s*\()/i, + + 'operator': /\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/, + 'punctuation': /[()[\]{},;.]/ + }; + +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.min.js new file mode 100644 index 0000000000..09fc0a7c67 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mata.min.js @@ -0,0 +1 @@ +!function(t){var e="\\bvoid\\b||\\b(?:complex|numeric|pointer(?:\\s*\\([^()]*\\))?|real|string|(?:class|struct)\\s+\\w+|transmorphic)(?:\\s*)?".replace(//g,"\\b(?:(?:col|row)?vector|matrix|scalar)\\b");t.languages.mata={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,lookbehind:!0},type:{pattern:RegExp(e),alias:"class-name",inside:{punctuation:/[()]/,keyword:/\b(?:class|function|struct|void)\b/}},keyword:/\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,constant:/\bNULL\b/,number:{pattern:/(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,lookbehind:!0},missing:{pattern:/(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,lookbehind:!0,alias:"symbol"},function:/\b[a-z_]\w*(?=\s*\()/i,operator:/\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,punctuation:/[()[\]{},;.]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js index 910dcb0845..ea4b35af79 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-maxscript.min.js @@ -1 +1 @@ -!function(t){var e=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;Prism.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:^|[;=<>+\\-*/^({\\[]|\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b)[ \t]*)(?!"+e.source+")[a-z_]\\w*\\b(?=[ \t]*(?:(?!"+e.source+")[a-z_]|\\d|-\\.?\\d|[({'\"$@#?]))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:e,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}}(); \ No newline at end of file +!function(t){var e=/\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;t.languages.maxscript={comment:{pattern:/\/\*[\s\S]*?(?:\*\/|$)|--.*/,greedy:!0},string:{pattern:/(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,lookbehind:!0,greedy:!0},path:{pattern:/\$(?:[\w/\\.*?]|'[^']*')*/,greedy:!0,alias:"string"},"function-call":{pattern:RegExp("((?:^|[;=<>+\\-*/^({\\[]|\\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\\b)[ \t]*)(?!"+e.source+")[a-z_]\\w*\\b(?=[ \t]*(?:(?!"+e.source+")[a-z_]|\\d|-\\.?\\d|[({'\"$@#?]))","im"),lookbehind:!0,greedy:!0,alias:"function"},"function-definition":{pattern:/(\b(?:fn|function)\s+)\w+\b/i,lookbehind:!0,alias:"function"},argument:{pattern:/\b[a-z_]\w*(?=:)/i,alias:"attr-name"},keyword:e,boolean:/\b(?:false|true)\b/,time:{pattern:/(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,lookbehind:!0,alias:"number"},number:[{pattern:/(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,lookbehind:!0},/\b(?:e|pi)\b/],constant:/\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,color:{pattern:/\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,alias:"constant"},operator:/[-+*/<>=!]=?|[&^?]|#(?!\()/,punctuation:/[()\[\]{}.:,;]|#(?=\()|\\$/m}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js index 13a5947b00..d059266745 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js @@ -1,15 +1,21 @@ Prism.languages.mel = { - 'comment': /\/\/.*/, + 'comment': { + pattern: /\/\/.*|\/\*[\s\S]*?\*\//, + greedy: true + }, 'code': { - pattern: /`(?:\\.|[^\\`\r\n])*`/, + pattern: /`(?:\\.|[^\\`])*`/, greedy: true, alias: 'italic', inside: { 'delimiter': { pattern: /^`|`$/, alias: 'punctuation' + }, + 'statement': { + pattern: /[\s\S]+/, + inside: null // see below } - // See rest below } }, 'string': { @@ -23,21 +29,18 @@ Prism.languages.mel = { alias: 'operator' }, 'keyword': /\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/, - 'function': /\b\w+(?=\()|\b(?:CBG|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|Mayatomr|about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/, + 'function': { + pattern: /((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im, + lookbehind: true, + greedy: true + }, - 'operator': [ - /\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/, - { - // We don't want to match << - pattern: /(^|[^<])<(?!<)/, - lookbehind: true - }, - { - // We don't want to match >> - pattern: /(^|[^>])>(?!>)/, - lookbehind: true - } - ], - 'punctuation': /<<|>>|[.,:;?\[\](){}]/ + 'tensor-punctuation': { + pattern: /<<|>>/, + alias: 'punctuation' + }, + 'operator': /\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/, + 'punctuation': /[.,:;?\[\](){}]/ }; -Prism.languages.mel['code'].inside.rest = Prism.languages.mel; + +Prism.languages.mel['code'].inside['statement'].inside = Prism.languages.mel; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js index 0fda416934..a0866882dc 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js @@ -1 +1 @@ -Prism.languages.mel={comment:/\/\/.*/,code:{pattern:/`(?:\\.|[^\\`\r\n])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:/\b\w+(?=\()|\b(?:CBG|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|Mayatomr|about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/,operator:[/\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.rest=Prism.languages.mel; \ No newline at end of file +Prism.languages.mel={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},code:{pattern:/`(?:\\.|[^\\`])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},statement:{pattern:/[\s\S]+/,inside:null}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:{pattern:/((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,lookbehind:!0,greedy:!0},"tensor-punctuation":{pattern:/<<|>>/,alias:"punctuation"},operator:/\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,punctuation:/[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.statement.inside=Prism.languages.mel; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js index 52c6572b22..a71210d1ff 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mongodb.min.js @@ -1 +1 @@ -!function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map(function($){return $.replace("$","\\$")})).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism); \ No newline at end of file +!function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$setWindowFields","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$count","$dateAdd","$dateDiff","$dateSubtract","$dateTrunc","$getField","$rand","$sampleRate","$setField","$unsetField","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map((function($){return $.replace("$","\\$")}))).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js index 627c052acf..5df872e5f8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-naniscript.min.js @@ -1 +1 @@ -!function(e){var a=/\{[^\r\n\[\]{}]*\}/,n={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:a,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};function t(e){return"string"==typeof e?e:Array.isArray(e)?e.map(t).join(""):t(e.content)}e.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",function(e){e.tokens.forEach(function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",(function(e){e.tokens.forEach((function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n/, + alias: 'punctuation' + }, + + 'operator': /\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/, + + 'punctuation': /[(),.:;@\[\]{}]/ + }; +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.min.js new file mode 100644 index 0000000000..5abcdf70c8 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-odin.min.js @@ -0,0 +1 @@ +!function(e){var t=/\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;e.languages.odin={comment:[{pattern:/\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,greedy:!0},{pattern:/#![^\n\r]*/,greedy:!0},{pattern:/\/\/[^\n\r]*/,greedy:!0}],char:{pattern:/'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,greedy:!0,inside:{symbol:t}},string:[{pattern:/`[^`]*`/,greedy:!0},{pattern:/"(?:\\.|[^\n\r"\\])*"/,greedy:!0,inside:{symbol:t}}],directive:{pattern:/#\w+/,alias:"property"},number:/\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,discard:{pattern:/\b_\b/,alias:"keyword"},"procedure-definition":{pattern:/\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,alias:"function"},keyword:/\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,"procedure-name":{pattern:/\b\w+(?=[ \t]*\()/,alias:"function"},boolean:/\b(?:false|nil|true)\b/,"constant-parameter-sign":{pattern:/\$/,alias:"important"},undefined:{pattern:/---/,alias:"operator"},arrow:{pattern:/->/,alias:"punctuation"},operator:/\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,punctuation:/[(),.:;@\[\]{}]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js index fcc023dc58..d7ed6e9e4f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js @@ -1 +1 @@ -Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map(function(r){return r.split("").join(" *")}).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; \ No newline at end of file +Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map((function(r){return r.split("").join(" *")})).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js index fe17122272..85c18b3479 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascaligo.min.js @@ -1 +1 @@ -!function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"}),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,function(){return n}),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,function(){return n}),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,function(){return n})),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce(function(e,n){return e[n]=t[n],e},{});t["class-name"].forEach(function(e){e.inside=i})}(Prism); \ No newline at end of file +!function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,(function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"})),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,(function(){return n})),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,(function(){return n})),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,(function(){return n}))),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:False|True)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce((function(e,n){return e[n]=t[n],e}),{});t["class-name"].forEach((function(e){e.inside=i}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js index 1446c7285f..ab71b1da15 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js @@ -1 +1 @@ -!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";Prism.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(); \ No newline at end of file +!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js index 30ac2dc6af..79e8bd1cda 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js @@ -67,7 +67,7 @@ lookbehind: true }, { - pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i, + pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i, alias: 'return-type', greedy: true, lookbehind: true @@ -100,12 +100,12 @@ // // keywords cannot be preceded by "->" // the complex lookbehind means `(?|::)\s*)` - pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i, + pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i, lookbehind: true } ], 'argument-name': { - pattern: /([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i, + pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i, lookbehind: true }, 'class-name': [ diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js index 75f1f18df3..974a4270a8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js @@ -1 +1 @@ -!function(a){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism); \ No newline at end of file +!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.js new file mode 100644 index 0000000000..70dd234507 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.js @@ -0,0 +1,103 @@ +(function (Prism) { + var variable = /\$\w+|%[a-z]+%/; + + var arrowAttr = /\[[^[\]]*\]/.source; + var arrowDirection = /(?:[drlu]|do|down|le|left|ri|right|up)/.source; + var arrowBody = '(?:-+' + arrowDirection + '-+|\\.+' + arrowDirection + '\\.+|-+(?:' + arrowAttr + '-*)?|' + arrowAttr + '-+|\\.+(?:' + arrowAttr + '\\.*)?|' + arrowAttr + '\\.+)'; + var arrowLeft = /(?:<{1,2}|\/{1,2}|\\{1,2}|<\||[#*^+}xo])/.source; + var arrowRight = /(?:>{1,2}|\/{1,2}|\\{1,2}|\|>|[#*^+{xo])/.source; + var arrowPrefix = /[[?]?[ox]?/.source; + var arrowSuffix = /[ox]?[\]?]?/.source; + var arrow = + arrowPrefix + + '(?:' + + arrowBody + arrowRight + + '|' + + arrowLeft + arrowBody + '(?:' + arrowRight + ')?' + + ')' + + arrowSuffix; + + Prism.languages['plant-uml'] = { + 'comment': { + pattern: /(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m, + lookbehind: true, + greedy: true + }, + 'preprocessor': { + pattern: /(^[ \t]*)!.*/m, + lookbehind: true, + greedy: true, + alias: 'property', + inside: { + 'variable': variable + } + }, + 'delimiter': { + pattern: /(^[ \t]*)@(?:end|start)uml\b/m, + lookbehind: true, + greedy: true, + alias: 'punctuation' + }, + + 'arrow': { + pattern: RegExp(/(^|[^-.<>?|\\[\]ox])/.source + arrow + /(?![-.<>?|\\\]ox])/.source), + lookbehind: true, + greedy: true, + alias: 'operator', + inside: { + 'expression': { + pattern: /(\[)[^[\]]+(?=\])/, + lookbehind: true, + inside: null // see below + }, + 'punctuation': /\[(?=$|\])|^\]/ + } + }, + + 'string': { + pattern: /"[^"]*"/, + greedy: true + }, + 'text': { + pattern: /(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/, + lookbehind: true, + greedy: true, + alias: 'string' + }, + + 'keyword': [ + { + pattern: /^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m, + lookbehind: true, + greedy: true + }, + /\b(?:elseif|equals|not|while)(?=\s*\()/, + /\b(?:as|is|then)\b/ + ], + + 'divider': { + pattern: /^==.+==$/m, + greedy: true, + alias: 'important' + }, + + 'time': { + pattern: /@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i, + greedy: true, + alias: 'number' + }, + + 'color': { + pattern: /#(?:[a-z_]+|[a-fA-F0-9]+)\b/, + alias: 'symbol' + }, + 'variable': variable, + + 'punctuation': /[:,;()[\]{}]|\.{3}/ + }; + + Prism.languages['plant-uml'].arrow.inside.expression.inside = Prism.languages['plant-uml']; + + Prism.languages['plantuml'] = Prism.languages['plant-uml']; + +}(Prism)); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.min.js new file mode 100644 index 0000000000..078bc25e9a --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plant-uml.min.js @@ -0,0 +1 @@ +!function(e){var t=/\$\w+|%[a-z]+%/;e.languages["plant-uml"]={comment:{pattern:/(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,lookbehind:!0,greedy:!0},preprocessor:{pattern:/(^[ \t]*)!.*/m,lookbehind:!0,greedy:!0,alias:"property",inside:{variable:t}},delimiter:{pattern:/(^[ \t]*)@(?:end|start)uml\b/m,lookbehind:!0,greedy:!0,alias:"punctuation"},arrow:{pattern:RegExp("(^|[^-.<>?|\\\\[\\]ox])[[?]?[ox]?(?:(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo])|(?:<{1,2}|/{1,2}|\\\\{1,2}|<\\||[#*^+}xo])(?:-+(?:[drlu]|do|down|le|left|ri|right|up)-+|\\.+(?:[drlu]|do|down|le|left|ri|right|up)\\.+|-+(?:\\[[^[\\]]*\\]-*)?|\\[[^[\\]]*\\]-+|\\.+(?:\\[[^[\\]]*\\]\\.*)?|\\[[^[\\]]*\\]\\.+)(?:(?:>{1,2}|/{1,2}|\\\\{1,2}|\\|>|[#*^+{xo]))?)[ox]?[\\]?]?(?![-.<>?|\\\\\\]ox])"),lookbehind:!0,greedy:!0,alias:"operator",inside:{expression:{pattern:/(\[)[^[\]]+(?=\])/,lookbehind:!0,inside:null},punctuation:/\[(?=$|\])|^\]/}},string:{pattern:/"[^"]*"/,greedy:!0},text:{pattern:/(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,lookbehind:!0,greedy:!0,alias:"string"},keyword:[{pattern:/^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,lookbehind:!0,greedy:!0},/\b(?:elseif|equals|not|while)(?=\s*\()/,/\b(?:as|is|then)\b/],divider:{pattern:/^==.+==$/m,greedy:!0,alias:"important"},time:{pattern:/@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,greedy:!0,alias:"number"},color:{pattern:/#(?:[a-z_]+|[a-fA-F0-9]+)\b/,alias:"symbol"},variable:t,punctuation:/[:,;()[\]{}]|\.{3}/},e.languages["plant-uml"].arrow.inside.expression.inside=e.languages["plant-uml"],e.languages.plantuml=e.languages["plant-uml"]}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js index 7e969c61f2..80442e7041 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js @@ -1 +1 @@ -!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(); \ No newline at end of file +!function(e){var i=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};i.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:i},boolean:i.boolean,variable:i.variable}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js index e9e01ff1bf..a5834fc52b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js @@ -1,9 +1,13 @@ Prism.languages.properties = { 'comment': /^[ \t]*[#!].*$/m, - 'attr-value': { + 'value': { pattern: /(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m, - lookbehind: true + lookbehind: true, + alias: 'attr-value' + }, + 'key': { + pattern: /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m, + alias: 'attr-name' }, - 'attr-name': /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m, 'punctuation': /[=:]/ }; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js index d90930c9c1..5976d47656 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js @@ -1 +1 @@ -Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,punctuation:/[=:]/}; \ No newline at end of file +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js index 4f2d7781e9..265211a1d2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js @@ -1 +1 @@ -!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",function(){return r.filter}),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism); \ No newline at end of file +!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:/\S[\s\S]*/}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:case|default|else|if|unless|when|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",(function(){return r.filter})),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},text:{pattern:/\S[\s\S]*/,alias:[r.language,"language-"+r.language],inside:e.languages[r.language]}}})}e.languages.insertBefore("pug","filter",n)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js index d747cbfae6..dc8508220d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js @@ -1 +1 @@ -!function(r){r.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/};["c",{lang:"c++",alias:"cpp"},"fortran"].forEach(function(e){var t=e;if("string"!=typeof e&&(t=e.alias,e=e.lang),r.languages[t]){var a={};a["inline-lang-"+t]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",e.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:r.util.clone(r.languages.pure["inline-lang"].inside)},a["inline-lang-"+t].inside.rest=r.util.clone(r.languages[t]),r.languages.insertBefore("pure","inline-lang",a)}}),r.languages.c&&(r.languages.pure["inline-lang"].inside.rest=r.util.clone(r.languages.c))}(Prism); \ No newline at end of file +!function(e){e.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/},["c",{lang:"c++",alias:"cpp"},"fortran"].forEach((function(t){var a=t;if("string"!=typeof t&&(a=t.alias,t=t.lang),e.languages[a]){var r={};r["inline-lang-"+a]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",t.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:e.util.clone(e.languages.pure["inline-lang"].inside)},r["inline-lang-"+a].inside.rest=e.util.clone(e.languages[a]),e.languages.insertBefore("pure","inline-lang",r)}})),e.languages.c&&(e.languages.pure["inline-lang"].inside.rest=e.util.clone(e.languages.c))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js index 0f04bb6d4b..2d49469b3f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.js @@ -12,7 +12,7 @@ Prism.languages.purebasic = Prism.languages.extend('clike', { 'keyword': /\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i, 'function': /\b\w+(?:\.\w+)?\s*(?=\()/, 'number': /(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i, - 'operator': /(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/ + 'operator': /(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/ }); Prism.languages.insertBefore('purebasic', 'keyword', { diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js index b8072a7afb..91cb9f8d69 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-purebasic.min.js @@ -1 +1 @@ -Prism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic; \ No newline at end of file +Prism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+\$?/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|DEFAULT|FLOAT)\b.*/],function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js index 00cc616409..7181f66654 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qml.min.js @@ -1 +1 @@ -!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"}).replace(//g,function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"}),t=0;t<2;t++)r=r.replace(//g,function(){return r});r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,function(){return r}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,function(){return r}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); \ No newline at end of file +!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,(function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"})).replace(//g,(function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"})),t=0;t<2;t++)r=r.replace(//g,(function(){return r}));r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,(function(){return r})),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js index 827bef2b19..3fa2597bd9 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qsharp.min.js @@ -1 +1 @@ -!function(e){function a(e,r){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+r[+n]+")"})}function n(e,n,r){return RegExp(a(e,n),r||"")}var r=RegExp("\\b(?:"+("Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero"+" "+"Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within").trim().replace(/ /g,"|")+")\\b"),t=a("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:r,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:n("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:n("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:r,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}(a('\\{(?:[^"{}]|<<0>>|<>)*\\}',[s]),2);e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:n('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:n("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp; \ No newline at end of file +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,r){return"(?:"+n[+r]+")"}))}function r(e,r,a){return RegExp(n(e,r),a||"")}var a=RegExp("\\b(?:"+"Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within".trim().replace(/ /g,"|")+")\\b"),t=n("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:a,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:r("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:r("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:r("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:a,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r<2;r++)e=e.replace(/<>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}(n('\\{(?:[^"{}]|<<0>>|<>)*\\}',[s]));e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:r('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:r("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.js new file mode 100644 index 0000000000..9502a77d64 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.js @@ -0,0 +1,60 @@ +Prism.languages.rescript = { + 'comment': { + pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/, + greedy: true + }, + 'char': { pattern: /'(?:[^\r\n\\]|\\(?:.|\w+))'/, greedy: true }, + 'string': { + pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/, + greedy: true + }, + 'class-name': /\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/, + 'function': { + pattern: /[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/, + lookbehind: true, + }, + 'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i, + 'boolean': /\b(?:false|true)\b/, + 'attr-value': /[A-Za-z]\w*(?==)/, + 'constant': { + pattern: /(\btype\s+)[a-z]\w*/, + lookbehind: true + }, + 'tag': { + pattern: /(<)[a-z]\w*|(?:<\/)[a-z]\w*/, + lookbehind: true, + inside: { + 'operator': /<|>|\//, + }, + }, + 'keyword': /\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/, + 'operator': /\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/, + 'punctuation': /[(){}[\],;.]/ +}; + +Prism.languages.insertBefore('rescript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\$\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.rescript + } + }, + 'string': /[\s\S]+/ + } + }, +}); + +Prism.languages.res = Prism.languages.rescript; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.min.js new file mode 100644 index 0000000000..5d00666f43 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rescript.min.js @@ -0,0 +1 @@ +Prism.languages.rescript={comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},char:{pattern:/'(?:[^\r\n\\]|\\(?:.|\w+))'/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,function:{pattern:/[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,lookbehind:!0},number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,boolean:/\b(?:false|true)\b/,"attr-value":/[A-Za-z]\w*(?==)/,constant:{pattern:/(\btype\s+)[a-z]\w*/,lookbehind:!0},tag:{pattern:/(<)[a-z]\w*|(?:<\/)[a-z]\w*/,lookbehind:!0,inside:{operator:/<|>|\//}},keyword:/\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,operator:/\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,punctuation:/[(){}[\],;.]/},Prism.languages.insertBefore("rescript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"tag"},rest:Prism.languages.rescript}},string:/[\s\S]+/}}}),Prism.languages.res=Prism.languages.rescript; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js index bfaec75744..a0397f51b5 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-robotframework.min.js @@ -1 +1 @@ -!function(t){var r={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},o={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function n(t,n){var e={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var a in n)e[a]=n[a];return e.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},e.variable=o,e.comment=r,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,function(){return t}),"im"),alias:"section",inside:e}}var e={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},a={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:o}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:o}};t.languages.robotframework={settings:n("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:n("Variables"),"test-cases":n("Test Cases",{"test-name":a,documentation:e,property:i}),keywords:n("Keywords",{"keyword-name":a,documentation:e,property:i}),tasks:n("Tasks",{"task-name":a,documentation:e,property:i}),comment:r},t.languages.robot=t.languages.robotframework}(Prism); \ No newline at end of file +!function(t){var n={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},e={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function a(t,a){var r={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var o in a)r[o]=a[o];return r.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},r.variable=e,r.comment=n,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,(function(){return t})),"im"),alias:"section",inside:r}}var r={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},o={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:e}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:e}};t.languages.robotframework={settings:a("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:a("Variables"),"test-cases":a("Test Cases",{"test-name":o,documentation:r,property:i}),keywords:a("Keywords",{"keyword-name":o,documentation:r,property:i}),tasks:a("Tasks",{"task-name":o,documentation:r,property:i}),comment:n},t.languages.robot=t.languages.robotframework}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js index 52595ee387..d37ce8c574 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js @@ -1 +1 @@ -!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,function(){return a});a=a.replace(//g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); \ No newline at end of file +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,(function(){return a}));a=a.replace(//g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js index 698175d0ee..181589c39b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js @@ -1 +1 @@ -!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,function(){return k}),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,function(){return k}),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,function(){return t}),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,function(){return t}),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,function(){return t}),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,function(){return t}),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism); \ No newline at end of file +!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/i,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,(function(){return k})),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,(function(){return k})),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:cards|(?:data)?lines)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,(function(){return t})),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|norun|parseonly))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,(function(){return t})),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,(function(){return t})),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,punctuation:c}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js index 980d04e6ad..2aa445193d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js @@ -1 +1 @@ -Prism.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(r){for(var e in r)r[e]=r[e].replace(/<[\w\s]+>/g,function(e){return"(?:"+r[e].trim()+")"});return r[e]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}; \ No newline at end of file +!function(e){e.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},char:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(e){for(var r in e)e[r]=e[r].replace(/<[\w\s]+>/g,(function(r){return"(?:"+e[r].trim()+")"}));return e[r]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[esfdl][+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js index 74810323c7..470c9ce03d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-shell-session.min.js @@ -1 +1 @@ -!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,function(){return n}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); \ No newline at end of file +!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[/~.][^\0-\\x1F$#%*?"<>@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,(function(){return n})),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js index 4651214a8a..1e397744d3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js @@ -1 +1 @@ -!function(t){t.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:t.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},t.languages.smarty["embedded-php"].inside.smarty.inside=t.languages.smarty,t.languages.smarty.string[0].inside.interpolation.inside.expression.inside=t.languages.smarty;var e=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,a=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']||\\{(?:[^{}\"']||\\{(?:[^{}\"']|)*\\})*\\})*\\}".replace(//g,function(){return e.source}),"g");t.hooks.add("before-tokenize",function(e){var n=!1;t.languages["markup-templating"].buildPlaceholders(e,"smarty",a,function(e){return"{/literal}"===e&&(n=!1),!n&&("{literal}"===e&&(n=!0),!0)})}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"smarty")})}(Prism); \ No newline at end of file +!function(e){e.languages.smarty={comment:{pattern:/^\{\*[\s\S]*?\*\}/,greedy:!0},"embedded-php":{pattern:/^\{php\}[\s\S]*?\{\/php\}/,greedy:!0,inside:{smarty:{pattern:/^\{php\}|\{\/php\}$/,inside:null},php:{pattern:/[\s\S]+/,alias:"language-php",inside:e.languages.php}}},string:[{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0,inside:{interpolation:{pattern:/\{[^{}]*\}|`[^`]*`/,inside:{"interpolation-punctuation":{pattern:/^[{`]|[`}]$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}},variable:/\$\w+/}},{pattern:/'(?:\\.|[^'\\\r\n])*'/,greedy:!0}],keyword:{pattern:/(^\{\/?)[a-z_]\w*\b(?!\()/i,lookbehind:!0,greedy:!0},delimiter:{pattern:/^\{\/?|\}$/,greedy:!0,alias:"punctuation"},number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:{pattern:/(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,lookbehind:!0},"attr-name":/\b[a-z_]\w*(?=\s*=)/i,boolean:/\b(?:false|no|off|on|true|yes)\b/,punctuation:/[\[\](){}.,:`]|->/,operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/]},e.languages.smarty["embedded-php"].inside.smarty.inside=e.languages.smarty,e.languages.smarty.string[0].inside.interpolation.inside.expression.inside=e.languages.smarty;var n=/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,t=RegExp("\\{\\*[^]*?\\*\\}|\\{php\\}[^]*?\\{/php\\}|"+"\\{(?:[^{}\"']||\\{(?:[^{}\"']||\\{(?:[^{}\"']|)*\\})*\\})*\\}".replace(//g,(function(){return n.source})),"g");e.hooks.add("before-tokenize",(function(n){var a=!1;e.languages["markup-templating"].buildPlaceholders(n,"smarty",t,(function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)}))})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"smarty")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js index d6a8e3d8e3..cb6152870c 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sml.min.js @@ -1 +1 @@ -!function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)(?:\\s*(?:(?:\\*|->)\\s*|,\\s*(?:(?=)|(?!)\\s+)))*".replace(//g,function(){return"\\s*(?:[*,]|->)"}).replace(//g,function(){return"(?:'[\\w']*||\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+)*"}).replace(//g,function(){return"(?!)[a-z\\d_][\\w'.]*"}).replace(//g,function(){return n.source}),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism); \ No newline at end of file +!function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)(?:\\s*(?:(?:\\*|->)\\s*|,\\s*(?:(?=)|(?!)\\s+)))*".replace(//g,(function(){return"\\s*(?:[*,]|->)"})).replace(//g,(function(){return"(?:'[\\w']*||\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+)*"})).replace(//g,(function(){return"(?!)[a-z\\d_][\\w'.]*"})).replace(//g,(function(){return n.source})),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js index 76c1ab6978..dd8071096e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js @@ -1 +1 @@ -!function(t){var e=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,a=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;t.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:e,greedy:!0},number:a,punctuation:/[\[\].?]/}},string:{pattern:e,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:a,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},t.hooks.add("before-tokenize",function(e){var a=!1;t.languages["markup-templating"].buildPlaceholders(e,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)})}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"soy")})}(Prism); \ No newline at end of file +!function(e){var a=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,t=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;e.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:a,greedy:!0},number:t,punctuation:/[\[\].?]/}},string:{pattern:a,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:false|true)\b/,number:t,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},e.hooks.add("before-tokenize",(function(a){var t=!1;e.languages["markup-templating"].buildPlaceholders(a,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,(function(e){return"{/literal}"===e&&(t=!1),!t&&("{literal}"===e&&(t=!0),!0)}))})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"soy")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.js new file mode 100644 index 0000000000..a385bfd957 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.js @@ -0,0 +1,76 @@ +// https://www.stata.com/manuals/u.pdf +// https://www.stata.com/manuals/p.pdf + +Prism.languages.stata = { + 'comment': [ + { + pattern: /(^[ \t]*)\*.*/m, + lookbehind: true, + greedy: true + }, + { + pattern: /(^|\s)\/\/.*|\/\*[\s\S]*?\*\//, + lookbehind: true, + greedy: true + } + ], + 'string-literal': { + pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/, + greedy: true, + inside: { + 'interpolation': { + pattern: /\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/, + inside: { + 'punctuation': /^\$\{|\}$/, + 'expression': { + pattern: /[\s\S]+/, + inside: null // see below + } + } + }, + 'string': /[\s\S]+/ + } + }, + + 'mata': { + pattern: /(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m, + lookbehind: true, + greedy: true, + alias: 'language-mata', + inside: Prism.languages.mata + }, + 'java': { + pattern: /(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m, + lookbehind: true, + greedy: true, + alias: 'language-java', + inside: Prism.languages.java + }, + 'python': { + pattern: /(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m, + lookbehind: true, + greedy: true, + alias: 'language-python', + inside: Prism.languages.python + }, + + + 'command': { + pattern: /(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m, + lookbehind: true, + greedy: true, + alias: 'keyword' + }, + 'variable': /\$\w+|[‘`']\w[^’`'\r\n]*[’`']/, + 'keyword': /\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/, + + + 'boolean': /\b(?:off|on)\b/, + 'number': /\b\d+(?:\.\d+)?\b|\B\.\d+/, + 'function': /\b[a-z_]\w*(?=\()/i, + + 'operator': /\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/, + 'punctuation': /[(){}[\],:]/ +}; + +Prism.languages.stata['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.stata; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.min.js new file mode 100644 index 0000000000..f6ccbfdf20 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stata.min.js @@ -0,0 +1 @@ +Prism.languages.stata={comment:[{pattern:/(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0}],"string-literal":{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,inside:{punctuation:/^\$\{|\}$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},mata:{pattern:/(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-mata",inside:Prism.languages.mata},java:{pattern:/(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-java",inside:Prism.languages.java},python:{pattern:/(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-python",inside:Prism.languages.python},command:{pattern:/(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,lookbehind:!0,greedy:!0,alias:"keyword"},variable:/\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,keyword:/\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,boolean:/\b(?:off|on)\b/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+/,function:/\b[a-z_]\w*(?=\()/i,operator:/\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,punctuation:/[(){}[\],:]/},Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.stata; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.js new file mode 100644 index 0000000000..ad4199d9f8 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.js @@ -0,0 +1,36 @@ +Prism.languages.supercollider = { + 'comment': { + pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//, + greedy: true + }, + 'string': { + pattern: /(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/, + lookbehind: true, + greedy: true + }, + 'char': { + pattern: /\$(?:[^\\\r\n]|\\.)/, + greedy: true + }, + 'symbol': { + pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/, + lookbehind: true, + greedy: true + }, + + 'keyword': /\b(?:_|arg|classvar|const|nil|var|while)\b/, + 'boolean': /\b(?:false|true)\b/, + + 'label': { + pattern: /\b[a-z_]\w*(?=\s*:)/, + alias: 'property' + }, + + 'number': /\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/, + 'class-name': /\b[A-Z]\w*\b/, + + 'operator': /\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/, + 'punctuation': /[{}()[\].:,;]|#[[{]/ +}; + +Prism.languages.sclang = Prism.languages.supercollider; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.min.js new file mode 100644 index 0000000000..52376717c2 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-supercollider.min.js @@ -0,0 +1 @@ +Prism.languages.supercollider={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,lookbehind:!0,greedy:!0},char:{pattern:/\$(?:[^\\\r\n]|\\.)/,greedy:!0},symbol:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,lookbehind:!0,greedy:!0},keyword:/\b(?:_|arg|classvar|const|nil|var|while)\b/,boolean:/\b(?:false|true)\b/,label:{pattern:/\b[a-z_]\w*(?=\s*:)/,alias:"property"},number:/\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,"class-name":/\b[A-Z]\w*\b/,operator:/\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,punctuation:/[{}()[\].:,;]|#[[{]/},Prism.languages.sclang=Prism.languages.supercollider; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js index 39b41b7240..b4f87f4637 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js @@ -1 +1 @@ -Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=Prism.languages.swift}); \ No newline at end of file +Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js index 8c192ef7e2..25b98f672f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-systemd.min.js @@ -1 +1 @@ -!function(e){var t={pattern:/^[;#].*/m,greedy:!0},n='"(?:[^\r\n"\\\\]|\\\\(?:[^\r]|\r\n?))*"(?!\\S)';Prism.languages.systemd={comment:t,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp("(=[ \t]*(?!\\s))(?:"+n+'|(?=[^"\r\n]))(?:[^\\s\\\\]|[ \t]+(?:(?![ \t"])|'+n+")|\\\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;]))*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:t,quoted:{pattern:RegExp("(^|\\s)"+n),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}}(); \ No newline at end of file +!function(e){var t={pattern:/^[;#].*/m,greedy:!0},n='"(?:[^\r\n"\\\\]|\\\\(?:[^\r]|\r\n?))*"(?!\\S)';e.languages.systemd={comment:t,section:{pattern:/^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,greedy:!0,inside:{punctuation:/^\[|\]$/,"section-name":{pattern:/[\s\S]+/,alias:"selector"}}},key:{pattern:/^[^\s=]+(?=[ \t]*=)/m,greedy:!0,alias:"attr-name"},value:{pattern:RegExp("(=[ \t]*(?!\\s))(?:"+n+'|(?=[^"\r\n]))(?:[^\\s\\\\]|[ \t]+(?:(?![ \t"])|'+n+")|\\\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;]))*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:t,quoted:{pattern:RegExp("(^|\\s)"+n),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js index 80dcb0e201..365b8e8549 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-t4-templating.min.js @@ -1 +1 @@ -!function(n){function i(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}n.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(e){var t=n.languages[e],a="language-"+e;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:i("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:i("=",t,a),"class-feature":i("\\+",t,a),standard:i("",t,a)}}}}})}(Prism); \ No newline at end of file +!function(e){function t(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}e.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(a){var n=e.languages[a],i="language-"+a;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:t("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:t("=",n,i),"class-feature":t("\\+",n,i),standard:t("",n,i)}}}}})}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js index 8bc917c954..a98dfd8b5e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js @@ -1 +1 @@ -!function(n){function e(n,e){return RegExp(n.replace(//g,function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"}).replace(//g,function(){return"(?:\\)|\\((?![^|()\n]+\\)))"}),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); \ No newline at end of file +!function(n){function e(n,e){return RegExp(n.replace(//g,(function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"})).replace(//g,(function(){return"(?:\\)|\\((?![^|()\n]+\\)))"})),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:C|R|TM)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js index 0bb75d16b3..0dec967cde 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-toml.min.js @@ -1 +1 @@ -!function(e){function n(e){return e.replace(/__/g,function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); \ No newline at end of file +!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js index ede4024761..dc4d64817b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js @@ -1 +1 @@ -!function(t){t.languages.tt2=t.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),t.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),t.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),t.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete t.languages.tt2.string,t.hooks.add("before-tokenize",function(e){t.languages["markup-templating"].buildPlaceholders(e,"tt2",/\[%[\s\S]+?%\]/g)}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"tt2")})}(Prism); \ No newline at end of file +!function(e){e.languages.tt2=e.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),e.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),e.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),e.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete e.languages.tt2.string,e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"tt2",/\[%[\s\S]+?%\]/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"tt2")}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js index 75452fd53e..5ad764529b 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js @@ -1 +1 @@ -Prism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",function(e){if("twig"===e.language){Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)}}),Prism.hooks.add("after-tokenize",function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")}); \ No newline at end of file +Prism.languages.twig={comment:/^\{#[\s\S]*?#\}$/,"tag-name":{pattern:/(^\{%-?\s*)\w+/,lookbehind:!0,alias:"keyword"},delimiter:{pattern:/^\{[{%]-?|-?[%}]\}$/,alias:"punctuation"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:false|null|true)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],punctuation:/[()\[\]{}:.,]/},Prism.hooks.add("before-tokenize",(function(e){"twig"===e.language&&Prism.languages["markup-templating"].buildPlaceholders(e,"twig",/\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g)})),Prism.hooks.add("after-tokenize",(function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"twig")})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js index c898cc5412..7426fa2ce5 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js @@ -11,9 +11,12 @@ Prism.languages.vhdl = { alias: 'function' }, 'string': /"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/, - 'constant': /\b(?:library|use)\b/i, + 'attribute': { + pattern: /\b'\w+/, + alias: 'attr-name' + }, // support for predefined attributes included - 'keyword': /\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i, + 'keyword': /\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i, 'boolean': /\b(?:false|true)\b/i, 'function': /\w+(?=\()/, // decimal, based, physical, and exponential numbers supported diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js index 01532288e9..17fd67df3d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js @@ -1 +1 @@ -Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,constant:/\b(?:library|use)\b/i,keyword:/\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; \ No newline at end of file +Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,punctuation:/[{}[\];(),.:]/}; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js index fbd0716c57..0013cfcb8e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.js @@ -20,7 +20,7 @@ Prism.languages.wolfram = { }, 'boolean': /\b(?:False|True)\b/, 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i, - 'operator': /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'operator': /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, 'punctuation': /[{}[\];(),.:]/ }; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js index 03309bf0aa..57db919dd3 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wolfram.min.js @@ -1 +1 @@ -Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; \ No newline at end of file +Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\b\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:False|True)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js index 8a80d65342..85074eb378 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xml-doc.min.js @@ -1 +1 @@ -!function(n){function a(a,e){n.languages[a]&&n.languages.insertBefore(a,"comment",{"doc-comment":e})}var e=n.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:e}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:e}};a("csharp",t),a("fsharp",t),a("vbnet",g)}(Prism); \ No newline at end of file +!function(a){function e(e,n){a.languages[e]&&a.languages.insertBefore(e,"comment",{"doc-comment":n})}var n=a.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:n}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:n}};e("csharp",t),e("fsharp",t),e("vbnet",g)}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js index 14db8f8de4..f206e0c990 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js @@ -1 +1 @@ -!function(r){r.languages.xquery=r.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),r.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,r.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,r.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,r.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:r.languages.xquery,alias:"language-xquery"};var s=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join("")},l=function(e){for(var t=[],n=0;n"===a.content[a.content.length-1].content||t.push({tagName:s(a.content[0].content[1]),openedBraces:0}):!(0[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),e.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,e.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/,e.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,e.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:e.languages.xquery,alias:"language-xquery"};var t=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join("")},n=function(a){for(var o=[],i=0;i0&&o[o.length-1].tagName===t(r.content[0].content[1])&&o.pop():"/>"===r.content[r.content.length-1].content||o.push({tagName:t(r.content[0].content[1]),openedBraces:0}):!(o.length>0&&"punctuation"===r.type&&"{"===r.content)||a[i+1]&&"punctuation"===a[i+1].type&&"{"===a[i+1].content||a[i-1]&&"plain-text"===a[i-1].type&&"{"===a[i-1].content?o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?o[o.length-1].openedBraces--:"comment"!==r.type&&(s=!0):o[o.length-1].openedBraces++),(s||"string"==typeof r)&&o.length>0&&0===o[o.length-1].openedBraces){var l=t(r);i0&&("string"==typeof a[i-1]||"plain-text"===a[i-1].type)&&(l=t(a[i-1])+l,a.splice(i-1,1),i--),/^\s+$/.test(l)?a[i]=l:a[i]=new e.Token("plain-text",l,null,l)}r.content&&"string"!=typeof r.content&&n(r.content)}};e.hooks.add("after-tokenize",(function(e){"xquery"===e.language&&n(e.tokens)}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js index 344f4baa59..5cd16d3d7f 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js @@ -1 +1 @@ -!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return e});return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+a+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); \ No newline at end of file +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js index 298d9c3481..26316b4604 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-zig.min.js @@ -1 +1 @@ -!function(n){function e(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,e(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,e(a))+")+";n.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,e(s)).replace(//g,e(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,e(s)).replace(//g,e(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},n.languages.zig["class-name"].forEach(function(e){null===e.inside&&(e.inside=n.languages.zig)})}(Prism); \ No newline at end of file +!function(e){function n(e){return function(){return e}}var r=/\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/,a="\\b(?!"+r.source+")(?!\\d)\\w+\\b",o="align\\s*\\((?:[^()]|\\([^()]*\\))*\\)",s="(?!\\s)(?:!?\\s*(?:"+"(?:\\?|\\bpromise->|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,n(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,n(a))+")+";e.languages.zig={comment:[{pattern:/\/\/[/!].*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0}],char:{pattern:/(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0},builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,n(s)).replace(//g,n(o))),lookbehind:!0,inside:null}],"builtin-type":{pattern:/\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},e.languages.zig["class-name"].forEach((function(n){null===n.inside&&(n.inside=e.languages.zig)}))}(Prism); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json index 201c71bac1..1ea530334f 100755 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json @@ -1,6 +1,6 @@ { "name": "prismjs", - "version": "1.27.0", + "version": "1.28.0", "description": "Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.", "main": "prism.js", "style": "themes/prism.css", @@ -46,7 +46,7 @@ "docdash": "^1.2.0", "eslint": "^7.22.0", "eslint-plugin-jsdoc": "^32.3.0", - "eslint-plugin-regexp": "^1.4.0", + "eslint-plugin-regexp": "^1.6.0", "gulp": "^4.0.2", "gulp-clean-css": "^4.3.0", "gulp-concat": "^2.3.4", @@ -54,12 +54,12 @@ "gulp-jsdoc3": "^3.0.0", "gulp-rename": "^1.2.0", "gulp-replace": "^1.0.0", - "gulp-uglify": "^3.0.1", + "gulp-terser": "^2.1.0", "gzip-size": "^5.1.1", "htmlparser2": "^4.0.0", "http-server": "^0.12.3", "jsdom": "^16.7.0", - "mocha": "^6.2.0", + "mocha": "^9.2.2", "node-fetch": "^3.1.1", "npm-run-all": "^4.1.5", "prettier": "^2.4.1", @@ -68,7 +68,7 @@ "regexp-ast-analysis": "^0.2.4", "regexpp": "^3.2.0", "scslre": "^0.1.6", - "simple-git": "^1.107.0", + "simple-git": "^3.3.0", "webfont": "^9.0.0", "yargs": "^13.2.2" }, diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js index 7846dba519..532e11b5ad 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js @@ -4,7 +4,7 @@ return; } - var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/; + var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&!$'()*,;@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/; var email = /\b\S+@[\w.]+[a-z]{2}/; var linkMd = /\[([^\]]+)\]\(([^)]+)\)/; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js index 731c4a0c21..44aa79402a 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){var e=/\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&@]+(?:\?[\w\-+%~/.:=?&!$'()*,;@]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;@]*)?/,r=/\b\S+@[\w.]+[a-z]{2}/,a=/\[([^\]]+)\]\(([^)]+)\)/,l=["comment","url","attr-value","string"];Prism.plugins.autolinker={processGrammar:function(i){i&&!i["url-link"]&&(Prism.languages.DFS(i,function(i,n,t){-1-1&&!Array.isArray(a)&&(a.pattern||(a=this[r]={pattern:a}),a.inside=a.inside||{},"comment"==l&&(a.inside["md-link"]=t),"attr-value"==l?Prism.languages.insertBefore("inside","punctuation",{"url-link":i},a):a.inside["url-link"]=i,a.inside["email-link"]=n)})),r["url-link"]=i,r["email-link"]=n)}},Prism.hooks.add("before-highlight",(function(i){Prism.plugins.autolinker.processGrammar(i.grammar)})),Prism.hooks.add("wrap",(function(i){if(/-link$/.test(i.type)){i.tag="a";var n=i.content;if("email-link"==i.type&&0!=n.indexOf("mailto:"))n="mailto:"+n;else if("md-link"==i.type){var e=i.content.match(t);n=e[2],i.content=e[1]}i.attributes.href=n;try{i.content=decodeURIComponent(i.content)}catch(i){}}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js index 69bfa53f29..91203ae444 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js @@ -139,6 +139,11 @@ "sparql": "turtle", "sqf": "clike", "squirrel": "clike", + "stata": [ + "mata", + "java", + "python" + ], "t4-cs": [ "t4-templating", "csharp" @@ -176,9 +181,12 @@ "js": "javascript", "g4": "antlr4", "ino": "arduino", + "arm-asm": "armasm", + "art": "arturo", "adoc": "asciidoc", "avs": "avisynth", "avdl": "avro-idl", + "gawk": "awk", "shell": "bash", "shortcode": "bbcode", "rbnf": "bnf", @@ -196,9 +204,12 @@ "xlsx": "excel-formula", "xls": "excel-formula", "gamemakerlanguage": "gml", + "po": "gettext", "gni": "gn", + "ld": "linker-script", "go-mod": "go-module", "hbs": "handlebars", + "mustache": "handlebars", "hs": "haskell", "idr": "idris", "gitignore": "ignore", @@ -223,6 +234,7 @@ "objectpascal": "pascal", "px": "pcaxis", "pcode": "peoplecode", + "plantuml": "plant-uml", "pq": "powerquery", "mscript": "powerquery", "pbfasm": "purebasic", @@ -232,6 +244,7 @@ "rkt": "racket", "razor": "cshtml", "rpy": "renpy", + "res": "rescript", "robot": "robotframework", "rb": "ruby", "sh-session": "shell-session", @@ -240,6 +253,7 @@ "sol": "solidity", "sln": "solution-file", "rq": "sparql", + "sclang": "supercollider", "t4": "t4-cs", "trickle": "tremor", "troy": "tremor", diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js index 812b2c97ac..f9a4c4a69d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var l={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",cshtml:["markup","csharp"],jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike","t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup-templating",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},n={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",ino:"arduino",adoc:"asciidoc",avs:"avisynth",avdl:"avro-idl",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",gni:"gn","go-mod":"go-module",hbs:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",razor:"cshtml",rpy:"renpy",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",t4:"t4-cs",trickle:"tremor",troy:"tremor",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",webidl:"web-idl",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},p={},e="components/",a=Prism.util.currentScript();if(a){var r=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,s=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,i=a.getAttribute("data-autoloader-path");if(null!=i)e=i.trim().replace(/\/?$/,"/");else{var t=a.src;r.test(t)?e=t.replace(r,"components/"):s.test(t)&&(e=t.replace(s,"$1components/"))}}var o=Prism.plugins.autoloader={languages_path:e,use_minified:!0,loadLanguages:u};Prism.hooks.add("complete",function(e){var a=e.element,r=e.language;if(a&&r&&"none"!==r){var s=function(e){var a=(e.getAttribute("data-dependencies")||"").trim();if(!a){var r=e.parentElement;r&&"pre"===r.tagName.toLowerCase()&&(a=(r.getAttribute("data-dependencies")||"").trim())}return a?a.split(/\s*,\s*/g):[]}(a);/^diff-./i.test(r)?(s.push("diff"),s.push(r.substr("diff-".length))):s.push(r),s.every(m)||u(s,function(){Prism.highlightElement(a)})}})}function m(e){if(0<=e.indexOf("!"))return!1;if((e=n[e]||e)in Prism.languages)return!0;var a=p[e];return a&&!a.error&&!1===a.loading}function u(e,a,r){"string"==typeof e&&(e=[e]);var s=e.length,i=0,t=!1;function c(){t||++i===s&&a&&a(e)}0!==s?e.forEach(function(e){!function(a,r,s){var i=0<=a.indexOf("!");function e(){var e=p[a];e||(e=p[a]={callbacks:[]}),e.callbacks.push({success:r,error:s}),!i&&m(a)?k(a,"success"):!i&&e.error?k(a,"error"):!i&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return o.languages_path+"prism-"+e+(o.use_minified?".min":"")+".js"}(a),function(){e.loading=!1,k(a,"success")},function(){e.loading=!1,e.error=!0,k(a,"error")}))}a=a.replace("!",""),a=n[a]||a;var t=l[a];t&&t.length?u(t,e,s):e()}(e,c,function(){t||(t=!0,r&&r(e))})}):a&&setTimeout(a,0)}function k(e,a){if(p[e]){for(var r=p[e].callbacks,s=0,i=r.length;s=0)return!1;if((e=a[e]||e)in Prism.languages)return!0;var s=r[e];return s&&!s.error&&!1===s.loading}function m(s,t,i){"string"==typeof s&&(s=[s]);var l=s.length,c=0,n=!1;function k(){n||++c===l&&t&&t(s)}0!==l?s.forEach((function(s){!function(s,t,i){var l=s.indexOf("!")>=0;function c(){var e=r[s];e||(e=r[s]={callbacks:[]}),e.callbacks.push({success:t,error:i}),!l&&o(s)?u(s,"success"):!l&&e.error?u(s,"error"):!l&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return p.languages_path+"prism-"+e+(p.use_minified?".min":"")+".js"}(s),(function(){e.loading=!1,u(s,"success")}),(function(){e.loading=!1,e.error=!0,u(s,"error")})))}s=s.replace("!","");var n=e[s=a[s]||s];n&&n.length?m(n,c,i):c()}(s,k,(function(){n||(n=!0,i&&i(s))}))})):t&&setTimeout(t,0)}function u(e,a){if(r[e]){for(var s=r[e].callbacks,t=0,i=s.length;t span:before { - opacity: 0.4; + opacity: 0.7; content: ' '; display: block; padding-right: 0.8em; diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js index 415ac5dc95..b5fa38fea2 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js @@ -74,21 +74,6 @@ var codeLines = env.code.split('\n'); - var continuationLineIndicies = commandLine.continuationLineIndicies = new Set(); - var lineContinuationStr = pre.getAttribute('data-continuation-str'); - - // Identify code lines that are a continuation line and thus don't need - // a prompt - if (lineContinuationStr && codeLines.length > 1) { - for (var j = 1; j < codeLines.length; j++) { - if (codeLines.hasOwnProperty(j - 1) - && endsWith(codeLines[j - 1], lineContinuationStr)) { - // Mark this line as being a continuation line - continuationLineIndicies.add(j); - } - } - } - commandLine.numberOfLines = codeLines.length; /** @type {string[]} */ var outputLines = commandLine.outputLines = []; @@ -127,6 +112,32 @@ } } + var continuationLineIndicies = commandLine.continuationLineIndicies = new Set(); + var lineContinuationStr = pre.getAttribute('data-continuation-str'); + var continuationFilter = pre.getAttribute('data-filter-continuation'); + + // Identify code lines where the command has continued onto subsequent + // lines and thus need a different prompt. Need to do this after the output + // lines have been removed to ensure we don't pick up a continuation string + // in an output line. + for (var j = 0; j < codeLines.length; j++) { + var line = codeLines[j]; + if (!line) { + continue; + } + + // Record the next line as a continuation if this one ends in a continuation str. + if (lineContinuationStr && endsWith(line, lineContinuationStr)) { + continuationLineIndicies.add(j + 1); + } + // Record this line as a continuation if marked with a continuation prefix + // (that we will remove). + if (j > 0 && continuationFilter && startsWith(line, continuationFilter)) { + codeLines[j] = line.slice(continuationFilter.length); + continuationLineIndicies.add(j); + } + } + env.code = codeLines.join('\n'); }); diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css index 5e5c875d7e..7d7fc595af 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.css @@ -1 +1 @@ -.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.command-line-prompt>span:before{opacity:.4;content:' ';display:block;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7} \ No newline at end of file +.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.command-line-prompt>span:before{opacity:.7;content:' ';display:block;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js index fb2e402b04..971ae8156d 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var v=/(?:^|\s)command-line(?:\s|$)/,g="command-line-prompt",p="".startsWith?function(e,t){return e.startsWith(t)}:function(e,t){return 0===e.indexOf(t)},d="".endsWith?function(e,t){return e.endsWith(t)}:function(e,t){var n=e.length;return e.substring(n-t.length,n)===t};Prism.hooks.add("before-highlight",function(e){var t=N(e);if(!t.complete&&e.code){var n=e.element.parentElement;if(n&&/pre/i.test(n.nodeName)&&(v.test(n.className)||v.test(e.element.className))){var a=e.element.querySelector("."+g);a&&a.remove();var i=e.code.split("\n"),r=t.continuationLineIndicies=new Set,s=n.getAttribute("data-continuation-str");if(s&&1i.length&&(a=i.length),a--;for(var r=--n;r<=a;r++)l[r]=i[r],i[r]=""}});else if(u)for(var c=0;c'+Prism.util.encode(a[r])+"":n[r]=''+n[r]+"";e.highlightedCode=n.join("\n")}}),Prism.hooks.add("complete",function(e){if(function(e){return"command-line"in(e.vars=e.vars||{})}(e)){var t=N(e);if(!t.complete){var n=e.element.parentElement;v.test(e.element.className)&&(e.element.className=e.element.className.replace(v," ")),v.test(n.className)||(n.className+=" command-line");var a,r="",i=t.numberOfLines||0,s=h("data-prompt","");if(""!==s)a='';else a='';for(var o=t.continuationLineIndicies||new Set,l='")+'">',m=0;mm.length&&(a=m.length),a--;for(var r=--n;r<=a;r++)u[r]=m[r],m[r]=""}}));else if(d)for(var p=0;p0&&v&&n(b,v)&&(m[g]=b.slice(v.length),f.add(g)))}i.code=m.join("\n")}else o.complete=!0}else o.complete=!0})),Prism.hooks.add("before-insert",(function(e){var t=r(e);if(!t.complete){for(var n=e.highlightedCode.split("\n"),a=t.outputLines||[],i=0,o=n.length;i'+Prism.util.encode(a[i])+"":n[i]=''+n[i]+"";e.highlightedCode=n.join("\n")}})),Prism.hooks.add("complete",(function(n){if(function(e){return"command-line"in(e.vars=e.vars||{})}(n)){var a=r(n);if(!a.complete){var i=n.element.parentElement;e.test(n.element.className)&&(n.element.className=n.element.className.replace(e," ")),e.test(i.className)||(i.className+=" command-line");var o,s="",l=a.numberOfLines||0,m=b("data-prompt","");o=""!==m?'':'';for(var u=a.continuationLineIndicies||new Set,c='")+'">',d=0;d-1&&!Array.isArray(r)&&(r.pattern||(r=this[n]={pattern:r}),r.inside=r.inside||{},"attr-value"==e?Prism.languages.insertBefore("inside",r.inside["url-link"]?"url-link":"punctuation",{"data-uri":i},r):r.inside["url-link"]?Prism.languages.insertBefore("inside","url-link",{"data-uri":i},r):r.inside["data-uri"]=i)})),n["data-uri"]=i)}},Prism.hooks.add("before-highlight",(function(a){if(i.pattern.test(a.code))for(var n in i.inside)if(i.inside.hasOwnProperty(n)&&!i.inside[n].inside&&i.inside[n].pattern.test(a.code)){var r=n.match(/^language-(.+)/)[1];Prism.languages[r]&&(i.inside[n].inside={rest:(e=Prism.languages[r],Prism.plugins.autolinker&&Prism.plugins.autolinker.processGrammar(e),e)})}var e;Prism.plugins.dataURIHighlight.processGrammar(a.grammar)}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js index a6cf1c2fce..38a97b41eb 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){var m=/^diff-([\w-]+)/i,d=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,c=RegExp("(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))".replace(/__/g,function(){return d.source}),"gi"),a=!1;Prism.hooks.add("before-sanity-check",function(e){var i=e.language;m.test(i)&&!e.grammar&&(e.grammar=Prism.languages[i]=Prism.languages.diff)}),Prism.hooks.add("before-tokenize",function(e){a||Prism.languages.diff||Prism.plugins.autoloader||(a=!0,console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js).Make sure the language definition is loaded or use Prism's Autoloader plugin."));var i=e.language;m.test(i)&&!Prism.languages[i]&&(Prism.languages[i]=Prism.languages.diff)}),Prism.hooks.add("wrap",function(e){var i,a;if("diff"!==e.language){var s=m.exec(e.language);if(!s)return;i=s[1],a=Prism.languages[i]}var r=Prism.languages.diff&&Prism.languages.diff.PREFIXES;if(r&&e.type in r){var n,g=e.content.replace(d,"").replace(/</g,"<").replace(/&/g,"&"),f=g.replace(/(^|[\r\n])./g,"$1");n=a?Prism.highlight(f,a,i):Prism.util.encode(f);var u,l=new Prism.Token("prefix",r[e.type],[/\w+/.exec(e.type)[0]]),t=Prism.Token.stringify(l,e.language),o=[];for(c.lastIndex=0;u=c.exec(n);)o.push(t+u[0]);/(?:^|[\r\n]).$/.test(g)&&o.push(t),e.content=o.join(""),a&&e.classes.push("language-"+i)}})}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism){var e=/^diff-([\w-]+)/i,i=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,a=RegExp("(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))".replace(/__/g,(function(){return i.source})),"gi"),s=!1;Prism.hooks.add("before-sanity-check",(function(i){var a=i.language;e.test(a)&&!i.grammar&&(i.grammar=Prism.languages[a]=Prism.languages.diff)})),Prism.hooks.add("before-tokenize",(function(i){s||Prism.languages.diff||Prism.plugins.autoloader||(s=!0,console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js).Make sure the language definition is loaded or use Prism's Autoloader plugin."));var a=i.language;e.test(a)&&!Prism.languages[a]&&(Prism.languages[a]=Prism.languages.diff)})),Prism.hooks.add("wrap",(function(s){var r,n;if("diff"!==s.language){var g=e.exec(s.language);if(!g)return;r=g[1],n=Prism.languages[r]}var f=Prism.languages.diff&&Prism.languages.diff.PREFIXES;if(f&&s.type in f){var u,l=s.content.replace(i,"").replace(/</g,"<").replace(/&/g,"&"),t=l.replace(/(^|[\r\n])./g,"$1");u=n?Prism.highlight(t,n,r):Prism.util.encode(t);var o,m=new Prism.Token("prefix",f[s.type],[/\w+/.exec(s.type)[0]]),d=Prism.Token.stringify(m,s.language),c=[];for(a.lastIndex=0;o=a.exec(u);)c.push(d+o[0]);/(?:^|[\r\n]).$/.test(l)&&c.push(d),s.content=c.join(""),n&&s.classes.push("language-"+r)}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js index 57e5879e75..dc10f65d60 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/download-button/prism-download-button.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector&&Prism.plugins.toolbar.registerButton("download-file",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var n=e.getAttribute("data-src"),a=document.createElement("a");return a.textContent=e.getAttribute("data-download-link-label")||"Download",a.setAttribute("download",""),a.href=n,a}}); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector&&Prism.plugins.toolbar.registerButton("download-file",(function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var n=e.getAttribute("data-src"),a=document.createElement("a");return a.textContent=e.getAttribute("data-download-link-label")||"Download",a.setAttribute("download",""),a.href=n,a}})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js index 23bacb136e..e8c9594ae1 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var l={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},o="data-src-status",h="loading",g="loaded",u="pre[data-src]:not(["+o+'="'+g+'"]):not(['+o+'="'+h+'"])';Prism.hooks.add("before-highlightall",function(t){t.selector+=", "+u}),Prism.hooks.add("before-sanity-check",function(t){var r=t.element;if(r.matches(u)){t.code="",r.setAttribute(o,h);var s=r.appendChild(document.createElement("CODE"));s.textContent="Loading…";var e=r.getAttribute("data-src"),i=t.language;if("none"===i){var n=(/\.(\w+)$/.exec(e)||[,"none"])[1];i=l[n]||n}Prism.util.setLanguage(s,i),Prism.util.setLanguage(r,i);var a=Prism.plugins.autoloader;a&&a.loadLanguages(i),function(t,e,i){var n=new XMLHttpRequest;n.open("GET",t,!0),n.onreadystatechange=function(){4==n.readyState&&(n.status<400&&n.responseText?e(n.responseText):400<=n.status?i(function(t,e){return"✖ Error "+t+" while fetching file: "+e}(n.status,n.statusText)):i("✖ Error: File does not exist or is empty"))},n.send(null)}(e,function(t){r.setAttribute(o,g);var e=function(t){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(t||"");if(e){var i=Number(e[1]),n=e[2],a=e[3];return n?a?[i,Number(a)]:[i,void 0]:[i,i]}}(r.getAttribute("data-range"));if(e){var i=t.split(/\r\n?|\n/g),n=e[0],a=null==e[1]?i.length:e[1];n<0&&(n+=i.length),n=Math.max(0,Math.min(n-1,i.length)),a<0&&(a+=i.length),a=Math.max(0,Math.min(a,i.length)),t=i.slice(n,a).join("\n"),r.hasAttribute("data-start")||r.setAttribute("data-start",String(n+1))}s.textContent=t,Prism.highlightElement(s)},function(t){r.setAttribute(o,"failed"),s.textContent=t})}});var t=!(Prism.plugins.fileHighlight={highlight:function(t){for(var e,i=(t||document).querySelectorAll(u),n=0;e=i[n++];)Prism.highlightElement(e)}});Prism.fileHighlight=function(){t||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),t=!0),Prism.plugins.fileHighlight.highlight.apply(this,arguments)}}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var t={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},e="data-src-status",i='pre[data-src]:not([data-src-status="loaded"]):not([data-src-status="loading"])';Prism.hooks.add("before-highlightall",(function(t){t.selector+=", "+i})),Prism.hooks.add("before-sanity-check",(function(a){var n=a.element;if(n.matches(i)){a.code="",n.setAttribute(e,"loading");var s=n.appendChild(document.createElement("CODE"));s.textContent="Loading…";var r=n.getAttribute("data-src"),l=a.language;if("none"===l){var o=(/\.(\w+)$/.exec(r)||[,"none"])[1];l=t[o]||o}Prism.util.setLanguage(s,l),Prism.util.setLanguage(n,l);var h=Prism.plugins.autoloader;h&&h.loadLanguages(l),function(t,i,a){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status<400&&r.responseText?function(t){n.setAttribute(e,"loaded");var i=function(t){var e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(t||"");if(e){var i=Number(e[1]),a=e[2],n=e[3];return a?n?[i,Number(n)]:[i,void 0]:[i,i]}}(n.getAttribute("data-range"));if(i){var a=t.split(/\r\n?|\n/g),r=i[0],l=null==i[1]?a.length:i[1];r<0&&(r+=a.length),r=Math.max(0,Math.min(r-1,a.length)),l<0&&(l+=a.length),l=Math.max(0,Math.min(l,a.length)),t=a.slice(r,l).join("\n"),n.hasAttribute("data-start")||n.setAttribute("data-start",String(r+1))}s.textContent=t,Prism.highlightElement(s)}(r.responseText):r.status>=400?a("✖ Error "+r.status+" while fetching file: "+r.statusText):a("✖ Error: File does not exist or is empty"))},r.send(null)}(r,0,(function(t){n.setAttribute(e,"failed"),s.textContent=t}))}})),Prism.plugins.fileHighlight={highlight:function(t){for(var e,a=(t||document).querySelectorAll(i),n=0;e=a[n++];)Prism.highlightElement(e)}};var a=!1;Prism.fileHighlight=function(){a||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),a=!0),Prism.plugins.fileHighlight.highlight.apply(this,arguments)}}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js index 1e311d345a..94b828a311 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/filter-highlight-all/prism-filter-highlight-all.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e,t=Prism.util.currentScript(),r=[],n=Prism.plugins.filterHighlightAll={add:function(t){r.push(function(e){return t({element:e,language:Prism.util.getLanguage(e)})})},addSelector:function(t){r.push(function(e){return e.matches(t)})},reject:{add:function(t){r.push(function(e){return!t({element:e,language:Prism.util.getLanguage(e)})})},addSelector:function(t){r.push(function(e){return!e.matches(t)})}},filterKnown:!!t&&t.hasAttribute("data-filter-known")};if(n.add(function(e){return!n.filterKnown||"object"==typeof Prism.languages[e.language]}),t)(e=t.getAttribute("data-filter-selector"))&&n.addSelector(e),(e=t.getAttribute("data-reject-selector"))&&n.reject.addSelector(e);Prism.hooks.add("before-all-elements-highlight",function(e){e.elements=e.elements.filter(i)})}function i(e){for(var t=0,n=r.length;t\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,c=/^#?((?:[\da-f]){3,4}|(?:[\da-f]{2}){3,4})$/i,l=[function(n){var r=c.exec(n);if(r){for(var o=6<=(n=r[1]).length?2:1,s=n.length/o,e=1==o?1/15:1/255,t=[],i=0;i';n.content=i+o}})}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var n=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,r=/^#?((?:[\da-f]){3,4}|(?:[\da-f]{2}){3,4})$/i,o=[function(n){var o=r.exec(n);if(o){for(var s=(n=o[1]).length>=6?2:1,e=n.length/s,t=1==s?1/15:1/255,i=[],a=0;a=0){for(var s,e=r.content,t=e.split(n).join(""),i=0,a=o.length;i';r.content=c+e}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js index b6303a827d..17892784a8 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var s=[];t(function(t){if(t&&t.meta&&t.data){if(t.meta.status&&400<=t.meta.status)return"Error: "+(t.data.message||t.meta.status);if("string"==typeof t.data.content)return"function"==typeof atob?atob(t.data.content.replace(/\s/g,"")):"Your browser cannot decode base64"}return null},"github"),t(function(t,e){if(t&&t.meta&&t.data&&t.data.files){if(t.meta.status&&400<=t.meta.status)return"Error: "+(t.data.message||t.meta.status);var n=t.data.files,a=e.getAttribute("data-filename");if(null==a)for(var r in n)if(n.hasOwnProperty(r)){a=r;break}return void 0!==n[a]?n[a].content:"Error: unknown or missing gist file "+a}return null},"gist"),t(function(t){return t&&t.node&&"string"==typeof t.data?t.data:null},"bitbucket");var f=0,d="data-jsonp-status",l="loading",c="loaded",m="failed",p="pre[data-jsonp]:not(["+d+'="'+c+'"]):not(['+d+'="'+l+'"])';Prism.hooks.add("before-highlightall",function(t){t.selector+=", "+p}),Prism.hooks.add("before-sanity-check",function(t){var r=t.element;if(r.matches(p)){t.code="",r.setAttribute(d,l);var i=r.appendChild(document.createElement("CODE"));i.textContent="Loading…";var e=t.language;i.className="language-"+e;var n=Prism.plugins.autoloader;n&&n.loadLanguages(e);var a=r.getAttribute("data-adapter"),o=null;if(a){if("function"!=typeof window[a])return r.setAttribute(d,m),void(i.textContent=function(t){return'✖ Error: JSONP adapter function "'+t+"\" doesn't exist"}(a));o=window[a]}var u=r.getAttribute("data-jsonp");!function(t,e,n,a){var r="prismjsonp"+f++,i=document.createElement("a");i.href=t,i.href+=(i.search?"&":"?")+(e||"callback")+"="+r;var o=document.createElement("script");o.src=i.href,o.onerror=function(){s(),a("network")};var u=setTimeout(function(){s(),a("timeout")},Prism.plugins.jsonphighlight.timeout);function s(){clearTimeout(u),document.head.removeChild(o),delete window[r]}window[r]=function(t){s(),n(t)},document.head.appendChild(o)}(u,r.getAttribute("data-callback"),function(t){var e=null;if(o)e=o(t,r);else for(var n=0,a=s.length;n=400)return"Error: "+(t.data.message||t.meta.status);if("string"==typeof t.data.content)return"function"==typeof atob?atob(t.data.content.replace(/\s/g,"")):"Your browser cannot decode base64"}return null}),"github"),o((function(t,e){if(t&&t.meta&&t.data&&t.data.files){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);var n=t.data.files,a=e.getAttribute("data-filename");if(null==a)for(var r in n)if(n.hasOwnProperty(r)){a=r;break}return void 0!==n[a]?n[a].content:"Error: unknown or missing gist file "+a}return null}),"gist"),o((function(t){return t&&t.node&&"string"==typeof t.data?t.data:null}),"bitbucket");var e=0,n="data-jsonp-status",a="failed",r='pre[data-jsonp]:not([data-jsonp-status="loaded"]):not([data-jsonp-status="loading"])';Prism.hooks.add("before-highlightall",(function(t){t.selector+=", "+r})),Prism.hooks.add("before-sanity-check",(function(o){var i,u=o.element;if(u.matches(r)){o.code="",u.setAttribute(n,"loading");var s=u.appendChild(document.createElement("CODE"));s.textContent="Loading…";var d=o.language;s.className="language-"+d;var f=Prism.plugins.autoloader;f&&f.loadLanguages(d);var l=u.getAttribute("data-adapter"),c=null;if(l){if("function"!=typeof window[l])return u.setAttribute(n,a),void(s.textContent=(i=l,'✖ Error: JSONP adapter function "'+i+"\" doesn't exist"));c=window[l]}var p=u.getAttribute("data-jsonp");!function(r,o,i,d){var f="prismjsonp"+e++,l=document.createElement("a");l.href=r,l.href+=(l.search?"&":"?")+(o||"callback")+"="+f;var p=document.createElement("script");p.src=l.href,p.onerror=function(){g(),d()};var m=setTimeout((function(){g(),d()}),Prism.plugins.jsonphighlight.timeout);function g(){clearTimeout(m),document.head.removeChild(p),delete window[f]}window[f]=function(e){g(),function(e){var r=null;if(c)r=c(e,u);else for(var o=0,i=t.length;o=0&&t.splice(n,1)}},highlight:function(t){for(var e,n=(t||document).querySelectorAll(r),a=0;e=n[a++];)Prism.highlightElement(e)}}}function o(e,n){n=n||e.name,"function"!=typeof e||i(e)||i(n)||t.push({adapter:e,name:n})}function i(e){if("function"==typeof e){for(var n=0;a=t[n++];)if(a.adapter.valueOf()===e.valueOf())return a.adapter}else if("string"==typeof e){var a;for(n=0;a=t[n++];)if(a.name===e)return a.adapter}return null}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js index c160faa88f..dd3a108041 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js @@ -39,8 +39,8 @@ } var o = { - // Clone the original tag to keep all attributes - clone: element.cloneNode(false), + // Store original element so we can restore it after highlighting + element: element, posOpen: pos }; data.push(o); @@ -96,12 +96,13 @@ } if (nodeState.nodeStart && nodeState.nodeEnd) { - // Select the range and wrap it with the clone + // Select the range and wrap it with the element var range = document.createRange(); range.setStart(nodeState.nodeStart, nodeState.nodeStartPos); range.setEnd(nodeState.nodeEnd, nodeState.nodeEndPos); - nodeState.node.clone.appendChild(range.extractContents()); - range.insertNode(nodeState.node.clone); + nodeState.node.element.innerHTML = ''; + nodeState.node.element.appendChild(range.extractContents()); + range.insertNode(nodeState.node.element); range.detach(); // Process is over diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js index 6bea9d2efd..9076248398 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",function(e){if(e.element.children.length&&Prism.util.isActive(e.element,"keep-markup",!0)){var o=Prism.util.isActive(e.element,"drop-tokens",!1),d=0,t=[];s(e.element),t.length&&(e.keepMarkup=t)}function r(e){if(function(e){return!o||"span"!==e.nodeName.toLowerCase()||!e.classList.contains("token")}(e)){var n={clone:e.cloneNode(!1),posOpen:d};t.push(n),s(e),n.posClose=d}else s(e)}function s(e){for(var n=0,o=e.childNodes.length;nn.node.posOpen&&(n.nodeStart=d,n.nodeStartPos=n.node.posOpen-n.pos),n.nodeStart&&n.pos+d.data.length>=n.node.posClose&&(n.nodeEnd=d,n.nodeEndPos=n.node.posClose-n.pos),n.pos+=d.data.length);if(n.nodeStart&&n.nodeEnd){var r=document.createRange();return r.setStart(n.nodeStart,n.nodeStartPos),r.setEnd(n.nodeEnd,n.nodeEndPos),n.node.clone.appendChild(r.extractContents()),r.insertNode(n.node.clone),r.detach(),!1}}return!0};n.keepMarkup.forEach(function(e){s(n.element,{node:e,pos:0})}),n.highlightedCode=n.element.innerHTML}})); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",(function(e){if(e.element.children.length&&Prism.util.isActive(e.element,"keep-markup",!0)){var n=Prism.util.isActive(e.element,"drop-tokens",!1),t=0,o=[];r(e.element),o.length&&(e.keepMarkup=o)}function d(e){if(function(e){return!n||"span"!==e.nodeName.toLowerCase()||!e.classList.contains("token")}(e)){var d={element:e,posOpen:t};o.push(d),r(e),d.posClose=t}else r(e)}function r(e){for(var n=0,o=e.childNodes.length;nt.node.posOpen&&(t.nodeStart=r,t.nodeStartPos=t.node.posOpen-t.pos),t.nodeStart&&t.pos+r.data.length>=t.node.posClose&&(t.nodeEnd=r,t.nodeEndPos=t.node.posClose-t.pos),t.pos+=r.data.length);if(t.nodeStart&&t.nodeEnd){var s=document.createRange();return s.setStart(t.nodeStart,t.nodeStartPos),s.setEnd(t.nodeEnd,t.nodeEndPos),t.node.element.innerHTML="",t.node.element.appendChild(s.extractContents()),s.insertNode(t.node.element),s.detach(),!1}}return!0};e.keepMarkup.forEach((function(t){n(e.element,{node:t,pos:0})})),e.highlightedCode=e.element.innerHTML}}))); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js index c1f640b45c..7d38b6b424 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector){var t,o="line-numbers",s="linkable-line-numbers",l=function(){if(void 0===t){var e=document.createElement("div");e.style.fontSize="13px",e.style.lineHeight="1.5",e.style.padding="0",e.style.border="0",e.innerHTML=" 
     ",document.body.appendChild(e),t=38===e.offsetHeight,document.body.removeChild(e)}return t},a=!0;Prism.plugins.lineHighlight={highlightLines:function(u,e,c){var t=(e="string"==typeof e?e:u.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),d=+u.getAttribute("data-line-offset")||0,h=(l()?parseInt:parseFloat)(getComputedStyle(u).lineHeight),f=Prism.util.isActive(u,o),i=u.querySelector("code"),p=f?u:i||u,g=[],m=i&&p!=i?function(e,t){var i=getComputedStyle(e),n=getComputedStyle(t);function r(e){return+e.substr(0,e.length-2)}return t.offsetTop+r(n.borderTopWidth)+r(n.paddingTop)-r(i.paddingTop)}(u,i):0;t.forEach(function(e){var t=e.split("-"),i=+t[0],n=+t[1]||i,r=u.querySelector('.line-highlight[data-range="'+e+'"]')||document.createElement("div");if(g.push(function(){r.setAttribute("aria-hidden","true"),r.setAttribute("data-range",e),r.className=(c||"")+" line-highlight"}),f&&Prism.plugins.lineNumbers){var o=Prism.plugins.lineNumbers.getLine(u,i),s=Prism.plugins.lineNumbers.getLine(u,n);if(o){var l=o.offsetTop+m+"px";g.push(function(){r.style.top=l})}if(s){var a=s.offsetTop-o.offsetTop+s.offsetHeight+"px";g.push(function(){r.style.height=a})}}else g.push(function(){r.setAttribute("data-start",String(i)),i span",u).forEach(function(e,t){var i=t+r;e.onclick=function(){var e=n+"."+i;a=!1,location.hash=e,setTimeout(function(){a=!0},1)}})}return function(){g.forEach(b)}}};var u=0;Prism.hooks.add("before-sanity-check",function(e){var t=e.element.parentElement;if(c(t)){var i=0;v(".line-highlight",t).forEach(function(e){i+=e.textContent.length,e.parentNode.removeChild(e)}),i&&/^(?: \n)+$/.test(e.code.slice(-i))&&(e.code=e.code.slice(0,-i))}}),Prism.hooks.add("complete",function e(t){var i=t.element.parentElement;if(c(i)){clearTimeout(u);var n=Prism.plugins.lineNumbers,r=t.plugins&&t.plugins.lineNumbers;if(y(i,o)&&n&&!r)Prism.hooks.add("line-numbers",e);else Prism.plugins.lineHighlight.highlightLines(i)(),u=setTimeout(d,1)}}),window.addEventListener("hashchange",d),window.addEventListener("resize",function(){v("pre").filter(c).map(function(e){return Prism.plugins.lineHighlight.highlightLines(e)}).forEach(b)})}function v(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function y(e,t){return e.classList.contains(t)}function b(e){e()}function c(e){return!(!e||!/pre/i.test(e.nodeName))&&(!!e.hasAttribute("data-line")||!(!e.id||!Prism.util.isActive(e,s)))}function d(){var e=location.hash.slice(1);v(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var i=e.slice(0,e.lastIndexOf(".")),n=document.getElementById(i);if(n)n.hasAttribute("data-line")||n.setAttribute("data-line",""),Prism.plugins.lineHighlight.highlightLines(n,t,"temporary ")(),a&&document.querySelector(".temporary.line-highlight").scrollIntoView()}}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document&&document.querySelector){var e,t="line-numbers",i="linkable-line-numbers",n=!0;Prism.plugins.lineHighlight={highlightLines:function(r,a,u){var c=(a="string"==typeof a?a:r.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),d=+r.getAttribute("data-line-offset")||0,h=(function(){if(void 0===e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding="0",t.style.border="0",t.innerHTML=" 
     ",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}()?parseInt:parseFloat)(getComputedStyle(r).lineHeight),f=Prism.util.isActive(r,t),p=r.querySelector("code"),g=f?r:p||r,m=[],v=p&&g!=p?function(e,t){var i=getComputedStyle(e),n=getComputedStyle(t);function r(e){return+e.substr(0,e.length-2)}return t.offsetTop+r(n.borderTopWidth)+r(n.paddingTop)-r(i.paddingTop)}(r,p):0;c.forEach((function(e){var t=e.split("-"),i=+t[0],n=+t[1]||i,o=r.querySelector('.line-highlight[data-range="'+e+'"]')||document.createElement("div");if(m.push((function(){o.setAttribute("aria-hidden","true"),o.setAttribute("data-range",e),o.className=(u||"")+" line-highlight"})),f&&Prism.plugins.lineNumbers){var s=Prism.plugins.lineNumbers.getLine(r,i),l=Prism.plugins.lineNumbers.getLine(r,n);if(s){var a=s.offsetTop+v+"px";m.push((function(){o.style.top=a}))}if(l){var c=l.offsetTop-s.offsetTop+l.offsetHeight+"px";m.push((function(){o.style.height=c}))}}else m.push((function(){o.setAttribute("data-start",String(i)),n>i&&o.setAttribute("data-end",String(n)),o.style.top=(i-d-1)*h+v+"px",o.textContent=new Array(n-i+2).join(" \n")}));m.push((function(){o.style.width=r.scrollWidth+"px"})),m.push((function(){g.appendChild(o)}))}));var y=r.id;if(f&&Prism.util.isActive(r,i)&&y){s(r,i)||m.push((function(){r.classList.add(i)}));var b=parseInt(r.getAttribute("data-start")||"1");o(".line-numbers-rows > span",r).forEach((function(e,t){var i=t+b;e.onclick=function(){var e=y+"."+i;n=!1,location.hash=e,setTimeout((function(){n=!0}),1)}}))}return function(){m.forEach(l)}}};var r=0;Prism.hooks.add("before-sanity-check",(function(e){var t=e.element.parentElement;if(a(t)){var i=0;o(".line-highlight",t).forEach((function(e){i+=e.textContent.length,e.parentNode.removeChild(e)})),i&&/^(?: \n)+$/.test(e.code.slice(-i))&&(e.code=e.code.slice(0,-i))}})),Prism.hooks.add("complete",(function e(i){var n=i.element.parentElement;if(a(n)){clearTimeout(r);var o=Prism.plugins.lineNumbers,l=i.plugins&&i.plugins.lineNumbers;s(n,t)&&o&&!l?Prism.hooks.add("line-numbers",e):(Prism.plugins.lineHighlight.highlightLines(n)(),r=setTimeout(u,1))}})),window.addEventListener("hashchange",u),window.addEventListener("resize",(function(){o("pre").filter(a).map((function(e){return Prism.plugins.lineHighlight.highlightLines(e)})).forEach(l)}))}function o(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function s(e,t){return e.classList.contains(t)}function l(e){e()}function a(e){return!!(e&&/pre/i.test(e.nodeName)&&(e.hasAttribute("data-line")||e.id&&Prism.util.isActive(e,i)))}function u(){var e=location.hash.slice(1);o(".temporary.line-highlight").forEach((function(e){e.parentNode.removeChild(e)}));var t=(e.match(/\.([\d,-]+)$/)||[,""])[1];if(t&&!document.getElementById(e)){var i=e.slice(0,e.lastIndexOf(".")),r=document.getElementById(i);r&&(r.hasAttribute("data-line")||r.setAttribute("data-line",""),Prism.plugins.lineHighlight.highlightLines(r,t,"temporary ")(),n&&document.querySelector(".temporary.line-highlight").scrollIntoView())}}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js index 9ccb6da910..1f12d2d476 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null}(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1s&&(t=s);var l=t-r;return i.children[l]}}},resize:function(e){r([e])},assumeViewportIndependence:!0},i=void 0;window.addEventListener("resize",(function(){t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll("pre.line-numbers"))))})),Prism.hooks.add("complete",(function(t){if(t.code){var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector(".line-numbers-rows")&&Prism.util.isActive(i,e)){i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join("");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,s.hasAttribute("data-start")&&(s.style.counterReset="linenumber "+(parseInt(s.getAttribute("data-start"),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run("line-numbers",t)}}})),Prism.hooks.add("line-numbers",(function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}))}function r(e){if(0!=(e=e.filter((function(e){var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)["white-space"];return"pre-wrap"===t||"pre-line"===t}))).length){var t=e.map((function(e){var t=e.querySelector("code"),i=e.querySelector(".line-numbers-rows");if(t&&i){var r=e.querySelector(".line-numbers-sizer"),s=t.textContent.split(n);r||((r=document.createElement("span")).className="line-numbers-sizer",t.appendChild(r)),r.innerHTML="0",r.style.display="block";var l=r.getBoundingClientRect().height;return r.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}}})).filter(Boolean);t.forEach((function(e){var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){if(e&&e.length>1){var s=n.appendChild(document.createElement("span"));s.style.display="block",s.textContent=e}else i[t]=r}))})),t.forEach((function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;rn&&(o[l]="\n"+o[l],a=s)}r[i]=o.join("")}return r.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",(function(e){var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings["whitespace-normalization"])&&Prism.util.isActive(e.element,"whitespace-normalization",!0))if(e.element&&e.element.parentNode||!e.code){var t=e.element.parentNode;if(e.code&&t&&"pre"===t.nodeName.toLowerCase()){for(var r=t.childNodes,i="",o="",a=!1,l=0;l
  • "})}),tokens:{gradient:{pattern:/(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:hsl|rgb)a?\(.+?\)|[^\)])+\)/gi,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},angle:{create:function(){new Prism.plugins.Previewer("angle",function(e){var s,t,i=parseFloat(e),a=e.match(/[a-z]+$/i);if(!i||!a)return!1;switch(a=a[0]){case"deg":s=360;break;case"grad":s=400;break;case"rad":s=2*Math.PI;break;case"turn":s=1}return t=100*i/s,t%=100,this[(i<0?"set":"remove")+"Attribute"]("data-negative",""),this.querySelector("circle").style.strokeDasharray=Math.abs(t)+",500",!0},"*",function(){this._elt.innerHTML=''})},tokens:{angle:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)(?:deg|g?rad|turn)\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},color:{create:function(){new Prism.plugins.Previewer("color",function(e){return this.style.backgroundColor="",this.style.backgroundColor=e,!!this.style.backgroundColor})},tokens:{color:[Prism.languages.css.hexcode].concat(Prism.languages.css.color)},languages:{css:!1,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!1,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},easing:{create:function(){new Prism.plugins.Previewer("easing",function(e){var s=(e={linear:"0,0,1,1",ease:".25,.1,.25,1","ease-in":".42,0,1,1","ease-out":"0,0,.58,1","ease-in-out":".42,0,.58,1"}[e]||e).match(/-?(?:\d+(?:\.\d+)?|\.\d+)/g);if(4!==s.length)return!1;s=s.map(function(e,s){return 100*(s%2?1-e:e)}),this.querySelector("path").setAttribute("d","M0,100 C"+s[0]+","+s[1]+", "+s[2]+","+s[3]+", 100,0");var t=this.querySelectorAll("line");return t[0].setAttribute("x2",s[0]),t[0].setAttribute("y2",s[1]),t[1].setAttribute("x2",s[2]),t[1].setAttribute("y2",s[3]),!0},"*",function(){this._elt.innerHTML=''})},tokens:{easing:{pattern:/\bcubic-bezier\((?:-?(?:\d+(?:\.\d+)?|\.\d+),\s*){3}-?(?:\d+(?:\.\d+)?|\.\d+)\)\B|\b(?:ease(?:-in)?(?:-out)?|linear)(?=\s|[;}]|$)/i,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",inside:"inside",before:"punctuation",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},time:{create:function(){new Prism.plugins.Previewer("time",function(e){var s=parseFloat(e),t=e.match(/[a-z]+$/i);return!(!s||!t)&&(t=t[0],this.querySelector("circle").style.animationDuration=2*s+t,!0)},"*",function(){this._elt.innerHTML=''})},tokens:{time:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)m?s\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}}},t="token",i="active",a="flipped",r=function(e,s,t,i){this._elt=null,this._type=e,this._token=null,this.updater=s,this._mouseout=this.mouseout.bind(this),this.initializer=i;var a=this;t||(t=["*"]),Array.isArray(t)||(t=[t]),t.forEach(function(e){"string"!=typeof e&&(e=e.lang),r.byLanguages[e]||(r.byLanguages[e]=[]),r.byLanguages[e].indexOf(a)<0&&r.byLanguages[e].push(a)}),r.byType[e]=this};for(var e in r.prototype.init=function(){this._elt||(this._elt=document.createElement("div"),this._elt.className="prism-previewer prism-previewer-"+this._type,document.body.appendChild(this._elt),this.initializer&&this.initializer())},r.prototype.isDisabled=function(e){do{if(e.hasAttribute&&e.hasAttribute("data-previewers"))return-1===(e.getAttribute("data-previewers")||"").split(/\s+/).indexOf(this._type)}while(e=e.parentNode);return!1},r.prototype.check=function(e){if(!e.classList.contains(t)||!this.isDisabled(e)){do{if(e.classList&&e.classList.contains(t)&&e.classList.contains(this._type))break}while(e=e.parentNode);e&&e!==this._token&&(this._token=e,this.show())}},r.prototype.mouseout=function(){this._token.removeEventListener("mouseout",this._mouseout,!1),this._token=null,this.hide()},r.prototype.show=function(){if(this._elt||this.init(),this._token)if(this.updater.call(this._elt,this._token.textContent)){this._token.addEventListener("mouseout",this._mouseout,!1);var e=function(e){var s=e.getBoundingClientRect(),t=s.left,i=s.top,a=document.documentElement.getBoundingClientRect();return t-=a.left,{top:i-=a.top,right:innerWidth-t-s.width,bottom:innerHeight-i-s.height,left:t,width:s.width,height:s.height}}(this._token);this._elt.classList.add(i),0=0?e[s]=function(e,s,t){var i="180deg";return/^(?:-?(?:\d+(?:\.\d+)?|\.\d+)(?:deg|rad)|to\b|top|right|bottom|left)/.test(t[0])&&(i=t.shift()).indexOf("to ")<0&&(i.indexOf("top")>=0?i=i.indexOf("left")>=0?"to bottom right":i.indexOf("right")>=0?"to bottom left":"to bottom":i.indexOf("bottom")>=0?i=i.indexOf("left")>=0?"to top right":i.indexOf("right")>=0?"to top left":"to top":i.indexOf("left")>=0?i="to right":i.indexOf("right")>=0?i="to left":e&&(i.indexOf("deg")>=0?i=90-parseFloat(i)+"deg":i.indexOf("rad")>=0&&(i=Math.PI/2-parseFloat(i)+"rad"))),s+"("+i+","+t.join(",")+")"}(i,a,n):a.indexOf("radial")>=0?e[s]=function(e,s,t){if(t[0].indexOf("at")<0){var i="center",a="ellipse",n="farthest-corner";if(/\b(?:bottom|center|left|right|top)\b|^\d+/.test(t[0])&&(i=t.shift().replace(/\s*-?\d+(?:deg|rad)\s*/,"")),/\b(?:circle|closest|contain|cover|ellipse|farthest)\b/.test(t[0])){var r=t.shift().split(/\s+/);!r[0]||"circle"!==r[0]&&"ellipse"!==r[0]||(a=r.shift()),r[0]&&(n=r.shift()),"cover"===n?n="farthest-corner":"contain"===n&&(n="clothest-side")}return s+"("+a+" "+n+" at "+i+","+t.join(",")+")"}return s+"("+t.join(",")+")"}(0,a,n):e[s]=a+"("+n.join(",")+")"},function(){new Prism.plugins.Previewer("gradient",(function(e){return this.firstChild.style.backgroundImage="",this.firstChild.style.backgroundImage=s(e),!!this.firstChild.style.backgroundImage}),"*",(function(){this._elt.innerHTML="
    "}))}),tokens:{gradient:{pattern:/(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:hsl|rgb)a?\(.+?\)|[^\)])+\)/gi,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},angle:{create:function(){new Prism.plugins.Previewer("angle",(function(e){var s,t,i=parseFloat(e),a=e.match(/[a-z]+$/i);if(!i||!a)return!1;switch(a=a[0]){case"deg":s=360;break;case"grad":s=400;break;case"rad":s=2*Math.PI;break;case"turn":s=1}return t=100*i/s,t%=100,this[(i<0?"set":"remove")+"Attribute"]("data-negative",""),this.querySelector("circle").style.strokeDasharray=Math.abs(t)+",500",!0}),"*",(function(){this._elt.innerHTML=''}))},tokens:{angle:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)(?:deg|g?rad|turn)\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},color:{create:function(){new Prism.plugins.Previewer("color",(function(e){return this.style.backgroundColor="",this.style.backgroundColor=e,!!this.style.backgroundColor}))},tokens:{color:[Prism.languages.css.hexcode].concat(Prism.languages.css.color)},languages:{css:!1,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!1,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},easing:{create:function(){new Prism.plugins.Previewer("easing",(function(e){var s=(e={linear:"0,0,1,1",ease:".25,.1,.25,1","ease-in":".42,0,1,1","ease-out":"0,0,.58,1","ease-in-out":".42,0,.58,1"}[e]||e).match(/-?(?:\d+(?:\.\d+)?|\.\d+)/g);if(4===s.length){s=s.map((function(e,s){return 100*(s%2?1-e:e)})),this.querySelector("path").setAttribute("d","M0,100 C"+s[0]+","+s[1]+", "+s[2]+","+s[3]+", 100,0");var t=this.querySelectorAll("line");return t[0].setAttribute("x2",s[0]),t[0].setAttribute("y2",s[1]),t[1].setAttribute("x2",s[2]),t[1].setAttribute("y2",s[3]),!0}return!1}),"*",(function(){this._elt.innerHTML=''}))},tokens:{easing:{pattern:/\bcubic-bezier\((?:-?(?:\d+(?:\.\d+)?|\.\d+),\s*){3}-?(?:\d+(?:\.\d+)?|\.\d+)\)\B|\b(?:ease(?:-in)?(?:-out)?|linear)(?=\s|[;}]|$)/i,inside:{function:/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",inside:"inside",before:"punctuation",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},time:{create:function(){new Prism.plugins.Previewer("time",(function(e){var s=parseFloat(e),t=e.match(/[a-z]+$/i);return!(!s||!t||(t=t[0],this.querySelector("circle").style.animationDuration=2*s+t,0))}),"*",(function(){this._elt.innerHTML=''}))},tokens:{time:/(?:\b|\B-|(?=\B\.))(?:\d+(?:\.\d+)?|\.\d+)m?s\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}}},i="token",a="active",n="flipped",r=function(e,s,t,i){this._elt=null,this._type=e,this._token=null,this.updater=s,this._mouseout=this.mouseout.bind(this),this.initializer=i;var a=this;t||(t=["*"]),Array.isArray(t)||(t=[t]),t.forEach((function(e){"string"!=typeof e&&(e=e.lang),r.byLanguages[e]||(r.byLanguages[e]=[]),r.byLanguages[e].indexOf(a)<0&&r.byLanguages[e].push(a)})),r.byType[e]=this};for(var o in r.prototype.init=function(){this._elt||(this._elt=document.createElement("div"),this._elt.className="prism-previewer prism-previewer-"+this._type,document.body.appendChild(this._elt),this.initializer&&this.initializer())},r.prototype.isDisabled=function(e){do{if(e.hasAttribute&&e.hasAttribute("data-previewers"))return-1===(e.getAttribute("data-previewers")||"").split(/\s+/).indexOf(this._type)}while(e=e.parentNode);return!1},r.prototype.check=function(e){if(!e.classList.contains(i)||!this.isDisabled(e)){do{if(e.classList&&e.classList.contains(i)&&e.classList.contains(this._type))break}while(e=e.parentNode);e&&e!==this._token&&(this._token=e,this.show())}},r.prototype.mouseout=function(){this._token.removeEventListener("mouseout",this._mouseout,!1),this._token=null,this.hide()},r.prototype.show=function(){var e,s,t,i;if(this._elt||this.init(),this._token)if(this.updater.call(this._elt,this._token.textContent)){this._token.addEventListener("mouseout",this._mouseout,!1);var r=(s=(e=this._token.getBoundingClientRect()).left,t=e.top,s-=(i=document.documentElement.getBoundingClientRect()).left,{top:t-=i.top,right:innerWidth-s-e.width,bottom:innerHeight-t-e.height,left:s,width:e.width,height:e.height});this._elt.classList.add(a),r.top-this._elt.offsetHeight>0?(this._elt.classList.remove(n),this._elt.style.top=r.top+"px",this._elt.style.bottom=""):(this._elt.classList.add(n),this._elt.style.bottom=r.bottom+"px",this._elt.style.top=""),this._elt.style.left=r.left+Math.min(200,r.width/2)+"px"}else this.hide()},r.prototype.hide=function(){this._elt.classList.remove(a)},r.byLanguages={},r.byType={},r.initEvents=function(e,s){var t=[];r.byLanguages[s]&&(t=t.concat(r.byLanguages[s])),r.byLanguages["*"]&&(t=t.concat(r.byLanguages["*"])),e.addEventListener("mouseover",(function(e){var s=e.target;t.forEach((function(e){e.check(s)}))}),!1)},Prism.plugins.Previewer=r,Prism.hooks.add("before-highlight",(function(e){for(var s in t){var i=t[s].languages;if(e.language&&i[e.language]&&!i[e.language].initialized){var a=i[e.language];Array.isArray(a)||(a=[a]),a.forEach((function(a){var n,r,o,l;!0===a?(n="important",r=e.language,a=e.language):(n=a.before||"important",r=a.inside||a.lang,o=a.root||Prism.languages,l=a.skip,a=e.language),!l&&Prism.languages[a]&&(Prism.languages.insertBefore(r,n,t[s].tokens,o),e.grammar=Prism.languages[a],i[e.language]={initialized:!0})}))}}})),Prism.hooks.add("after-highlight",(function(e){(r.byLanguages["*"]||r.byLanguages[e.language])&&r.initEvents(e.element,e.language)})),t)t[o].create()}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js index f507edf165..a953fae81e 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&Prism.hooks.add("before-sanity-check",function(e){if(e.code){var n=e.element.parentNode,o=/(?:^|\s)keep-initial-line-feed(?:\s|$)/;!n||"pre"!==n.nodeName.toLowerCase()||o.test(n.className)||o.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}}); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&Prism.hooks.add("before-sanity-check",(function(e){if(e.code){var n=e.element.parentNode,o=/(?:^|\s)keep-initial-line-feed(?:\s|$)/;!n||"pre"!==n.nodeName.toLowerCase()||o.test(n.className)||o.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}})); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js index 56231c4aa7..6298b3b9cc 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){var i={tab:/\t/,crlf:/\r\n/,lf:/\n/,cr:/\r/,space:/ /};Prism.hooks.add("before-highlight",function(r){s(r.grammar)})}function f(r,e){var i=r[e];switch(Prism.util.type(i)){case"RegExp":var a={};r[e]={pattern:i,inside:a},s(a);break;case"Array":for(var n=0,t=i.length;n /}}}}},Prism.hooks.add("wrap",function(e){if("treeview"===e.language&&"entry-name"===e.type){var t=e.classes,n=/(^|[^\\])\/\s*$/;if(n.test(e.content))e.content=e.content.replace(n,"$1"),t.push("dir");else{e.content=e.content.replace(/(^|[^\\])[=*|]\s*$/,"$1");for(var a=e.content.toLowerCase().replace(/\s+/g,"").split(".");1 /}}}}},Prism.hooks.add("wrap",(function(e){if("treeview"===e.language&&"entry-name"===e.type){var t=e.classes,n=/(^|[^\\])\/\s*$/;if(n.test(e.content))e.content=e.content.replace(n,"$1"),t.push("dir");else{e.content=e.content.replace(/(^|[^\\])[=*|]\s*$/,"$1");for(var a=e.content.toLowerCase().replace(/\s+/g,"").split(".");a.length>1;)a.shift(),t.push("ext-"+a.join("-"))}"."===e.content[0]&&t.push("dotfile")}}))); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js index 622f0953d8..e84264ed93 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js @@ -1 +1 @@ -"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",function(e){e.selector+=', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'}),Prism.hooks.add("before-sanity-check",function(e){var t=e.element;if(t.matches('script[type="text/plain"]')){var a=document.createElement("code"),c=document.createElement("pre");c.className=a.className=t.className;var n=t.dataset;return Object.keys(n||{}).forEach(function(e){Object.prototype.hasOwnProperty.call(n,e)&&(c.dataset[e]=n[e])}),a.textContent=e.code=e.code.replace(/<\/script(?:>|>)/gi,"<\/script>"),c.appendChild(a),t.parentNode.replaceChild(c,t),void(e.element=a)}if(!e.code){var o=t.childNodes;1===o.length&&"#comment"==o[0].nodeName&&(t.textContent=e.code=o[0].textContent)}})); \ No newline at end of file +"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",(function(e){e.selector+=', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'})),Prism.hooks.add("before-sanity-check",(function(e){var t=e.element;if(t.matches('script[type="text/plain"]')){var a=document.createElement("code"),c=document.createElement("pre");c.className=a.className=t.className;var n=t.dataset;return Object.keys(n||{}).forEach((function(e){Object.prototype.hasOwnProperty.call(n,e)&&(c.dataset[e]=n[e])})),a.textContent=e.code=e.code.replace(/<\/script(?:>|>)/gi,"<\/script>"),c.appendChild(a),t.parentNode.replaceChild(c,t),void(e.element=a)}if(!e.code){var o=t.childNodes;1===o.length&&"#comment"==o[0].nodeName&&(t.textContent=e.code=o[0].textContent)}}))); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js index 4d2f395544..c88b653526 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof Prism){if(Prism.languages.css&&(Prism.languages.css.selector.pattern?(Prism.languages.css.selector.inside["pseudo-class"]=/:[\w-]+/,Prism.languages.css.selector.inside["pseudo-element"]=/::[\w-]+/):Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-class":/:[\w-]+/,"pseudo-element":/::[\w-]+/}}),Prism.languages.markup){Prism.languages.markup.tag.inside.tag.inside["tag-id"]=/[\w-]+/;var s={HTML:{a:1,abbr:1,acronym:1,b:1,basefont:1,bdo:1,big:1,blink:1,cite:1,code:1,dfn:1,em:1,kbd:1,i:1,rp:1,rt:1,ruby:1,s:1,samp:1,small:1,spacer:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,var:1,wbr:1,noframes:1,summary:1,command:1,dt:1,dd:1,figure:1,figcaption:1,center:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,address:1,noscript:1,isIndex:1,main:1,mark:1,marquee:1,meter:1,menu:1},SVG:{animateColor:1,animateMotion:1,animateTransform:1,glyph:1,feBlend:1,feColorMatrix:1,feComponentTransfer:1,feFuncR:1,feFuncG:1,feFuncB:1,feFuncA:1,feComposite:1,feConvolveMatrix:1,feDiffuseLighting:1,feDisplacementMap:1,feFlood:1,feGaussianBlur:1,feImage:1,feMerge:1,feMergeNode:1,feMorphology:1,feOffset:1,feSpecularLighting:1,feTile:1,feTurbulence:1,feDistantLight:1,fePointLight:1,feSpotLight:1,linearGradient:1,radialGradient:1,altGlyph:1,textPath:1,tref:1,altglyph:1,textpath:1,altglyphdef:1,altglyphitem:1,clipPath:1,"color-profile":1,cursor:1,"font-face":1,"font-face-format":1,"font-face-name":1,"font-face-src":1,"font-face-uri":1,foreignObject:1,glyphRef:1,hkern:1,vkern:1},MathML:{}}}var a;Prism.hooks.add("wrap",function(e){if(("tag-id"==e.type||"property"==e.type&&0!=e.content.indexOf("-")||"rule"==e.type&&0!=e.content.indexOf("@-")||"pseudo-class"==e.type&&0!=e.content.indexOf(":-")||"pseudo-element"==e.type&&0!=e.content.indexOf("::-")||"attr-name"==e.type&&0!=e.content.indexOf("data-"))&&-1===e.content.indexOf("<")&&("css"==e.language||"scss"==e.language||"markup"==e.language)){var t="https://webplatform.github.io/docs/",n=e.content;if("css"==e.language||"scss"==e.language)t+="css/","property"==e.type?t+="properties/":"rule"==e.type?(t+="atrules/",n=n.substring(1)):"pseudo-class"==e.type?(t+="selectors/pseudo-classes/",n=n.substring(1)):"pseudo-element"==e.type&&(t+="selectors/pseudo-elements/",n=n.substring(2));else if("markup"==e.language)if("tag-id"==e.type){if(!(a=function(e){var t=e.toLowerCase();{if(s.HTML[t])return"html";if(s.SVG[e])return"svg";if(s.MathML[e])return"mathml"}if(0!==s.HTML[t]&&"undefined"!=typeof document){var n=(document.createElement(e).toString().match(/\[object HTML(.+)Element\]/)||[])[1];if(n&&"Unknown"!=n)return s.HTML[t]=1,"html"}if((s.HTML[t]=0)!==s.SVG[e]&&"undefined"!=typeof document){var a=(document.createElementNS("http://www.w3.org/2000/svg",e).toString().match(/\[object SVG(.+)Element\]/)||[])[1];if(a&&"Unknown"!=a)return s.SVG[e]=1,"svg"}if((s.SVG[e]=0)!==s.MathML[e]&&0===e.indexOf("m"))return s.MathML[e]=1,"mathml";return s.MathML[e]=0,null}(e.content)||a))return;t+=a+"/elements/"}else if("attr-name"==e.type){if(!a)return;t+=a+"/attributes/"}t+=n,e.tag="a",e.attributes.href=t,e.attributes.target="_blank"}})}}(); \ No newline at end of file +!function(){if("undefined"!=typeof Prism){if(Prism.languages.css&&(Prism.languages.css.selector.pattern?(Prism.languages.css.selector.inside["pseudo-class"]=/:[\w-]+/,Prism.languages.css.selector.inside["pseudo-element"]=/::[\w-]+/):Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-class":/:[\w-]+/,"pseudo-element":/::[\w-]+/}}),Prism.languages.markup){Prism.languages.markup.tag.inside.tag.inside["tag-id"]=/[\w-]+/;var e={HTML:{a:1,abbr:1,acronym:1,b:1,basefont:1,bdo:1,big:1,blink:1,cite:1,code:1,dfn:1,em:1,kbd:1,i:1,rp:1,rt:1,ruby:1,s:1,samp:1,small:1,spacer:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,var:1,wbr:1,noframes:1,summary:1,command:1,dt:1,dd:1,figure:1,figcaption:1,center:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,address:1,noscript:1,isIndex:1,main:1,mark:1,marquee:1,meter:1,menu:1},SVG:{animateColor:1,animateMotion:1,animateTransform:1,glyph:1,feBlend:1,feColorMatrix:1,feComponentTransfer:1,feFuncR:1,feFuncG:1,feFuncB:1,feFuncA:1,feComposite:1,feConvolveMatrix:1,feDiffuseLighting:1,feDisplacementMap:1,feFlood:1,feGaussianBlur:1,feImage:1,feMerge:1,feMergeNode:1,feMorphology:1,feOffset:1,feSpecularLighting:1,feTile:1,feTurbulence:1,feDistantLight:1,fePointLight:1,feSpotLight:1,linearGradient:1,radialGradient:1,altGlyph:1,textPath:1,tref:1,altglyph:1,textpath:1,altglyphdef:1,altglyphitem:1,clipPath:1,"color-profile":1,cursor:1,"font-face":1,"font-face-format":1,"font-face-name":1,"font-face-src":1,"font-face-uri":1,foreignObject:1,glyphRef:1,hkern:1,vkern:1},MathML:{}}}var t;Prism.hooks.add("wrap",(function(n){if(("tag-id"==n.type||"property"==n.type&&0!=n.content.indexOf("-")||"rule"==n.type&&0!=n.content.indexOf("@-")||"pseudo-class"==n.type&&0!=n.content.indexOf(":-")||"pseudo-element"==n.type&&0!=n.content.indexOf("::-")||"attr-name"==n.type&&0!=n.content.indexOf("data-"))&&-1===n.content.indexOf("<")&&("css"==n.language||"scss"==n.language||"markup"==n.language)){var a="https://webplatform.github.io/docs/",s=n.content;if("css"==n.language||"scss"==n.language)a+="css/","property"==n.type?a+="properties/":"rule"==n.type?(a+="atrules/",s=s.substring(1)):"pseudo-class"==n.type?(a+="selectors/pseudo-classes/",s=s.substring(1)):"pseudo-element"==n.type&&(a+="selectors/pseudo-elements/",s=s.substring(2));else if("markup"==n.language)if("tag-id"==n.type){if(!(t=function(t){var n=t.toLowerCase();if(e.HTML[n])return"html";if(e.SVG[t])return"svg";if(e.MathML[t])return"mathml";if(0!==e.HTML[n]&&"undefined"!=typeof document){var a=(document.createElement(t).toString().match(/\[object HTML(.+)Element\]/)||[])[1];if(a&&"Unknown"!=a)return e.HTML[n]=1,"html"}if(e.HTML[n]=0,0!==e.SVG[t]&&"undefined"!=typeof document){var s=(document.createElementNS("http://www.w3.org/2000/svg",t).toString().match(/\[object SVG(.+)Element\]/)||[])[1];if(s&&"Unknown"!=s)return e.SVG[t]=1,"svg"}return e.SVG[t]=0,0!==e.MathML[t]&&0===t.indexOf("m")?(e.MathML[t]=1,"mathml"):(e.MathML[t]=0,null)}(n.content)||t))return;a+=t+"/elements/"}else if("attr-name"==n.type){if(!t)return;a+=t+"/attributes/"}a+=s,n.tag="a",n.attributes.href=a,n.attributes.target="_blank"}}))}}(); \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js index 04e9a28e61..98835b5879 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js @@ -1623,8 +1623,24 @@ Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|imple Prism.languages.insertBefore('javascript', 'keyword', { 'regex': { - // eslint-disable-next-line regexp/no-dupe-characters-character-class - pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + pattern: RegExp( + // lookbehind + // eslint-disable-next-line regexp/no-dupe-characters-character-class + /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + + // Regex pattern: + // There are 2 regex patterns here. The RegExp set notation proposal added support for nested character + // classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible + // with the only syntax, so we have to define 2 different regex patterns. + /\//.source + + '(?:' + + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + + '|' + + // `v` flag syntax. This supports 3 levels of nested character classes. + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + + ')' + + // lookahead + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source + ), lookbehind: true, greedy: true, inside: { diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index 8e5f9ddd6d..025853e95d 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,45 +2,45 @@ # yarn lockfile v1 -"@abp/anchor-js@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-5.2.1.tgz#701e01a9637800429cf3f0364e62b8351c3a0354" - integrity sha512-61+rrfSQyZacqUJ5qQxkoWYffWcd7AArkj8DmEHmFY4e28hH3P9eXMcuGBoJ85pXleAPEmVYswc/xZiTMNHkvg== +"@abp/anchor-js@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-5.3.0-rc.1.tgz#ede6821e159291aae4e7f8b0863ed5e013f28237" + integrity sha512-84VMhSBguy12OJ9l8ONBAdsAeXxNYiRI0FYQUzuBG20zzTdJY/LvVxQGArdecM1ouLMhGzB3X3cdQQ4uHgHhUA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" anchor-js "^4.3.1" -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -49,180 +49,180 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/docs@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-5.2.1.tgz#111952a2da8e6e1ac20ed8eaa8a15854b2c92f7b" - integrity sha512-WZCCY73vyIpRu7hypPiP9CRr4Bvzkv3up0WeGQ4rK9LiZWNSxG9PXv4lYeD4cuHg0zgxH9d/6toYToaIJNqDCQ== +"@abp/docs@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-5.3.0-rc.1.tgz#c53b92172b5333187fccd95993960a259619a70c" + integrity sha512-hLKck5AFDIqk8RKaKmQzl+dzP6mluizcl2aeoUo6SoQE4uCKfInv6Np2Zak7HYdJkCrFvlOJUFkLi/RLX04eQA== dependencies: - "@abp/anchor-js" "~5.2.1" - "@abp/clipboard" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/popper.js" "~5.2.1" - "@abp/prismjs" "~5.2.1" + "@abp/anchor-js" "~5.3.0-rc.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/popper.js" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/popper.js@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-5.2.1.tgz#441a5be6889915fc09fe5d5e3c4b419d65a7b3bd" - integrity sha512-poQhd5EYjU2/udJWlDEd5mIPWmw6AzNOzAd5V4OUHMai+BHeuhIXQ6mopvxf9lpzytGoFe2ZIiQ547Wfq4Fl/Q== +"@abp/popper.js@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-5.3.0-rc.1.tgz#f89dfe05885295af256106e340bae862261fd5a5" + integrity sha512-MJ6qMDOldWRF+tAMz2XF1adocZIO8t94q0J4LAwe+VxKkIT1eZOAjE0HubuW4ffwiknKnL/vy90DenmW4WKsDw== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@popperjs/core" "^2.11.2" -"@abp/prismjs@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 95b3f87bfc..021d1ba335 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json @@ -3,6 +3,6 @@ "name": "demo-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock index d5f6d1f237..7a4d606848 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json index 5cbf1e4a17..0bc1a6dfc4 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/virtual-file-explorer": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/virtual-file-explorer": "^5.3.0-rc.1" } } diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock index eb76a09ea5..d687b3b2c5 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.2.1.tgz#25bd7116b9b0e72ba45f0f5246343343de8561b2" - integrity sha512-DYr9ROcTPfCRHxD1QSWqLZ9+ARbO5p9I6SRo893NtJ39aHacAa9RIAwZmP0JLG0C4hLXfJLKXJ2DpNcwY+ubXA== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.2.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.2.1.tgz#dc291fe9c7100cc796068e19abf7579bd5e54b44" - integrity sha512-/1C5RyPIRPZT5ir8Len2EnSt1KfWcRdPyn/avAG+9JKBZ8FoUL8mO2/ffESOvikh/wItZZgxJ5VEJVGwHNjgdQ== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.2.1" - "@abp/bootstrap" "~5.2.1" - "@abp/bootstrap-datepicker" "~5.2.1" - "@abp/datatables.net-bs5" "~5.2.1" - "@abp/font-awesome" "~5.2.1" - "@abp/jquery-form" "~5.2.1" - "@abp/jquery-validation-unobtrusive" "~5.2.1" - "@abp/lodash" "~5.2.1" - "@abp/luxon" "~5.2.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.2.1" - "@abp/select2" "~5.2.1" - "@abp/sweetalert2" "~5.2.1" - "@abp/timeago" "~5.2.1" - "@abp/toastr" "~5.2.1" - -"@abp/aspnetcore.mvc.ui@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.2.1.tgz#239ceeec332cebe2fedec0bb0cdec09089b499d3" - integrity sha512-VUSPOKjBSF+NxfwdsEVQte8u7mGP1t7jd1+ej2ND8JEKYJ1Vh7z2mfsT+lQaEJg0JWggU1AxkIMOOfHDNTU3Kg== +"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" + integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" + integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== + dependencies: + "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" + "@abp/bootstrap" "~5.3.0-rc.1" + "@abp/bootstrap-datepicker" "~5.3.0-rc.1" + "@abp/datatables.net-bs5" "~5.3.0-rc.1" + "@abp/font-awesome" "~5.3.0-rc.1" + "@abp/jquery-form" "~5.3.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" + "@abp/lodash" "~5.3.0-rc.1" + "@abp/luxon" "~5.3.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" + "@abp/select2" "~5.3.0-rc.1" + "@abp/sweetalert2" "~5.3.0-rc.1" + "@abp/timeago" "~5.3.0-rc.1" + "@abp/toastr" "~5.3.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" + integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,171 +41,171 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.2.1.tgz#20d565211d05ca184f8e3ef4db840dbd98a58fbd" - integrity sha512-UPdVu9t7XybINSfonQN0DB9Lpz1r5vCz7F8CMpbjQprvPmsFmkAZyY0p6MS3kGO5eu5rlpGAGPBGOTeSfEp9ww== +"@abp/bootstrap-datepicker@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" + integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.2.1.tgz#fe15144d7136a26be44be23fd2470cdef0bd28b9" - integrity sha512-vFW8OxfRhiDkIrDVIn3TyGkGyiCLLFmPMjSOmMg3o2XPdRk5uhwSBzWYpk/m+kmPpP6cEsJMxaHpCsirSlPE+A== +"@abp/bootstrap@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" + integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" bootstrap "^5.1.3" -"@abp/clipboard@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.2.1.tgz#c6bddd279b37e9b2bd27b027d5686411c9ae942b" - integrity sha512-aouNTDz8t+8M4O2a+UsEdtABRsyhvzGpXqCG2+LYE1vA3I+CKhglkvEFp+GyIgWsipEHY1U1w6V3qZtcRINn+A== +"@abp/clipboard@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0-rc.1.tgz#da893847d2d86f53f99dfefc8898d14410d45600" + integrity sha512-Eqkgd3ZJXHE5xovfb+2SzGxzISCjzLsGYSV/uZs2BYVfyIZ0+D2Jx0jOT8j8oVPAlRTCCMAbvoxMKZJZr/WC0Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" clipboard "^2.0.8" -"@abp/core@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.2.1.tgz#9cd7f25dec0b4e654f7998f89c19f3d73169c74a" - integrity sha512-FDOhIPjig3oGxkbadJZzFSC1ZHzgQV4R75fsDNH56lQ9mTyRUPQdg0Y54eCtY7yOSjiJOctOUUWHaxoFG7frGQ== +"@abp/core@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" + integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== dependencies: - "@abp/utils" "~5.2.1" + "@abp/utils" "~5.3.0-rc.1" -"@abp/datatables.net-bs5@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.2.1.tgz#fafc65295d00d5b351404740702f7e56ff1341fe" - integrity sha512-B8lSAeMM9qOwYbDK/Dhp7BX5lFaCpao4RCPcSqgFrye8vlH8bcobmp4tMD23r24y/gRIEuQBcKzp0Lf0OUpLhA== +"@abp/datatables.net-bs5@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" + integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== dependencies: - "@abp/datatables.net" "~5.2.1" + "@abp/datatables.net" "~5.3.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.2.1.tgz#397a3e7db2017c20c082598214478c277b2abec6" - integrity sha512-6Q3+W+d8e4TMAkZr/IdPDQuL1v+tjbS50ChLvrJX/BLb4fBhu1LGJWWKzKJFj721DwIsuQQiM4uq9xX/TjiS0w== +"@abp/datatables.net@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" + integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.2.1.tgz#357785a0366f555b72f76e2b8ee8a2d607aed6fb" - integrity sha512-9fAUdA9QeNRMjp6v8i6EOR480bjB4OzqzriFCKUu4k6VwbA6PxUsJIRFyKIt5UpC12Zqdhpkyj0iG6tE0nRekQ== +"@abp/font-awesome@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" + integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.2.1.tgz#c9cc6ad3997f7fa036d5cd8e0d15923ad7fff790" - integrity sha512-L7uKs7vReOQEETG9xIDq5aXjshbaPa+ZZQcCbn2uwY813e0ErS7Rb1mnowEt/LNEB02AtLet1B4TDVwZUl1uXQ== +"@abp/jquery-form@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" + integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.2.1.tgz#7fdfa3867f61f862ee575114560f79b505649093" - integrity sha512-uZ36D1FfoLdBb6h44fQ3kZuTk4gJ5yzhyOprkgMsGAJDVakX7w/W4V3ThpiEO+iUpNKTboVIhW2QQ0AXK9rrsg== +"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" + integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== dependencies: - "@abp/jquery-validation" "~5.2.1" + "@abp/jquery-validation" "~5.3.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.2.1.tgz#e7fbaa1715af5667559e3b6f0fcb916766b28244" - integrity sha512-Rr/+SWGlXJ53jfysMB/HVNZqsJKCF3rg23ip2Kg6Q+kQTvWVRE3tpkpoBJczOii5tPUk/A/lsJKgRlcsnP0ASw== +"@abp/jquery-validation@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" + integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.2.1.tgz#6b88af5c22fb25d953d38847bcddcf591aeb3228" - integrity sha512-FiIRnDx/gm6JR8QljiulwCc5d8+YC123X0qxMIBI8IY9vznEX+Jk48jYG8fLABnRqKEIYfV8UsYSK8IJx3mcSg== +"@abp/jquery@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" + integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.2.1.tgz#87601162025a4a376e3c335d418636ef2079ad2d" - integrity sha512-ILg3X5tTH2HhJMRmg7BP/r+Kstm/nf+0aNQ2exsJoMMnKE7CC0eYQjpSgrze6GwG3a13eamyTlrz+RrlIm5IBA== +"@abp/lodash@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" + integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.2.1.tgz#72a9e9bb0e7f3a688662c8e9ad52016b9cfa3a17" - integrity sha512-D3KVsba969UBYktdbCxq1JQp4kYZ1S7rIMymDJMBoHByXxwwdeXMkvuphAifBmSYTt3K6bNoZdR0VxtnNlPn2A== +"@abp/luxon@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" + integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.2.1.tgz#8d1b600552607e28a274775ad3bb68ac7cfbba09" - integrity sha512-5mvABMCT7tiwPl1vUK8kriN/SRi2gC4VqkEuxghT7uBQG9Cqh5jhJrl80M9ZK/oQFind3r6+SF8OlfwF8yvxHQ== +"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" + integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.2.1.tgz#86aae6ee4529401da75744f1e43c7cd3c0b494a0" - integrity sha512-YNgcM7Kvmu3hGXJh4B8gl7rLzC28VuZYYP7AVptVSbTz/n6usCo21evG/st8L3vXixuQkvnNpBFgacJnHdSJZQ== +"@abp/prismjs@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0-rc.1.tgz#ee1a49b8bd0af2a29aa7bfb93d22ce07a4edbe70" + integrity sha512-oOnzwUtI6q2u7iE/YWQEULm1I+f7Bo+0tQ9rYlzIoalBRnqN57Zw0VMf5AHq8qjn6GiInehPtU9wsaVTPqXmtw== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/core" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/core" "~5.3.0-rc.1" prismjs "^1.26.0" -"@abp/select2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.2.1.tgz#f52a3c88da52bbfc4b135671064326aebb98b332" - integrity sha512-JH/PqOxhTY05sUyN7of6TNai0W4M3N3OF3Hlwmr8i7hNdYfFwJvQnQzKeKrk/vt8Hv44/JTQDlNKU02BmSBfOQ== +"@abp/select2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" + integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.2.1.tgz#f5ff712b4f7a4cb5a75a754aa4642f099f382e51" - integrity sha512-laaF/5WhYw+hNJRTfMzO93fVhaYqnnOcQTUlkGgsZMe2gwebyX73VI8O8Xw7zXmN1Tu/JwqRI46qiafDrPFTLg== +"@abp/sweetalert2@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" + integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== dependencies: - "@abp/core" "~5.2.1" + "@abp/core" "~5.3.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.2.1.tgz#a410dbf652c0f78f86384e116111aa613458b6de" - integrity sha512-xmgqKEKusB6pcqFhMaz8RTi886ad8RrRMYgMWSw4Zjk1Lr9EqQwKtcE43Ve5XWJamh2Wpk8H7IKLQKHfrV12oA== +"@abp/timeago@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" + integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.2.1.tgz#4ed96a7967d028b8e849ff79b8a0a8a041bb20e4" - integrity sha512-HrnIzvM9LgQdzlmLmvHUVSG4PmWfx9YuozxkFTv+AGa2FAPby5W9hbQ025ry3bPkU9lGWSu/w7JSDqoiL16bPA== +"@abp/toastr@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" + integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== dependencies: - "@abp/jquery" "~5.2.1" + "@abp/jquery" "~5.3.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.2.1.tgz#7c2d20f1bcc8cf9f90c060ed31ed3a114a463064" - integrity sha512-9hxI24aRZCnxCP+WsOoCltSg4YqG9WtW06t9/f6hFO9B0udXIKyV+95Ndipca/R1G94Snx81ifSwAa+DHbFfvQ== +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== dependencies: just-compare "^1.3.0" -"@abp/virtual-file-explorer@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-5.2.1.tgz#3c4021307213c03f061ecdcb969f21ed3320a094" - integrity sha512-Ppg6zqZBOaryJhkr6KPhuwfPW8NypQDaMGXtCN6AY/usNOf91WlSZJ1uyou0rC6qT3N2ZgM6JIIp+nw9K6K0TA== +"@abp/virtual-file-explorer@^5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-5.3.0-rc.1.tgz#20f596d1e36b4f874e55b019ac1ba101cd398b80" + integrity sha512-xZSh+gQvJbVlR8AlLXWX6fvg9zMxWLJRMzB7ZY5g7QfOKalgKWoY0qTD1ugmUtHV2BdqL/2ZEbD4/A4LnBTRIQ== dependencies: - "@abp/clipboard" "~5.2.1" - "@abp/prismjs" "~5.2.1" + "@abp/clipboard" "~5.3.0-rc.1" + "@abp/prismjs" "~5.3.0-rc.1" "@fortawesome/fontawesome-free@^5.15.4": version "5.15.4" diff --git a/npm/lerna.json b/npm/lerna.json index 65e1e1fcbb..dcf65cf2bf 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/lerna.version.json b/npm/ng-packs/lerna.version.json index 4b6e1a83fe..9298c36b87 100644 --- a/npm/ng-packs/lerna.version.json +++ b/npm/ng-packs/lerna.version.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "packages": [ "packages/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index fa198b0a4a..38d37ac91f 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -38,7 +38,7 @@ }, "private": true, "devDependencies": { - "@abp/utils": "~5.2.1", + "@abp/utils": "~5.3.0-rc.1", "@angular-devkit/build-angular": "13.3.5", "@angular-devkit/build-ng-packagr": "^0.1002.0", "@angular-devkit/schematics-cli": "~12.2.0", @@ -57,17 +57,17 @@ "@angular/platform-browser": "13.3.6", "@angular/platform-browser-dynamic": "13.3.6", "@angular/router": "13.3.6", - "@abp/ng.account": "~5.2.1", - "@abp/ng.account.core": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.feature-management": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.permission-management": "~5.2.1", - "@abp/ng.schematics": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.account.core": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.feature-management": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.permission-management": "~5.3.0-rc.1", + "@abp/ng.schematics": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngneat/spectator": "^10.0.0", diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 9a44b1098b..8755b6ca4a 100644 --- a/npm/ng-packs/packages/account-core/package.json +++ b/npm/ng-packs/packages/account-core/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account.core", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0" }, diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 57b6c9c77d..111550d7ab 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account.core": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 6b43da3490..15acda73f0 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.components", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=5.2.1", - "@abp/ng.theme.shared": ">=5.2.1", + "@abp/ng.core": ">=5.3.0-rc.1", + "@abp/ng.theme.shared": ">=5.3.0-rc.1", "@ng-bootstrap/ng-bootstrap": ">=10.0.0" }, "dependencies": { diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 564777912e..7bd3f93c5d 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.core", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~5.2.1", + "@abp/utils": "~5.3.0-rc.1", "angular-oauth2-oidc": "^13.0.1", "just-clone": "^3.2.1", "just-compare": "^1.4.0", diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index 2cbf8f50bd..81c3763ffc 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.feature-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 7c05de9a6f..94e85bbeff 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.identity", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.permission-management": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.permission-management": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 11fee9b967..a11fd3a7ba 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.permission-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 7f6517164f..de74fcd725 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "5.2.1", + "version": "5.3.0-rc.1", "description": "Schematics that works with ABP Backend", "keywords": [ "schematics" diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 5af6cdce19..3528eca556 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.setting-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 9122c79f6c..84d7fcd6eb 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.tenant-management", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.feature-management": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index e40abda535..cea710df2b 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.theme.basic", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account.core": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 3d61bd2036..7b57f7639f 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.theme.shared", - "version": "5.2.1", + "version": "5.3.0-rc.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~5.2.1", + "@abp/ng.core": "~5.3.0-rc.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngx-validate/core": "^0.1.1", diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index 006b9c6a1b..3fc7fbc0be 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -124,6 +124,13 @@ dependencies: just-compare "^1.3.0" +"@abp/utils@~5.3.0-rc.1": + version "5.3.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" + integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== + dependencies: + just-compare "^1.3.0" + "@ampproject/remapping@2.2.0", "@ampproject/remapping@^2.0.0", "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index bfae9b3f64..0f8c7a1a0d 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "anchor-js": "^4.3.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/aspnetcore.components.server.basictheme/package.json b/npm/packs/aspnetcore.components.server.basictheme/package.json index f449a068c8..a2aabb2a01 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~5.2.1" + "@abp/aspnetcore.components.server.theming": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.components.server.theming/package.json b/npm/packs/aspnetcore.components.server.theming/package.json index 055934beac..fdf4b32ce9 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~5.2.1", - "@abp/font-awesome": "~5.2.1" + "@abp/bootstrap": "~5.3.0-rc.1", + "@abp/font-awesome": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index 31a154e12c..9133ccbc63 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index 4ce48a5cd5..6d71cc43b9 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,20 +10,20 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~5.2.1", - "@abp/bootstrap": "~5.2.1", - "@abp/bootstrap-datepicker": "~5.2.1", - "@abp/datatables.net-bs5": "~5.2.1", - "@abp/font-awesome": "~5.2.1", - "@abp/jquery-form": "~5.2.1", - "@abp/jquery-validation-unobtrusive": "~5.2.1", - "@abp/lodash": "~5.2.1", - "@abp/luxon": "~5.2.1", - "@abp/malihu-custom-scrollbar-plugin": "~5.2.1", - "@abp/select2": "~5.2.1", - "@abp/sweetalert2": "~5.2.1", - "@abp/timeago": "~5.2.1", - "@abp/toastr": "~5.2.1" + "@abp/aspnetcore.mvc.ui": "~5.3.0-rc.1", + "@abp/bootstrap": "~5.3.0-rc.1", + "@abp/bootstrap-datepicker": "~5.3.0-rc.1", + "@abp/datatables.net-bs5": "~5.3.0-rc.1", + "@abp/font-awesome": "~5.3.0-rc.1", + "@abp/jquery-form": "~5.3.0-rc.1", + "@abp/jquery-validation-unobtrusive": "~5.3.0-rc.1", + "@abp/lodash": "~5.3.0-rc.1", + "@abp/luxon": "~5.3.0-rc.1", + "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.1", + "@abp/select2": "~5.3.0-rc.1", + "@abp/sweetalert2": "~5.3.0-rc.1", + "@abp/timeago": "~5.3.0-rc.1", + "@abp/toastr": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index 9147176dd2..8fe679a6b6 100644 --- a/npm/packs/aspnetcore.mvc.ui/package-lock.json +++ b/npm/packs/aspnetcore.mvc.ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "@abp/aspnetcore.mvc.ui", - "version": "5.2.1", + "version": "5.3.0-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index 9a9809573d..523e0bd759 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index 58360f41e4..c01b119249 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.2.1", - "@abp/owl.carousel": "~5.2.1", - "@abp/prismjs": "~5.2.1", - "@abp/tui-editor": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0-rc.1", + "@abp/owl.carousel": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1", + "@abp/tui-editor": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 414748fc4f..63b9cc45d2 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 07b88bf56e..92c7777842 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "bootstrap": "^5.1.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 393c7a0fc3..ae94c81890 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index 2197d7ac9b..9ca832f804 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "clipboard": "^2.0.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index 17d676756d..8568d81252 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,15 +1,15 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jstree": "~5.2.1", - "@abp/slugify": "~5.2.1", - "@abp/tui-editor": "~5.2.1", - "@abp/uppy": "~5.2.1", - "@abp/codemirror": "~5.2.1" + "@abp/codemirror": "~5.3.0-rc.1", + "@abp/jstree": "~5.3.0-rc.1", + "@abp/slugify": "~5.3.0-rc.1", + "@abp/tui-editor": "~5.3.0-rc.1", + "@abp/uppy": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit.public/package.json b/npm/packs/cms-kit.public/package.json index b16a5f322f..4a53341291 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~5.2.1", - "@abp/star-rating-svg": "~5.2.1" + "@abp/highlight.js": "~5.3.0-rc.1", + "@abp/star-rating-svg": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index 90d02d96fa..8b4bb7d2f6 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~5.2.1", - "@abp/cms-kit.public": "~5.2.1" + "@abp/cms-kit.admin": "~5.3.0-rc.1", + "@abp/cms-kit.public": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index c9d5c77fdc..24f4f0b3c1 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 8a82924f24..9c30a65869 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~5.2.1" + "@abp/utils": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index ab4b7fd4f5..d6b822e95c 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "cropperjs": "^1.5.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index a6628e6c28..7faba34e17 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.2.1", + "@abp/datatables.net": "~5.3.0-rc.1", "datatables.net-bs4": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs5/package.json b/npm/packs/datatables.net-bs5/package.json index 9599f3f3fb..e9a0dbaad6 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.2.1", + "@abp/datatables.net": "~5.3.0-rc.1", "datatables.net-bs5": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index 05ab5a041f..5d73dc54b4 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "datatables.net": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 42181c3fb4..fabbfac295 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~5.2.1", - "@abp/clipboard": "~5.2.1", - "@abp/malihu-custom-scrollbar-plugin": "~5.2.1", - "@abp/popper.js": "~5.2.1", - "@abp/prismjs": "~5.2.1" + "@abp/anchor-js": "~5.3.0-rc.1", + "@abp/clipboard": "~5.3.0-rc.1", + "@abp/malihu-custom-scrollbar-plugin": "~5.3.0-rc.1", + "@abp/popper.js": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index cd90d02ce5..c75915fbd0 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/flag-icon-css", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index f34d2a867a..0aaf358dce 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@fortawesome/fontawesome-free": "^5.15.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index fce1c0e212..58ed646b2c 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@highlightjs/cdn-assets": "~11.4.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index 30384f80f9..7e03aa0d2a 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "jquery-form": "^4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index e71325e186..511f0208c8 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~5.2.1", + "@abp/jquery-validation": "~5.3.0-rc.1", "jquery-validation-unobtrusive": "^3.2.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index 13154cfbcb..149c739724 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "jquery-validation": "^1.19.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index bb6780647f..01ee351f99 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "jquery": "~3.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index 2dd6eae521..76c20d13e4 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "jstree": "^3.3.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index 3e8a5473ca..0119cf2400 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 89d57e2360..8ede864304 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "luxon": "^2.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index 665fc7b624..ba67d422a4 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "malihu-custom-scrollbar-plugin": "^3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index f737132f50..afe3f1867e 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "markdown-it": "^12.3.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 64d5bc8e6e..b1e0936283 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 55ef39b872..96e20b7ba8 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@popperjs/core": "^2.11.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 6b48d7e709..e743511f73 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.2.1", - "@abp/core": "~5.2.1", + "@abp/clipboard": "~5.3.0-rc.1", + "@abp/core": "~5.3.0-rc.1", "prismjs": "^1.26.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 86fb70e7a9..1cc32ccd85 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 9db6bd9df1..dc8e9f3684 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "@microsoft/signalr": "~6.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 3bccf0b808..22b7620f32 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/slugify", "publishConfig": { "access": "public" diff --git a/npm/packs/star-rating-svg/package.json b/npm/packs/star-rating-svg/package.json index 1a458a374e..7febb9673e 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index 7373282e71..fb5348cc96 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "sweetalert2": "^11.3.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index d8a3016057..d59a99dff4 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index c3acb8cefd..9817fb0fa1 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", + "@abp/jquery": "~5.3.0-rc.1", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index b229a31256..7399669232 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.2.1", - "@abp/prismjs": "~5.2.1" + "@abp/jquery": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index ffe8b4080a..afbd3a30cb 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.2.1", + "@abp/core": "~5.3.0-rc.1", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index d03f9bd89f..f3641292a1 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "5.2.1", + "version": "5.3.0-rc.1", "scripts": { "prepublishOnly": "yarn install --ignore-scripts && node prepublish.js", "ng": "ng", diff --git a/npm/packs/vee-validate/package.json b/npm/packs/vee-validate/package.json index 2dc5a68b53..bbcf3bc98f 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~5.2.1", + "@abp/vue": "~5.3.0-rc.1", "vee-validate": "~3.4.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/virtual-file-explorer/package.json b/npm/packs/virtual-file-explorer/package.json index a4b0bd8b85..46fc05cb8f 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.2.1", - "@abp/prismjs": "~5.2.1" + "@abp/clipboard": "~5.3.0-rc.1", + "@abp/prismjs": "~5.3.0-rc.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 2e9144b3e5..012c855712 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "5.2.1", + "version": "5.3.0-rc.1", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index 6fdafdd93a..c9c1f95ef6 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.1", - "@abp/ng.components": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/animations": "~13.1.1", "@angular/common": "~13.1.1", "@angular/compiler": "~13.1.1", @@ -34,7 +34,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.2.1", + "@abp/ng.schematics": "~5.3.0-rc.1", "@angular-devkit/build-angular": "~13.1.2", "@angular-eslint/builder": "~13.0.1", "@angular-eslint/eslint-plugin": "~13.0.1", diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json index b99280b230..b7d47de013 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json index b99280b230..b7d47de013 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json index 8bad0a8f1d..7c51cc96bc 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "~5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json index 8bad0a8f1d..7c51cc96bc 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "~5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index cdddc9c658..2cc214007f 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.1", - "@abp/ng.components": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/animations": "~13.3.3", "@angular/common": "~13.3.3", "@angular/compiler": "~13.3.3", @@ -34,7 +34,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.2.1", + "@abp/ng.schematics": "~5.3.0-rc.1", "@angular-devkit/build-angular": "~13.3.3", "@angular-eslint/builder": "~13.2.1", "@angular-eslint/eslint-plugin": "~13.2.1", diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json index b99280b230..b7d47de013 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json index b99280b230..b7d47de013 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json index 44e817e13e..09b98ca204 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 05f715c7c2..238087df41 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -15,14 +15,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.1", - "@abp/ng.components": "~5.2.1", - "@abp/ng.core": "~5.2.1", - "@abp/ng.identity": "~5.2.1", - "@abp/ng.setting-management": "~5.2.1", - "@abp/ng.tenant-management": "~5.2.1", - "@abp/ng.theme.basic": "~5.2.1", - "@abp/ng.theme.shared": "~5.2.1", + "@abp/ng.account": "~5.3.0-rc.1", + "@abp/ng.components": "~5.3.0-rc.1", + "@abp/ng.core": "~5.3.0-rc.1", + "@abp/ng.identity": "~5.3.0-rc.1", + "@abp/ng.setting-management": "~5.3.0-rc.1", + "@abp/ng.tenant-management": "~5.3.0-rc.1", + "@abp/ng.theme.basic": "~5.3.0-rc.1", + "@abp/ng.theme.shared": "~5.3.0-rc.1", "@angular/animations": "~13.3.3", "@angular/common": "~13.3.3", "@angular/compiler": "~13.3.3", @@ -37,7 +37,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.2.1", + "@abp/ng.schematics": "~5.3.0-rc.1", "@angular-devkit/build-angular": "~13.3.3", "@angular-eslint/builder": "~13.2.1", "@angular-eslint/eslint-plugin": "~13.2.1", diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index 0bfada49ae..e446c98dd0 100644 --- a/templates/module/angular/projects/my-project-name/package.json +++ b/templates/module/angular/projects/my-project-name/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": ">=9", "@angular/core": ">=9", - "@abp/ng.core": ">=5.2.1", - "@abp/ng.theme.shared": ">=5.2.1" + "@abp/ng.core": ">=5.3.0-rc.1", + "@abp/ng.theme.shared": ">=5.3.0-rc.1" }, "dependencies": { "tslib": "^2.1.0" diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json index b99280b230..b7d47de013 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1", - "@abp/aspnetcore.components.server.basictheme": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1", + "@abp/aspnetcore.components.server.basictheme": "^5.3.0-rc.1" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json index 44e817e13e..09b98ca204 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json index 0448d7be40..0f2145759f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.2.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0-rc.1" } } \ No newline at end of file From a7e47f9ed1cab354284220b6fdac10136eb66a53 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Fri, 6 May 2022 09:28:34 +0300 Subject: [PATCH 238/242] update auto pr base branch --- .github/workflows/auto-pr.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index c62896d948..084b0977d0 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,24 +1,24 @@ -name: Merge branch rel-5.3 with rel-5.2 +name: Merge branch dev with rel-5.3 on: push: branches: - - rel-5.2 + - rel-5.3 jobs: merge-rel-5-3-with-rel-5-2: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: - ref: rel-5.3 + ref: dev - name: Reset promotion branch run: | - git fetch origin rel-5.2:rel-5.2 - git reset --hard rel-5.2 + git fetch origin rel-5.3:rel-5.3 + git reset --hard rel-5.3 - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: - branch: auto-merge/rel-5-2/${{github.run_number}} - title: Merge branch rel-5.3 with rel-5.2 - body: This PR generated automatically to merge rel-5.3 with rel-5.2. Please review the changed files before merging to prevent any errors that may occur. + branch: auto-merge/rel-5-3/${{github.run_number}} + title: Merge branch dev with rel-5.3 + body: This PR generated automatically to merge dev with rel-5.3. Please review the changed files before merging to prevent any errors that may occur. reviewers: ${{github.actor}} token: ${{ github.token }} From 6d1c5cdeeb5912977c5db8a7c3b4a90fbe863c5f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 6 May 2022 17:20:09 +0800 Subject: [PATCH 239/242] Feature modal improvement --- .../Components/FeatureManagementModal.razor | 92 ++++++++++--------- .../FeatureManagementModal.cshtml | 6 +- ...tingManagementFeatureDefinitionProvider.cs | 15 +++ 3 files changed, 67 insertions(+), 46 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor index 1feaf59202..8bc5e9dfe7 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor @@ -6,7 +6,7 @@ @L["Features"] - + @if (Groups == null || !Groups.Any()) @@ -33,55 +33,61 @@
    @foreach (var feature in Groups[index].Features) { - var disabled = IsDisabled(feature.Provider.Name); +
    + @{ + var disabled = IsDisabled(feature.Provider.Name); - if (feature.ValueType is FreeTextStringValueType) - { - - @feature.DisplayName - - @if (feature.Description != null) + if (feature.ValueType is FreeTextStringValueType) { -
    @feature.Description
    + + @feature.DisplayName + + @if (feature.Description != null) + { +
    @feature.Description
    + } +
    } -
    - } - if (feature.ValueType is SelectionStringValueType) - { - var items = ((SelectionStringValueType) feature.ValueType).ItemSource.Items; - - - @feature.DisplayName - - @if (feature.Description != null) + if (feature.ValueType is SelectionStringValueType) { -
    @feature.Description
    + var items = ((SelectionStringValueType) feature.ValueType).ItemSource.Items; + + + @feature.DisplayName + + @if (feature.Description != null) + { +
    @feature.Description
    + } +
    } -
    - } - if (feature.ValueType is ToggleStringValueType) - { - - @feature.DisplayName - - @if (feature.Description != null) - { -
    @feature.Description
    + if (feature.ValueType is ToggleStringValueType) + { + + + @feature.DisplayName + + @if (feature.Description != null) + { +
    @feature.Description
    + } +
    + } } - } +
    } @@ -95,4 +101,4 @@
    - + \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index 167de4943f..d537b099c4 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -58,7 +58,7 @@ group-style="margin-left: @(feature.Depth * 20)px"/> @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    } } @@ -81,7 +81,7 @@ group-style="margin-left: @(feature.Depth * 25)px"/> @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    } } @@ -105,7 +105,7 @@ @if (feature.Description != null) { -
    @feature.Description
    +
    @feature.Description
    }
    } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs index 23f0c071fd..9f27dd2c60 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs @@ -18,6 +18,13 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:SettingManagementEnable"), L("Feature:SettingManagementEnableDescription"), new ToggleStringValueType()); + + group.AddFeature( + "MaxNumber", + "", + L("Max number"), + new FixedLocalizableString("Test feature max number"), + new FreeTextStringValueType()); settingEnableFeature.CreateChild( SettingManagementFeatures.AllowTenantsToChangeEmailSettings, @@ -26,6 +33,14 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:AllowTenantsToChangeEmailSettingsDescription"), new ToggleStringValueType(), isAvailableToHost: false); + + settingEnableFeature.CreateChild( + "MinNumber", + "", + L("Min number"), + new FixedLocalizableString("Test feature min number"), + new FreeTextStringValueType(), + isAvailableToHost: false); } private static LocalizableString L(string name) From b43f36ad6f4319ecb8e23738044cc683fc951776 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 6 May 2022 21:02:16 +0800 Subject: [PATCH 240/242] Update SettingManagementFeatureDefinitionProvider --- .../SettingManagementFeatureDefinitionProvider.cs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs index 9f27dd2c60..23f0c071fd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs @@ -18,13 +18,6 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:SettingManagementEnable"), L("Feature:SettingManagementEnableDescription"), new ToggleStringValueType()); - - group.AddFeature( - "MaxNumber", - "", - L("Max number"), - new FixedLocalizableString("Test feature max number"), - new FreeTextStringValueType()); settingEnableFeature.CreateChild( SettingManagementFeatures.AllowTenantsToChangeEmailSettings, @@ -33,14 +26,6 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi L("Feature:AllowTenantsToChangeEmailSettingsDescription"), new ToggleStringValueType(), isAvailableToHost: false); - - settingEnableFeature.CreateChild( - "MinNumber", - "", - L("Min number"), - new FixedLocalizableString("Test feature min number"), - new FreeTextStringValueType(), - isAvailableToHost: false); } private static LocalizableString L(string name) From 02a7aa1f3dc75a5b44fe3017f1ce1f2ecb94c04a Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 9 May 2022 08:13:20 +0300 Subject: [PATCH 241/242] Update docs-nav.json --- docs/en/docs-nav.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 7d919cf063..7a2f606296 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -822,7 +822,7 @@ "path": "UI/Blazor/Basic-Theme.md" }, { - "text": "The Basic Theme", + "text": "LeptonX Lite", "path": "Themes/LeptonXLite/blazor.md" }, { From 3c62a7f1ce1a7a5d2cc8da174e083e42d4526a03 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 9 May 2022 14:09:31 +0800 Subject: [PATCH 242/242] Fix migrate-database.ps1 file --- templates/app-nolayers/aspnet-core/migrate-database.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app-nolayers/aspnet-core/migrate-database.ps1 b/templates/app-nolayers/aspnet-core/migrate-database.ps1 index 3af47fcb21..5bdfdc04b2 100644 --- a/templates/app-nolayers/aspnet-core/migrate-database.ps1 +++ b/templates/app-nolayers/aspnet-core/migrate-database.ps1 @@ -1 +1 @@ -dotnet run --migrate-database \ No newline at end of file +dotnet run --project MyCompanyName.MyProjectName --migrate-database \ No newline at end of file