Giter Club home page Giter Club logo

todo_app's Introduction

๐Ÿ“˜TodoApp

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ์•ผ๊ณฐ์•„์นดํ…Œ๋ฏธ์˜ ios-project-managerํ”„๋กœ์ ํŠธ๋ฅผ iPhone ๋ฒ„์ „์œผ๋กœ ๋ฆฌ๋ฉ”์ดํฌํ•œ ํ”„๋กœ์ ํŠธ ์ž…๋‹ˆ๋‹ค.

iPad ๋ฒ„์ „์˜ ํ”„๋กœ์ ํŠธ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Local DB Remote DB UI Reactive Layout
Realm Firebase RxCocoa RxSwift SnapKit

๊ตฌ์กฐ

MVVM-C Clean Architecture

๊ธฐ๋ณธ์ ์œผ๋กœ RxSwift๋ฅผ ์ด์šฉํ•œ MVVM๊ตฌ์กฐ์— ์ถ”๊ฐ€์ ์œผ๋กœ CoordinatorํŒจํ„ด๊ณผ DIContainerํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด ์ „ํ™˜๋ฐ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ Clean Architecture๋ฅผ ์ฑ„ํƒํ•˜์—ฌ, ๊ฐ ๊ณ„์ธต์˜ ์œ ์—ฐํ•œ ์ˆ˜์ •๋ฐ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์˜€์œผ๋ฉฐ, protocol๋ฅผ ์ด์šฉํ•ด SOLID ์›์น™์„ ์ง€ํ‚ด๊ณผ ๋™์‹œ์— Testable ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โ”œโ”€โ”€ CustomUIKit
โ”‚ย ย  โ”œโ”€โ”€ CustomUIKit
โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CustomUIHeaderView.swift
โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CustomUIKit.docc
โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ CustomUIKit.md
โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CustomUIKit.h
โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CustomUISegmentControl.swift
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ CustomUITableView.swift
โ”‚ย ย  โ”œโ”€โ”€ CustomUIKit.xcodeproj
โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ project.pbxproj
โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ project.xcworkspace
โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ contents.xcworkspacedata
โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ xcshareddata
โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ IDEWorkspaceChecks.plist
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ xcuserdata
โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ isiwon.xcuserdatad
โ”‚ย ย  โ”‚ย ย          โ””โ”€โ”€ xcschemes
โ”‚ย ย  โ”‚ย ย              โ””โ”€โ”€ xcschememanagement.plist
โ”‚ย ย  โ””โ”€โ”€ CustomUIKitTests
โ”‚ย ย      โ””โ”€โ”€ CustomUIKitTests.swift
โ”œโ”€โ”€ README.md
โ””โ”€โ”€ TodoApp
    โ”œโ”€โ”€ ProjectManager
    โ”‚ย ย  โ”œโ”€โ”€ Application
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AppDelegate.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ DIContainer
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MainSceneDIContainer.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ GoogleService-Info.plist
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ SceneDelegate.swift
    โ”‚ย ย  โ”œโ”€โ”€ Assets.xcassets
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AccentColor.colorset
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Contents.json
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AppIcon.appiconset
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Contents.json
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Contents.json
    โ”‚ย ย  โ”œโ”€โ”€ Base.lproj
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ LaunchScreen.storyboard
    โ”‚ย ย  โ”œโ”€โ”€ Data
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MappingEntities
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ HistoryEntity+Realm.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TodoEntity+Firebase.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ TodoEntity+Realm.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ PersistentStorages
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ FirebaseTodoListStorage.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ RealmHistoryStorage.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ RealmTodoListStorage.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Repositories
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ DefaultHistoryRepository.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ DefaultTodoListRepository.swift
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Uitils
    โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ Protocols
    โ”‚ย ย  โ”‚ย ย          โ””โ”€โ”€ ErrorThrowble.swift
    โ”‚ย ย  โ”œโ”€โ”€ Domain
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Entities
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ History.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ TodoModel.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Interfaces
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Repositories
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ HistoryRepository.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ TodoListRepository.swift
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ UseCase
    โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ TodoListUseCase.swift
    โ”‚ย ย  โ”œโ”€โ”€ Errors
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ TodoError.swift
    โ”‚ย ย  โ”œโ”€โ”€ Info.plist
    โ”‚ย ย  โ”œโ”€โ”€ Presentation
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Edit&Create
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ View
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CommonView.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CreateView.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CreateViewController.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ EditView.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ EditViewController.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ViewModel
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ CreateViewModel.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ EditViewModel.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ History
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ View
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ HistoryCell.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ HistoryViewController.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ViewModel
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ HistoryCellContent.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ HistoryViewModel.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MainFlowCoordinator.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MainList
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ContentList
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ View
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ContentListView.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ContentListViewController.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ViewModel
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ContentCellItem.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ ContentListViewModel.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ View
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ PageViewController.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ TodoListCell.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ViewModel
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ PageViewModel.swift
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Move
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ View
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MoveViewController.swift
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ViewModel
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ MoveViewModel.swift
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Utils
    โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ Extensions
    โ”‚ย ย  โ”‚ย ย      โ”‚ย ย  โ”œโ”€โ”€ CUIHeaderView+Reactive.swift
    โ”‚ย ย  โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ Date+ToString.swift
    โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ Protocols
    โ”‚ย ย  โ”‚ย ย          โ””โ”€โ”€ CellIdentifiable.swift
    โ”‚ย ย  โ””โ”€โ”€ Utils
    โ”‚ย ย      โ””โ”€โ”€ Extensions
    โ”‚ย ย          โ”œโ”€โ”€ Collection+Subscript.swift
    โ”‚ย ย          โ”œโ”€โ”€ Reactive+ItemSelected.swift
    โ”‚ย ย          โ””โ”€โ”€ Reactive+LongPress.swift
    โ”œโ”€โ”€ ProjectManager.xcodeproj
    โ”‚ย ย  โ”œโ”€โ”€ project.pbxproj
    โ”‚ย ย  โ”œโ”€โ”€ project.xcworkspace
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ contents.xcworkspacedata
    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ xcshareddata
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ IDEWorkspaceChecks.plist
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ swiftpm
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ Package.resolved
    โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ configuration
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ xcuserdata
    โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ isiwon.xcuserdatad
    โ”‚ย ย  โ”‚ย ย          โ””โ”€โ”€ UserInterfaceState.xcuserstate
    โ”‚ย ย  โ”œโ”€โ”€ xcshareddata
    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ xcschemes
    โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ ProjectManager.xcscheme
    โ”‚ย ย  โ””โ”€โ”€ xcuserdata
    โ”‚ย ย      โ””โ”€โ”€ isiwon.xcuserdatad
    โ”‚ย ย          โ””โ”€โ”€ xcschemes
    โ”‚ย ย              โ””โ”€โ”€ xcschememanagement.plist
    โ””โ”€โ”€ ProjectManagerTests
        โ”œโ”€โ”€ UseCaseTests
        โ”‚ย ย  โ”œโ”€โ”€ MockHistoryRepository.swift
        โ”‚ย ย  โ”œโ”€โ”€ MockListRepository.swift
        โ”‚ย ย  โ””โ”€โ”€ TodoListUseCaseTest.swift
        โ””โ”€โ”€ ViewModelTests
            โ”œโ”€โ”€ ContentListViewModelTest.swift
            โ”œโ”€โ”€ CreateViewModelTest.swift
            โ”œโ”€โ”€ EditViewModelTest.swift
            โ”œโ”€โ”€ HistoryViewModelTest.swift
            โ”œโ”€โ”€ MockUesCase.swift
            โ”œโ”€โ”€ MoveViewModelTest.swift
            โ””โ”€โ”€ PageViewModelTest.swift

