Roadmap
|
WackoWiki is a non-commercial, all volunteer, Open Source project, and as such there is no formal list of feature requirements required for development. That said, there is an informal list of items that have been agreed upon by the WackoWiki developers as things that need to worked upon, known as the TODO list. Items on the list can be marked as completed in development, "claimed" by a developer and being actively worked on, or unmarked meaning that the item is likely not being actively worked on. Team members work on WackoWiki when they want to at their own speed. The following features are planned to be implemented in a future version: |
|
R6.3
- improve WikiEdit
- rewrite and reimplementation of WackoFormatter
- Deprecate (Full)DiffEngine and replace with https://github.com/sebastianbergmann/diff
- archive table
R7
- treads in comments
- extended & normalized ACLs
- refactoring
- we load too much code that we don't really need, the code needs restructuring to improve
- Move items not related to the core of the wiki out of class/wacko.php (ie. Forms, Users, DB, Referrers, Comments, etc.). The core should only be for loading actions, handlers, formatters, etc. All of these items should be offloaded into autoloading plugins. (?)
- we load too much code that we don't really need, the code needs restructuring to improve
- ...
- Media Revisions
┌─────────────────────────────────────────────────────────────┐ │ Layer 0 — Bootstrap (request bookends) │ │ Bootstrap, Teardown, Autoloader, ErrorReporter, │ │ Environment, OutputBuffer, RequestNormalizer, │ │ ShutdownManager, DebugGate │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 1 — HTTP boundary │ │ Request, Response, Headers, IpResolver, TlsProbe, │ │ RequestUri, BaseUrlResolver, CookiePrefix, │ │ CookieManager, HeaderPolicy (Csp, Hsts, …), │ │ ResponseSender, StaticFileResponse, OutputBuffer, │ │ GzipCompressor │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 2 — Routing │ │ Router, Route, ConfigLoader, ConfigRule, RuleAction, │ │ VariableSubstituter, SuperGlobalPatcher, HashidsResolver, │ │ Operators/* (13 operator classes) │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 3 — Session │ │ SessionManager, CookieManager, NonceStore, NonceCrypto, │ │ HijackDetector, DefaultHijackDetector, UserAgentFingerprint│ │ IpBinding, TlsBinding, SessionStoreInterface, │ │ FileSessionStore, DbalSessionStore, SessionStoreFactory, │ │ FlashData, Message, CacheLimiter │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 4 — Persistence (Repositories) │ │ Database, Connection, ConnectionFactory, │ │ DatabaseInterface, DriverInterface, │ │ PdoDriver, MysqliDriver, SqliteDriver, │ │ Dialect (interface), MysqlDialect, SqliteDialect, │ │ SqlCache, Query, QueryResult │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 5 — Domain (Pages, Files, Users, ACL, Notify, Menu) │ │ Page (value object), PageId, Tag, Section, │ │ PageRepositoryInterface, DbPageRepository, │ │ PageService, SectionService, │ │ File (value object), FileRepositoryInterface, │ │ FileService, ThumbnailService, ImageSizer, │ │ User (value object), UserSetting (enum), │ │ UserRepositoryInterface, AuthService, PasswordPolicy, │ │ AccessResolver, AclList, AclRepositoryInterface, │ │ Notifier, EmailTransport, WatchService, │ │ MenuService, Menu, MenuItem │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 6 — Wikitext Rendering │ │ WikitextFormatter, WikitextParser, TokenType (enum), │ │ Token, FormatContext, TokenRendererInterface + 25 classes,│ │ AttributeEscaper, HtmlSanitizer, HeaderCounter, │ │ FootnoteRegistry, PostWackoFormatter, ParagraficaFormatter│ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 7 — Templating │ │ TemplateEngine, Compiler, Parser, │ │ TagParser, SplitTag, PatternDefinition, │ │ CompiledTemplate, TemplateCacheInterface, │ │ TemplateRenderer, PatternRenderer, │ │ PullFunctionRegistry, FilterRegistry, EscapeFilter, │ │ FilterInterface, SetResolver, AssignOperation, │ │ RenderContext │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 8 — Output (Feeds, Email) │ │ FeedGenerator, RssFormatter, SitemapFormatter, │ │ OpenSearchFormatter, FeedWriter, FeedSourceInterface, │ │ XmlEscaper, XmlBuilder, │ │ EmailTransport, EmailMessage, EmailAddress, EmailResult, │ │ EmailHeader, PhpMailerTransport, NullTransport, │ │ SmtpConfig, MailConfig, SendmailConfig │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 9 — Cross-Cutting │ │ Config (value object), ConfigStore, ConfigBootstrap, │ │ BaseUrlResolver, CookiePrefix, SiteLock, │ │ Logger, Tracer, MetricsCollector, │ │ DebugGate, DebugDisclosure, DebugConsole │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Layer 10 — Utilities │ │ Text, Encoding, Random, Path, TypeCheck, │ │ Bytes, DateFormatter, TagParser, │ │ Crypto, Serializer │ └─────────────────────────────────────────────────────────────┘
Phase 0 (tests) — must complete first
│
├── Phase 1 (Ut) — must complete before most others
│
├── Phase 2 (Templatest) — can run in parallel with Phase 3
│
├── Phase 3 (Settings + Database)
│ │
│ ├── Phase 4 (Session) — depends on Phase 3
│ │
│ ├── Phase 5 (Http) — depends on Phase 3, 4
│ │ │
│ │ ├── Phase 6 (Routing) — depends on Phase 5
│ │ │
│ │ └── Phase 9 (Bootstrap/Teardown) — depends on Phase 5, 6
│ │
│ └── Phase 8 (Email + Feed) — depends on Phase 3, 5
│
├── Phase 7 (WikitextFormatter) — can run in parallel with Phase 4-6
│
└── Phase 10 (Diag) — depends on Phase 5
│
└── Phase 11 (Wacko slimming) — depends on ALL ABOVE
│
└── Phase 12 (Wacko removal) — depends on Phase 11
src/
├── Action/ # Phase 11.14a
├── Config/ # Phase 3
│ ├── Config.php (immutable VO)
│ ├── ConfigStore.php (mutable internal)
│ ├── ConfigBootstrap.php (cascade loader)
│ ├── ConfigInterface.php
│ ├── SiteLock.php
│ ├── BaseUrlResolver.php
│ ├── CookiePrefix.php
│ └── ConfigException.php
├── Database/ # Phase 3
│ ├── Database.php
│ ├── DatabaseInterface.php
│ ├── Connection.php
│ ├── ConnectionConfig.php
│ ├── ConnectionFactory.php
│ ├── SqlCache.php
│ ├── Adapter/DbalAdapter.php
│ ├── Dialect/
│ │ ├── Dialect.php
│ │ ├── MysqlDialect.php
│ │ └── SqliteDialect.php
│ ├── Driver/
│ │ ├── DriverInterface.php
│ │ ├── PdoDriver.php
│ │ ├── MysqliDriver.php
│ │ └── SqliteDriver.php
│ └── Exception/
├── Engine/ # Phase 9
│ ├── App.php (front controller)
│ ├── Bootstrap.php
│ ├── Teardown.php
│ ├── Autoloader.php
│ ├── ErrorReporter.php
│ ├── Environment.php
│ ├── OutputBuffer.php
│ ├── RequestNormalizer.php
│ ├── ShutdownManager.php
│ └── Debug/
│ ├── DebugGate.php
│ ├── DebugDisclosure.php
│ └── DebugConsole.php
├── Exception/ # Base exception classes
├── Handler/ # Phase 11.14b
├── Http/ # Phase 5
│ ├── Request.php (immutable VO)
│ ├── Headers.php
│ ├── Response.php (value object)
│ ├── ResponseSender.php
│ ├── Redirect.php
│ ├── StaticFileResponse.php
│ ├── Request/
│ │ ├── IpResolver/
│ │ │ ├── IpResolverInterface.php
│ │ │ ├── DirectIpResolver.php
│ │ │ └── ReverseProxyIpResolver.php
│ │ ├── TlsProbe.php
│ │ ├── TlsMark.php
│ │ └── RequestUri.php
│ ├── HeaderPolicy/
│ │ ├── HeaderPolicy.php
│ │ ├── CspHeader.php
│ │ ├── HstsHeader.php
│ │ ├── PermissionsPolicyHeader.php
│ │ └── ReferrerPolicyHeader.php
│ ├── Caching/
│ │ ├── PageCache.php
│ │ ├── MimeTypeCache.php
│ │ ├── CacheStoreInterface.php
│ │ └── FilesystemCacheStore.php
│ ├── Output/
│ │ ├── OutputBuffer.php
│ │ └── GzipCompressor.php
│ ├── Session/
│ │ └── SessionBootstrap.php
│ └── Language/
│ ├── LanguageNegotiator.php
│ └── LanguageRegistry.php
├── I18n/ # Phase 11.14g
├── Link/ # Phase 11.14i
├── Maintenance/ # Phase 11.14ad
├── Menu/ # Phase 11.14o
├── Notify/
│ ├── Notifier.php # Phase 11.14m
│ ├── WatchService.php
│ └── Email/ # Phase 8
│ ├── EmailTransport.php (interface)
│ ├── EmailMessage.php (immutable VO)
│ ├── EmailAddress.php (immutable VO)
│ ├── EmailResult.php (immutable VO)
│ ├── EmailHeader.php (immutable VO)
│ ├── NullTransport.php
│ ├── PhpMailerTransport.php
│ ├── SmtpConfig.php (immutable VO)
│ ├── MailConfig.php (immutable VO)
│ ├── SendmailConfig.php (immutable VO)
│ ├── EmailTransportFactory.php
│ └── Exception/
├── Observability/ # Phase 10
│ ├── Logger.php
│ ├── Tracer.php
│ ├── MetricsCollector.php
│ ├── LogLevel.php (enum)
│ ├── LogRecord.php (immutable VO)
│ ├── LogSink.php (interface)
│ ├── Sink/
│ │ ├── DatabaseLogSink.php
│ │ └── StderrJsonSink.php
│ └── Debug/
│ ├── DebugDisclosure.php
│ └── DebugConsole.php
├── Page/ # Phase 11.14l, 14k, 14ag
│ ├── Page.php (value object)
│ ├── Tag.php (value object)
│ ├── Section.php (value object)
│ ├── Service/
│ │ └── PageService.php
│ ├── Repository/
│ │ ├── PageRepositoryInterface.php
│ │ └── DbPageRepository.php
│ ├── Comment/Service/CommentService.php
│ ├── Revision/Service/RevisionService.php
│ └── Bookmark/Service/BookmarkService.php
├── Render/ # Phase 11.14t
│ ├── FormRenderer.php
│ ├── CaptchaRenderer.php
│ ├── PaginationBuilder.php
│ └── TocService.php
├── Routing/ # Phase 6
│ ├── RouterInterface.php
│ ├── Router.php
│ ├── Route.php (immutable VO)
│ ├── ConfigLoader.php
│ ├── ConfigRule.php
│ ├── RuleAction.php
│ ├── VariableSubstituter.php
│ ├── SuperGlobalPatcher.php
│ ├── HashidsResolver.php
│ └── Operators/ (13 operator classes)
│ ├── OperatorInterface.php
│ ├── AssignOperator.php
│ ├── AssignIfUnsetOperator.php
│ ├── ForceAssignOperator.php
│ ├── UnsetOperator.php
│ ├── IssetOperator.php
│ ├── MatchOperator.php
│ ├── MatchNotOperator.php
│ ├── EqualOperator.php
│ ├── NotEqualOperator.php
│ ├── LessOperator.php
│ ├── GreaterOperator.php
│ ├── LessEqualOperator.php
│ └── GreaterEqualOperator.php
├── Session/ # Phase 4
│ ├── SessionManager.php
│ ├── SessionManagerInterface.php
│ ├── Cookie/
│ │ ├── CookieManager.php
│ │ ├── CookieAttributes.php (immutable VO)
│ │ └── CookieScope.php (enum)
│ ├── Nonce/
│ │ ├── NonceStore.php
│ │ ├── NonceIndex.php (immutable VO)
│ │ └── NonceCrypto.php
│ ├── Hijack/
│ │ ├── HijackDetectorInterface.php
│ │ ├── DefaultHijackDetector.php
│ │ ├── UserAgentFingerprint.php
│ │ ├── IpBinding.php
│ │ └── TlsBinding.php
│ ├── Store/
│ │ ├── SessionStoreInterface.php
│ │ ├── FileSessionStore.php
│ │ ├── DbalSessionStore.php
│ │ └── SessionStoreFactory.php
│ ├── Flash/
│ │ ├── FlashData.php
│ │ └── Message.php (immutable VO)
│ ├── State/
│ │ ├── SessionState.php (immutable VO)
│ │ └── RequestContext.php (immutable VO)
│ ├── User/
│ │ └── UserSession.php (immutable VO)
│ ├── Navigation/
│ │ └── NavigationState.php
│ └── Exception/
├── Templating/ # Phase 2
│ ├── TemplateEngine.php
│ ├── TemplateEngineInterface.php
│ ├── Compiler/
│ │ ├── Compiler.php
│ │ ├── CompilerInterface.php
│ │ └── CompileException.php
│ ├── Parser/
│ │ ├── WikitextParser.php
│ │ ├── PatternDefinitionParser.php
│ │ ├── TagParser.php
│ │ ├── SplitTag.php
│ │ └── ParseException.php
│ ├── Store/
│ │ ├── CompiledTemplate.php (immutable VO)
│ │ ├── TemplateCacheInterface.php
│ │ ├── TemplateCacheKey.php
│ │ ├── FilesystemTemplateStore.php
│ │ └── CacheException.php
│ ├── Rendering/
│ │ ├── TemplateRenderer.php
│ │ ├── RendererInterface.php
│ │ ├── PatternRenderer.php
│ │ ├── RenderContext.php (per-request state)
│ │ └── RenderException.php
│ ├── State/
│ │ ├── HeaderCounter.php
│ │ ├── FootnoteRegistry.php
│ │ └── FormatStateException.php
│ ├── Set/
│ │ ├── SetResolver.php
│ │ ├── AssignOperation.php
│ │ └── PatchOperation.php
│ ├── Filter/
│ │ ├── FilterInterface.php
│ │ ├── FilterRegistry.php
│ │ ├── EscapeFilter.php
│ │ ├── DateFilter.php
│ │ ├── NumberFilter.php
│ │ ├── JsonFilter.php
│ │ ├── TextFilter.php
│ │ ├── RegexFilter.php
│ │ └── FilterException.php
│ ├── Pull/
│ │ ├── PullFunctionRegistry.php
│ │ └── PullException.php
│ └── Exception/
├── Trash/ # Phase 11.14ah
│ └── TrashService.php
├── Trail/ # Phase 11.14aa
│ └── TrailService.php
├── User/ # Phase 11.14n, 14z
│ ├── User.php (value object)
│ ├── UserSetting.php (enum)
│ ├── UserRepository.php
│ ├── UserRepositoryInterface.php
│ ├── Service/
│ │ ├── AuthService.php
│ │ └── UserService.php
│ └── Exception/
├── Util/ # Phase 1
│ ├── Text.php
│ ├── Encoding.php
│ ├── Path.php
│ ├── TypeCheck.php
│ ├── DateFormatter.php
│ ├── TagParser.php
│ ├── Debug.php
│ ├── Serializer.php
│ └── ByteFormatter.php
├── Feed/ # Phase 8
│ ├── FeedGenerator.php
│ ├── FeedGeneratorInterface.php
│ ├── Config/
│ │ ├── FeedConfig.php (immutable VO)
│ │ └── FeedKind.php (enum)
│ ├── Source/
│ │ ├── FeedSourceInterface.php
│ │ ├── ChangesFeedSource.php
│ │ ├── NewsFeedSource.php
│ │ ├── CommentsFeedSource.php
│ │ └── SitemapFeedSource.php
│ ├── Renderer/
│ │ ├── RssFormatter.php
│ │ ├── RssItem.php (immutable VO)
│ │ ├── SitemapFormatter.php
│ │ ├── SitemapUrl.php (immutable VO)
│ │ ├── OpenSearchFormatter.php
│ │ ├── FeedWriter.php
│ │ ├── FeedWriterInterface.php
│ │ └── FeedResult.php (immutable VO)
│ ├── Xml/
│ │ ├── XmlEscaper.php
│ │ ├── XmlBuilder.php
│ │ └── XmlException.php
│ └── Exception/
├── Wiki/ # Phase 7
│ ├── WikitextFormatter.php
│ ├── WikitextFormatterInterface.php
│ ├── FormatterKind.php (enum)
│ ├── Parser/
│ │ ├── WikitextParser.php
│ │ ├── Token.php (immutable VO)
│ │ └── TokenType.php (enum)
│ ├── TokenRenderer/
│ │ ├── TokenRendererInterface.php
│ │ ├── BoldTokenRenderer.php
│ │ ├── ItalicTokenRenderer.php
│ │ ├── UnderlineTokenRenderer.php
│ │ ├── CodeTokenRenderer.php
│ │ ├── StrikethroughTokenRenderer.php
│ │ ├── MarkTokenRenderer.php
│ │ ├── CiteTokenRenderer.php
│ │ ├── HeaderTokenRenderer.php
│ │ ├── ListTokenRenderer.php
│ │ ├── IndentTokenRenderer.php
│ │ ├── QuoteTokenRenderer.php
│ │ ├── BlockQuoteTokenRenderer.php
│ │ ├── DefinitionTokenRenderer.php
│ │ ├── FootnoteTokenRenderer.php
│ │ ├── ForcedLinkTokenRenderer.php
│ │ ├── UrlTokenRenderer.php
│ │ ├── ImageTokenRenderer.php
│ │ ├── AudioTokenRenderer.php
│ │ ├── VideoTokenRenderer.php
│ │ ├── InterWikiTokenRenderer.php
│ │ ├── WikiLinkTokenRenderer.php
│ │ ├── FileLinkTokenRenderer.php
│ │ ├── LanPathTokenRenderer.php
│ │ ├── TableTokenRenderer.php
│ │ ├── TableRowRenderer.php
│ │ ├── TableColumnRenderer.php
│ │ ├── TableCaptionRenderer.php
│ │ ├── TableAttributeBuilder.php
│ │ └── DiffInsertionRenderer.php
│ ├── State/
│ │ ├── FormatContext.php
│ │ ├── HeaderCounter.php
│ │ └── FootnoteRegistry.php
│ ├── Security/
│ │ ├── AttributeEscaper.php
│ │ └── HtmlSanitizer.php
│ ├── Postprocess/
│ │ └── PostWackoFormatter.php
│ └── Exception/
└── Access/ # Phase 3 + 11.14j
├── Privilege.php (enum)
├── AccessMode.php (enum)
├── AclList.php (immutable VO)
├── AccessResolver.php
├── AclRepositoryInterface.php
├── AclRepository.php
└── Exception/
Unscheduled
- add support for Prepared Statements
- PostgreSQL support
- federation
- Local-first software
- private messages (privacy: no outbound messages)
- Referential integrity
- improve WackoFormatter