์ถ”๊ฐ€์ ์œผ๋กœ, CustomUIKit์œผ๋กœ ํŠน์ • CustomUI ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ์•ฝ๊ฐ„์˜ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์†๋„ ๋‹จ์ถ•๊ณผ ํ•ด๋‹น UI๊ฐ€ ํ•„์š”ํ•œ ํŒŒ์ผ์—๋งŒ importํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ท„์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ

๋ฉ”์ธ
  • CustomSegmentControl๊ณผ ScrollView๋ฅผ ์ด์šฉํ•˜์—ฌ Todo, Doing, Done ์„ธ ViewController๋ฅผ Pageing ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€ ์ˆ˜์ •
  • ์ƒ๋‹จ NavigationBar์˜ Plus Button๋ฅผ ํด๋ฆญํ•˜์—ฌ, ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ ํ™”๋ฉด์„ ๋ชจ๋‹ฌ ํ˜•์‹์œผ๋กœ presentํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • Cell๋ฅผ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น Cell์˜ ์ •๋ณด๊ฐ€ ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ์ˆ˜์ • ํ™”๋ฉด์ด push ๋˜๊ณ , ์ƒ๋‹จ์˜ Edit button์„ Tapํ•˜๋ฉด, ์ˆ˜์ • ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™” ๋ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋ฐ ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋Š” Realm์„ ์ด์šฉํ•œ Local DB ์ €์žฅ๋˜๊ณ , App์ด ์ข…๋ฃŒ๋˜๋ฉด, ์ข…๋ฃŒ ์‹œ์ ์— ์ž…๋ ฅ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Firebase๋ฅผ ์ด์šฉํ•œ Remote DB์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Firebase์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ App์„ ์‚ญ์ œํ•˜๊ณ , ๋‹ค์‹œ ๋‹ค์šด๋ฐ›์•˜์„ ๋•Œ ์ฝ์–ด์˜ค๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ด๋™ ๋ฐ ์‚ญ์ œ History
  • ํ•ด๋‹น Cell์„ longpressํ•˜๊ฒŒ ๋˜๋ฉด ๋‘๊ฐœ์˜ Moveing Button๊ณผ Delete Button์ด popover ํ˜•์‹์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ๋‹จ NavigationBar์˜ Watch Button๋ฅผ ํด๋ฆญ๋ฉด, History ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ™”๋ฉด์—์„œ ์ง€๊ธˆ๊นŒ์ง€ ๊ธฐ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ

UseCase์™€ ๊ฐ ํ™”๋ฉด์˜ ViewModel์— ๋Œ€ํ•ด์„œ Unit Test๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐ ํƒ€์ž…์˜ ์˜์กด์„ฑ์„ ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ protocol์„ ์‚ฌ์šฉํ•˜์—ฌ Testableํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฉฐ, Test๋ฅผ ์œ„ํ•œ Test Double ํƒ€์ž…์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ Test๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

todo_app's People

Contributors

siwon-l avatar ttozzi avatar yagom avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.