├── .gitignore ├── .gitlab-ci.yml ├── .project ├── .scannerwork └── scanner-report │ └── analysis.log ├── .settings └── org.eclipse.buildship.core.prefs ├── .vscode └── settings.json ├── README.md ├── build.gradle ├── docs └── .project ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── previos ├── abstractFactory.adoc ├── patron.adoc └── singleton.adoc ├── settings.gradle ├── src └── docs │ └── asciidoc │ ├── epubStyle │ ├── epub3-css3-only.css │ └── epub3.css │ ├── images │ └── Dibujo.jpg │ ├── index.adoc │ ├── index.pdf │ └── themePdf │ ├── logo.png │ └── personal-theme.yml └── target ├── classes └── usantatecla │ ├── tictactoe │ ├── Board.class │ ├── Coordinate.class │ ├── Error.class │ ├── MachinePlayer.class │ ├── Message.class │ ├── Player.class │ ├── TicTacToe.class │ ├── Token.class │ ├── Turn.class │ └── UserPlayer.class │ └── utils │ ├── ClosedInterval.class │ ├── ConcreteCoordinate.class │ ├── Console.class │ ├── Coordinate.class │ ├── Direction.class │ ├── LimitedIntDialog.class │ ├── NullCoordinate.class │ └── YesNoDialog.class └── test-classes └── usantatecla ├── AllTest.class ├── tictactoe ├── AllTicTacToeTest.class ├── BoardTest.class └── CoordinateTest.class └── utils ├── AllUtilsTest.class └── ConsoleTest.class /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### JetBrains template 3 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 4 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 5 | 6 | # User-specific stuff: 7 | .idea/**/workspace.xml 8 | .idea/**/tasks.xml 9 | .idea/dictionaries 10 | 11 | # Sensitive or high-churn files: 12 | .idea/**/dataSources/ 13 | .idea/**/dataSources.ids 14 | .idea/**/dataSources.xml 15 | .idea/**/dataSources.local.xml 16 | .idea/**/sqlDataSources.xml 17 | .idea/**/dynamic.xml 18 | .idea/**/uiDesigner.xml 19 | 20 | # Gradle: 21 | .idea/**/gradle.xml 22 | .idea/**/libraries 23 | 24 | # CMake 25 | cmake-build-debug/ 26 | cmake-build-release/ 27 | 28 | # Mongo Explorer plugin: 29 | .idea/**/mongoSettings.xml 30 | 31 | ## File-based project format: 32 | *.iws 33 | 34 | ## Plugin-specific files: 35 | 36 | # IntelliJ 37 | out/ 38 | 39 | # mpeltonen/sbt-idea plugin 40 | .idea_modules/ 41 | 42 | # JIRA plugin 43 | atlassian-ide-plugin.xml 44 | 45 | # Cursive Clojure plugin 46 | .idea/replstate.xml 47 | 48 | # Crashlytics plugin (for Android Studio and IntelliJ) 49 | com_crashlytics_export_strings.xml 50 | crashlytics.properties 51 | crashlytics-build.properties 52 | fabric.properties 53 | ### Gradle template 54 | .gradle 55 | /build/ 56 | 57 | # Ignore Gradle GUI config 58 | gradle-app.setting 59 | 60 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 61 | !gradle-wrapper.jar 62 | 63 | # Cache of project 64 | .gradletasknamecache 65 | 66 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 67 | # gradle/wrapper/gradle-wrapper.properties 68 | 69 | /plane.iml 70 | /.idea/ 71 | /src/docs/asciidoc/.asciidoctor/ 72 | /src/docs/asciidoc/images/diag-*.png 73 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | 2 | build: 3 | image: openjdk:8-jdk 4 | stage: build 5 | script: 6 | - apt-get update 7 | - apt-get -y install graphviz 8 | - ./gradlew build 9 | artifacts: 10 | paths: 11 | - build/docs 12 | 13 | pages: 14 | stage: deploy 15 | script: 16 | - mkdir -p public 17 | - mkdir -p public 18 | - cp -R build/docs/asciidoc/* public 19 | - cp -R build/docs/asciidocPdf/*.pdf public/ 20 | - cp -R build/docs/asciidocEpub/*.mobi public/ 21 | artifacts: 22 | paths: 23 | - public 24 | dependencies: 25 | - build 26 | when: manual 27 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | asciidoctor-amazon-templates 4 | Project Requisitos. Versión 1 created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.buildship.core.gradleprojectbuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.buildship.core.gradleprojectnature 16 | 17 | 18 | 19 | 1601742810296 20 | 21 | 30 22 | 23 | org.eclipse.core.resources.regexFilterMatcher 24 | node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.scannerwork/scanner-report/analysis.log: -------------------------------------------------------------------------------- 1 | SonarQube plugins: 2 | - Python Code Quality and Security 2.13.0.7236 (python) 3 | - SonarCSS 1.2.0.1325 (cssfamily) 4 | - JaCoCo 1.1.0.898 (jacoco) 5 | - SonarGo 1.6.0.719 (go) 6 | - SonarKotlin 1.5.0.315 (kotlin) 7 | - Svn 1.10.0.1917 (scmsvn) 8 | - SonarJS 6.2.1.12157 (javascript) 9 | - SonarRuby 1.5.0.315 (ruby) 10 | - SonarScala 1.5.0.315 (sonarscala) 11 | - C# Code Quality and Security 8.9.0.19135 (csharp) 12 | - Java Code Quality and Security 6.5.1.22586 (java) 13 | - SonarHTML 3.2.0.2082 (web) 14 | - Git 1.12.0.2034 (scmgit) 15 | - SonarFlex 2.5.1.1831 (flex) 16 | - SonarXML 2.0.1.2020 (xml) 17 | - PHP Code Quality and Security 3.5.0.5655 (php) 18 | - SonarTS 2.1.0.4359 (typescript) 19 | - VB.NET Code Quality and Security 8.9.0.19135 (vbnet) 20 | Global server settings: 21 | - sonar.core.id=BF41A1F2-AXP9Mru-T8SC0G-yKp6- 22 | - sonar.core.startTime=2020-08-19T20:46:36+0200 23 | Project server settings: 24 | Project scanner properties: 25 | - sonar.host.url=http://localhost:9000 26 | - sonar.jacoco.reportPath=target/jacoco.exec 27 | - sonar.java.binaries=target/classes 28 | - sonar.java.coveragePlugin=jacoco 29 | - sonar.junit.reportsPath=target/my-reports 30 | - sonar.language=java 31 | - sonar.projectBaseDir=C:\Users\victo\Pictures\tictactoe2 32 | - sonar.projectKey=usantatecla:tictactoe-mvp.pm.withoutProxy 33 | - sonar.projectName=tictactoe-mvp.pm.withoutProxy 34 | - sonar.projectVersion=1.0 35 | - sonar.scanner.app=ScannerCLI 36 | - sonar.scanner.appVersion=4.4.0.2170 37 | - sonar.sourceEncoding=windows-1252 38 | - sonar.sources=./src/main/java 39 | - sonar.tests=src/test 40 | - sonar.verbose=true 41 | - sonar.working.directory=C:\Users\victo\Pictures\tictactoe2\.scannerwork 42 | -------------------------------------------------------------------------------- /.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | arguments= 2 | auto.sync=false 3 | build.scans.enabled=false 4 | connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) 5 | connection.project.dir= 6 | eclipse.preferences.version=1 7 | gradle.user.home= 8 | java.home=C\:/Program Files/Java/jdk-14.0.1 9 | jvm.arguments= 10 | offline.mode=false 11 | override.workspace.settings=true 12 | show.console.view=true 13 | show.executions.view=true 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "java.configuration.updateBuildConfiguration": "interactive" 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 21 |
22 |
23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 47 | 50 | 53 | 54 | 55 | 58 | 61 | 64 | 65 | 66 | 69 | 72 | 75 | 78 | 79 | 80 | 83 | 86 | 87 | 88 | 91 | 94 | 95 | 96 | 99 | 102 | 103 | 104 | 107 | 110 | 111 | 112 | 115 | 118 | 119 | 120 | 123 | 126 | 129 | 132 | 133 | 134 | 137 | 140 | 143 | 144 | 145 | 148 | 151 | 152 | 153 | 156 | 159 | 162 | 163 | 164 | 167 | 170 | 171 | 172 | 175 | 178 | 181 | 182 | 183 | 186 | 189 | 190 | 191 | 194 | 197 | 200 | 203 | 204 | 205 | 208 | 211 | 212 | 213 | 216 | 219 | 220 | 221 |
TemaRequisitosSoluciónIncremento
42 |

Diseño

43 |
45 |

TicTacToe. Requisitos. Versión 1. Básica

46 |
48 |

TicTacToe. Solucion. Versión 1.1. domainModel

49 |
51 |

Clases del Modelo del Dominio pero acopladas a tecnologías de interfaz ahora y todas con la Ley del Cambio Continuo y de granos grueso con el advenimiento de nueva funcionalidad

52 |
56 |

Diseño Modular

57 |
59 |

TicTacToe. Solucion. Versión 2.1. documentView

60 |
62 |

Clases Vistas de Texto separadas de los Modelos del Dominio pero con Modelos de grano grueso con el advenimiento de nueva funcionalidad

63 |
67 |

Diseño Orientado a Objetos

68 |
70 |

TicTacToe. Requisitos. Versión 2. Gráficos

71 |
73 |

TicTacToe. Solucion. Versión 3.2. dv. withoutFactoryMethod

74 |
76 |

Clase Vistas de Interfaz Gráfica de Usuario pero con DRY en Vistas de tecnologías diferentes y con Modelos de grano grueso con el advenimiento de nueva funcionalidad

77 |
81 |

TicTacToe. Solucion. Versión 4.2. dv. withFactoryMethod

82 |
84 |

Clase Vista abstracta para Open/Close de sus tecnologías pero con Modelos de grano grueso con el advenimiento de nueva funcionalidad

85 |
89 |

TicTacToe. Solucion. Versión 5.2. modelViewPresenter. presentationModel

90 |
92 |

Clases Controladoras entre Vistas y Modelos por cada Caso de Uso pero con la clase Principal y las Vistas acopladas a cada controlador actual y futuro

93 |
97 |

TicTacToe. Solucion. Versión 6.2. mvp. pm. withFacade

98 |
100 |

Clase Lógica que encapsula Controladores y Modelos pero con Vistas con DRY en la Lógica de Control

101 |
105 |

TicTacToe. Solucion. Versión 7.2. mvp. pm. withoutDoubleDispatching

106 |
108 |

Clase Estado para la Inversión de Control de Vistas a la Lógica pero violando el Principio de Sustitución de Liskov

109 |
113 |

TicTacToe. Solucion. Versión 8.2. mvp. pm. withDoubleDispatching

114 |
116 |

Clase Vistador de Controladores para Técnica de Doble Despacho

117 |
121 |

Patrones de Diseño

122 |
124 |

TicTacToe. Requisitos. Versión 3. UndoRedo

125 |
127 |

TicTacToe. Solucion. Versión 9.3. mvp. pm. withComposite

128 |
130 |

Clase Comando del menú y Controlador Compuesto de ciertos Estados para Open/Close con nuevos Casos de Uso

131 |
135 |

TicTacToe. Requisitos. Versión 4. ClienteServidor

136 |
138 |

TicTacToe. Solucion. Versión 10.4. mvp. pm. withoutProxy

139 |
141 |

Clase TCP/IP para tecnología de Despliegue pero con Controladores acoplados, poco cohesivos y grano grueso con cada nueva tecnología

142 |
146 |

TicTacToe. Solucion. Versión 11.4. mvp. pm. withProxy

147 |
149 |

Clases Proxy para Open/Close para nuevas tecnologías de Despliegue

150 |
154 |

TicTacToe. Requisitos. Versión 5. Ficheros

155 |
157 |

TicTacToe. Solucion. Versión 12.5. mvp. pm. withoutDAO

158 |
160 |

Clases Vistas y Controladores para la tecnología de persistencia pero con Modelos de grano grueso, baja cohesión y alto acoplamiento a tecnologías de persistencia de ficheros

161 |
165 |

TicTacToe. Solucion. Versión 13.5. mvp. pm. withDAO

166 |
168 |

Patrón DAO

169 |
173 |

TicTacToe. Requisitos. Versión 6. BasesDatos

174 |
176 |

TicTacToe. Solucion. Versión 14.6. mvp. pm. withoutPrototype

177 |
179 |

Nuevas Vistas y DAOS para la nueva tecnología pero con clase Principal acoplada a las tecnologías actuales y futuras de persistencia

180 |
184 |

TicTacToe. Solucion. Versión 15.6. mvp. pm. withPrototype

185 |
187 |

Open/Close para arranque con configuración de persistencia

188 |
192 |

Arquitectura MVC

193 |
195 |

TicTacToe. Requisitos. Versión 1. Básica

196 |
198 |

TicTacToe. Solucion. Versión 16.1. mvp. pv

199 |
201 |

Baile de la Triada

202 |
206 |

TicTacToe. Solucion. Versión 17.1. mvp. sc

207 |
209 |

Baile de la Triada

210 |
214 |

TicTacToe. Solucion. Versión 18.1. mvc

215 |
217 |

Baile de la Triada

218 |
222 |
223 |
224 |
225 | 231 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.asciidoctor.jvm.convert' version '2.2.0' 3 | id 'org.asciidoctor.jvm.epub' version '2.2.0' 4 | id 'org.asciidoctor.jvm.pdf' version '2.2.0' 5 | } 6 | 7 | repositories { 8 | mavenLocal() 9 | jcenter() 10 | mavenCentral() 11 | } 12 | 13 | configurations { 14 | asciidoctorExt 15 | } 16 | 17 | dependencies { 18 | asciidoctorExt group: 'com.puravida.asciidoctor', name: 'asciidoctor-barcode', version:'2.2.1' 19 | asciidoctorExt group: 'net.sourceforge.plantuml', name: 'plantuml', version: '1.2020.15' 20 | asciidoctorExt group: 'org.scilab.forge', name: 'jlatexmath', version: '1.0.7' 21 | 22 | } 23 | 24 | ext{ 25 | documentVersion = '0.0.1' 26 | } 27 | 28 | asciidoctorj { 29 | 30 | version '2.0.0' 31 | 32 | modules{ 33 | epub{ 34 | version '1.5.0-alpha.9' 35 | } 36 | diagram{ 37 | version '1.5.16' 38 | } 39 | } 40 | 41 | options doctype: 'book', ruby:'erubis' 42 | 43 | attributes 'source-highlighter': 'coderay', 44 | toc: '', 45 | idprefix: '', 46 | idseparator: '-', 47 | 'icons': 'font', 48 | 'setanchors': '', 49 | 'listing-caption':'', 50 | version: documentVersion, 51 | revnumber: documentVersion 52 | 53 | docExtensions { 54 | block_macro (name: 'starts') { parent, target, attributes -> 55 | String content = "_${attributes.get("text")}_" 56 | int up = (attributes.get("up") ?: 10) as int 57 | int votes = target as int 58 | (1..votes).each{ content ="$content icon:star[] "} 59 | (votes..up-1).each{ content ="$content icon:star-o[] "} 60 | content = "$content $votes/$up" 61 | createBlock(parent, "paragraph", [content], [:], [:]) 62 | } 63 | } 64 | } 65 | 66 | asciidoctor{ 67 | baseDirFollowsSourceDir() 68 | logDocuments true 69 | configurations 'asciidoctorExt' 70 | sources { 71 | include 'index.adoc' 72 | } 73 | asciidoctorj{ 74 | docExtensions { 75 | block('typewriter') { 76 | parent, reader, attributes -> 77 | def lines = reader.readLines() 78 | def attr = [role:'typewriter'] 79 | return createBlock(parent, 'paragraph', lines, attr, [:]) 80 | } 81 | 82 | postprocessor { 83 | document, output -> 84 | 85 | output.replace("","""""") 120 | } 121 | } 122 | } 123 | } 124 | 125 | pdfThemes { 126 | local 'personal', { 127 | styleDir = file('src/docs/asciidoc/themePdf') 128 | styleName = 'personal' 129 | } 130 | } 131 | 132 | asciidoctorPdf{ 133 | useIntermediateWorkDir() 134 | baseDirFollowsSourceDir() 135 | logDocuments true 136 | resources{ 137 | from(sourceDir) { 138 | include '**' 139 | } 140 | } 141 | configurations 'asciidoctorExt' 142 | asciidoctorj{ 143 | attributes imagesdir: file("build/tmp/asciidoctorPdf.intermediate/images"), 144 | imagesoutdir: file("build/tmp/asciidoctorPdf.intermediate/images") 145 | } 146 | sources { 147 | include 'index.adoc' 148 | } 149 | 150 | theme 'personal' 151 | } 152 | 153 | kindlegen { 154 | agreeToTermsOfUse = true 155 | } 156 | 157 | asciidoctorEpub{ 158 | useIntermediateWorkDir() 159 | baseDirFollowsSourceDir() 160 | logDocuments true 161 | resources{ 162 | from(sourceDir) { 163 | include '**' 164 | } 165 | } 166 | configurations 'asciidoctorExt' 167 | asciidoctorj{ 168 | options to_dir : "../tmp/asciidoctorEpub.intermediate" 169 | 170 | attributes imagesdir: file("build/tmp/asciidoctorEpub.intermediate/images"), 171 | imagesoutdir: file("build/tmp/asciidoctorEpub.intermediate/images"), 172 | 'epub3-stylesdir':'epubStyle' 173 | } 174 | sources { 175 | include 'index.adoc' 176 | } 177 | 178 | ebookFormats KF8 179 | } 180 | 181 | build.dependsOn asciidoctor -------------------------------------------------------------------------------- /docs/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | asciidoctor-amazon-templates 4 | Project Solucion. Versión 2 created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.buildship.core.gradleprojectbuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.buildship.core.gradleprojectnature 16 | 17 | 18 | 19 | 1599930864974 20 | 21 | 30 22 | 23 | org.eclipse.core.resources.regexFilterMatcher 24 | node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Sep 07 07:16:29 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | #### 4 | export KINDLEGEN="`pwd`/build/kindlegen/kindlegen" 5 | 6 | ############################################################################## 7 | ## 8 | ## Gradle start up script for UN*X 9 | ## 10 | ############################################################################## 11 | 12 | # Attempt to set APP_HOME 13 | # Resolve links: $0 may be a link 14 | PRG="$0" 15 | # Need this for relative symlinks. 16 | while [ -h "$PRG" ] ; do 17 | ls=`ls -ld "$PRG"` 18 | link=`expr "$ls" : '.*-> \(.*\)$'` 19 | if expr "$link" : '/.*' > /dev/null; then 20 | PRG="$link" 21 | else 22 | PRG=`dirname "$PRG"`"/$link" 23 | fi 24 | done 25 | SAVED="`pwd`" 26 | cd "`dirname \"$PRG\"`/" >/dev/null 27 | APP_HOME="`pwd -P`" 28 | cd "$SAVED" >/dev/null 29 | 30 | APP_NAME="Gradle" 31 | APP_BASE_NAME=`basename "$0"` 32 | 33 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 34 | DEFAULT_JVM_OPTS="" 35 | 36 | # Use the maximum available, or set MAX_FD != -1 to use that value. 37 | MAX_FD="maximum" 38 | 39 | warn () { 40 | echo "$*" 41 | } 42 | 43 | die () { 44 | echo 45 | echo "$*" 46 | echo 47 | exit 1 48 | } 49 | 50 | # OS specific support (must be 'true' or 'false'). 51 | cygwin=false 52 | msys=false 53 | darwin=false 54 | nonstop=false 55 | case "`uname`" in 56 | CYGWIN* ) 57 | cygwin=true 58 | ;; 59 | Darwin* ) 60 | darwin=true 61 | ;; 62 | MINGW* ) 63 | msys=true 64 | ;; 65 | NONSTOP* ) 66 | nonstop=true 67 | ;; 68 | esac 69 | 70 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 71 | 72 | # Determine the Java command to use to start the JVM. 73 | if [ -n "$JAVA_HOME" ] ; then 74 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 75 | # IBM's JDK on AIX uses strange locations for the executables 76 | JAVACMD="$JAVA_HOME/jre/sh/java" 77 | else 78 | JAVACMD="$JAVA_HOME/bin/java" 79 | fi 80 | if [ ! -x "$JAVACMD" ] ; then 81 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | else 87 | JAVACMD="java" 88 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 89 | 90 | Please set the JAVA_HOME variable in your environment to match the 91 | location of your Java installation." 92 | fi 93 | 94 | # Increase the maximum file descriptors if we can. 95 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 96 | MAX_FD_LIMIT=`ulimit -H -n` 97 | if [ $? -eq 0 ] ; then 98 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 99 | MAX_FD="$MAX_FD_LIMIT" 100 | fi 101 | ulimit -n $MAX_FD 102 | if [ $? -ne 0 ] ; then 103 | warn "Could not set maximum file descriptor limit: $MAX_FD" 104 | fi 105 | else 106 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 107 | fi 108 | fi 109 | 110 | # For Darwin, add options to specify how the application appears in the dock 111 | if $darwin; then 112 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 113 | fi 114 | 115 | # For Cygwin, switch paths to Windows format before running java 116 | if $cygwin ; then 117 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 118 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 119 | JAVACMD=`cygpath --unix "$JAVACMD"` 120 | 121 | # We build the pattern for arguments to be converted via cygpath 122 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 123 | SEP="" 124 | for dir in $ROOTDIRSRAW ; do 125 | ROOTDIRS="$ROOTDIRS$SEP$dir" 126 | SEP="|" 127 | done 128 | OURCYGPATTERN="(^($ROOTDIRS))" 129 | # Add a user-defined pattern to the cygpath arguments 130 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 131 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 132 | fi 133 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 134 | i=0 135 | for arg in "$@" ; do 136 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 137 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 138 | 139 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 140 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 141 | else 142 | eval `echo args$i`="\"$arg\"" 143 | fi 144 | i=$((i+1)) 145 | done 146 | case $i in 147 | (0) set -- ;; 148 | (1) set -- "$args0" ;; 149 | (2) set -- "$args0" "$args1" ;; 150 | (3) set -- "$args0" "$args1" "$args2" ;; 151 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 152 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 153 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 154 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 155 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 156 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 157 | esac 158 | fi 159 | 160 | # Escape application args 161 | save () { 162 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 163 | echo " " 164 | } 165 | APP_ARGS=$(save "$@") 166 | 167 | # Collect all arguments for the java command, following the shell quoting and substitution rules 168 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 169 | 170 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 171 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 172 | cd "$(dirname "$0")" 173 | fi 174 | 175 | exec "$JAVACMD" "$@" 176 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /previos/abstractFactory.adoc: -------------------------------------------------------------------------------- 1 | = *Abstract Factory* 2 | 3 | == Problema 4 | 5 | === Motivación: ¿Por qué? 6 | 7 | *_Ejemplo_*: _Un cirujano realiza una intervención siguiendo un algoritmo y dependiendo del lugar (quirófano, selva, …), la realizará con unos instrumentos u otros (bisturí vs navaja, pulsómetro vs contando pulsaciones, ...)_ 8 | 9 | [plantuml,abstractFactoryBad,svg] 10 | .... 11 | skinparam packageStyle rect 12 | 13 | class Cirurjano { 14 | + prepararBisturi() 15 | + prepararNavaja() 16 | + prepararCompresa() 17 | + preparaTrapo() 18 | +intervenir() 19 | } 20 | 21 | Cirurjano -right->Bisturi 22 | Cirurjano -right->Navaja 23 | Cirurjano -right->Compresa 24 | Cirurjano -right->Trapo 25 | 26 | abstract class Cortante 27 | class Bisturi 28 | class Navaja 29 | 30 | abstract class Secador 31 | class Compresa 32 | class Trapo 33 | 34 | Cirurjano -right-> Cortante 35 | Cirurjano -right->Secador 36 | 37 | Cortante<|-down-Bisturi 38 | Cortante<|-down-Navaja 39 | 40 | Secador<|-down-Compresa 41 | Secador<|-down-Trapo 42 | .... 43 | 44 | *_Ejemplo_*: _Si la responsabilidad del cirujano incluye la preparación del instrumental en cualquier contexto, ésta se complica y tiende a crecer más y más dependiendo del número de contextos mezclando dos asuntos innecesariamente: preparación del instrumental y cirugía._ 45 | 46 | [cols="10, 70, 20", options="header"] 47 | |=== 48 | | Diseño 49 | | Descripción 50 | | Smell code 51 | 52 | | *Cohesión* 53 | | _Cirujano tiene 2 responsabilidades_ 54 | | Baja cohesión 55 | 56 | | *Acoplamiento* 57 | | _Cirujano está acoplado a cada instrumental de cada contexto_ 58 | | Alto acoplamiento 59 | 60 | | *Tamaño* 61 | | _Cirujano tiende a crecer según el número de contextos y tipos de instrumental_ 62 | | Clase grande 63 | |=== 64 | 65 | === Intención: ¿Para qué? 66 | 67 | *_Ejemplo_*: _La responsabilidad del cirujano incluye solamente la solicitud del instrumental abstracto (algo cortante, contador de pulsaciones, …) a otros que se especialicen por separado en la preparación del instrumental según su contexto._ 68 | 69 | [quote, Gamma et al, Patrones de Diseño] 70 | *Provee una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas* 71 | 72 | [plantuml,abstractFactoryGood,svg] 73 | .... 74 | skinparam packageStyle rect 75 | 76 | class Cirurjano <> { 77 | +intervenir() 78 | } 79 | 80 | abstract class Instrumentalista <> { 81 | {abstract}+crearCortante() 82 | {abstract}+crearSecador() 83 | } 84 | class "Instrumentalista en Quirófano" as InstrumentalistaEnQuirofano <> { 85 | +crearCortante() 86 | +crearSecador() 87 | } 88 | class "Instrumentalista en Selva" as InstrumentalistaEnSelva <> { 89 | +crearCortante() 90 | +crearSecador 91 | } 92 | 93 | abstract class Cortante <> 94 | class Bisturi <> 95 | class Navaja <> 96 | 97 | abstract class Secador <> 98 | class Compresa <> 99 | class Trapo <> 100 | 101 | Cirurjano -down->Instrumentalista 102 | Cirurjano -right-> Cortante 103 | Cirurjano -right->Secador 104 | 105 | Instrumentalista<|-down-InstrumentalistaEnQuirofano 106 | Instrumentalista<|-down-InstrumentalistaEnSelva 107 | 108 | Cortante<|-down-Bisturi 109 | Cortante<|-down-Navaja 110 | 111 | Secador<|-down-Compresa 112 | Secador<|-down-Trapo 113 | 114 | InstrumentalistaEnQuirofano -right-> Bisturi 115 | InstrumentalistaEnQuirofano -right-> Compresa 116 | 117 | InstrumentalistaEnSelva -right-> Navaja 118 | InstrumentalistaEnSelva -right-> Trapo 119 | 120 | .... 121 | 122 | [cols="10, 90", options="header"] 123 | |=== 124 | | Diseño 125 | | Descripción 126 | 127 | | *Cohesión* 128 | | _Cirujano tiene una única responsabilidad, intervenir quirúrjicamente_ 129 | 130 | | *Acoplamiento* 131 | | _Cirujano está acoplado unicamente al instrumental abstracto_ 132 | 133 | | *Tamaño* 134 | | _Cirujano solo tiende a crecer según los tipos de instrumental que realmente necesite_ 135 | |=== 136 | 137 | === Aplicabilidad: ¿Cuándo? 138 | 139 | - Un sistema debe ser independiente de cómo se crean, componen y representan sus productos 140 | - Un sistema debe ser configurado con una familia de productos de entre varias 141 | - Una familia de objetos producto relacionados está diseñada para ser usada conjuntamente, y es necesario hacer cumplir esta restricción 142 | - Quiere proporcionar una biblioteca de clases de productos, y sólo quiere revelar sus interfaces, no sus implementaciones 143 | 144 | == Solución: ¿Cómo? 145 | 146 | === Estructura 147 | 148 | [plantuml,abstractFactoryPattern,svg] 149 | .... 150 | skinparam packageStyle rect 151 | 152 | class Client { 153 | +intervenir() 154 | } 155 | 156 | abstract class "Abstract Factory" as AbstractFactory{ 157 | {abstract}+createProductA() 158 | {abstract}+createProductB() 159 | } 160 | class "Concrete Factory A" as ConcreteFactoryA { 161 | +createProductA() 162 | +createProductB() 163 | } 164 | class "Concrete Factory B" as ConcreteFactoryB{ 165 | +createProductA() 166 | +createProductB() 167 | } 168 | 169 | abstract class "Abstract Product A" as AbstractProductA 170 | class "Concrete Product AA" as ConcreteProductAA 171 | class "Concrete Product AB" as ConcreteProductAB 172 | 173 | abstract class "Abstract Product B" as AbstractProductB 174 | class "Concrete Product BA" as ConcreteProductBA 175 | class "Concrete Product BB" as ConcreteProductBB 176 | 177 | Client -down-> AbstractFactory 178 | Client -right-> AbstractProductA 179 | Client -right-> AbstractProductB 180 | 181 | AbstractFactory <|-down-ConcreteFactoryA 182 | AbstractFactory <|-down-ConcreteFactoryB 183 | 184 | AbstractProductA <|-down-ConcreteProductAA 185 | AbstractProductA <|-down-ConcreteProductAB 186 | 187 | AbstractProductB <|-down-ConcreteProductBA 188 | AbstractProductB <|-down-ConcreteProductBB 189 | 190 | ConcreteFactoryA -right-> ConcreteProductAA 191 | ConcreteFactoryA -right-> ConcreteProductBA 192 | 193 | ConcreteFactoryB -right-> ConcreteProductAB 194 | ConcreteFactoryB -right-> ConcreteProductBB 195 | .... 196 | 197 | === Participantes 198 | 199 | - Definiendo una clase FabricaDeProductos que declara una interfaz para crear cada tipo básico de producto. También hay una clase abstracta para cada tipo de producto, y las subclases concretas implementan útiles para un estándar concreto de interfaz de usuario. 200 | 201 | * La interfaz FabricaDeProductos tiene una operación que devuelve un nuevo objeto para cada clase abstracta de producto. Los clientes llaman a estas operaciones para obtener instancias de productos, pero no son conscientes de las clases concretas que están usando. De esta manera los clientes son independientes de la interfaz de usuario. En otras palabras, los clientes no tienen que atarse a una clase concreta, sino sólo a una interfaz definida por una clase abstracta. 202 | 203 | - AbstractFactory solo declara una interfaz para crear productos. Se deja a las subclases ConcreteFactory el crearlos realmente. El modo más común de hacer esto es definiendo un método de fabricación para cada producto. 204 | 205 | - AbstractFactory por lo general define una operación diferente para cada tipo de producto que puede producir. Los tipos de producto está codificados en las signaturas de las operaciones. Añadir un nuevo tipo de producto requiere cambiar la interfaz de AbstractFactory y todas las clases que dependen de ella. 206 | 207 | * Un diseño más flexible, aunque menos seguro, es añadir un parámetro a las operaciones que crean los objetos. Este parámetro especifica el tipo de objeto a ser creado. Podría tratarse de un identificador de clase, un entero, una cadena de texto o cualquier otra cosa que identifique el tipo de producto. De hecho, con este enfoque, AbstractFactory solo necesita una única operación “Hacer” con un parámetro que indique el tipo de objeto a crear. 208 | 209 | === Relaciones 210 | 211 | Singleton:: para una aplicación que sólo necesita una instancia de una FabricaConcreta por cada familia de productos. 212 | 213 | Factory Method:: para que una fábrica concreta especifique sus productos. Si bien esta implementación es sencilla, requiere una nueva subclase fábrica concreta para cada familia de productos, incluso aunque las familias de productos difieran ligeramente. 214 | 215 | Prototype:: para el caso de que sea posible tener muchas familias de productos. La fábrica concreta se inicializa con una instancia prototípica de cada producto de la familia, y crea un nuevo producto clonando su prototipo. El enfoque basado en prototipos elimina la necesidad de una nueva clase de fábrica concreta para cada nueva familia de productos. 216 | 217 | ==== Comparativa 218 | 219 | Abstract Factory vs Builder:: 220 | Se parecen en que pueden construir objetos complejos. 221 | La principal diferencia es que el patrón Builder se centra en construir un objeto complejo paso a paso. Abstract Factory hace hincapié en familias de objetos “producto” (simples o complejos). 222 | Builder devuelve el producto como paso final, mientras que Abstract Factory lo devuelve inmediatamente. 223 | 224 | Abstract Factory vs Facade:: 225 | Abstract Factory también puede ser una alternativa a Facade para ocultar clases específicas de una plataforma proporcionando una interfaz para crear el subsistema de objetos de forma independiente a otros subsistemas. 226 | 227 | == Consecuencias 228 | 229 | - El patrón Abstract Factory ayuda a controlar las clases de objetos que crea una aplicación. Como una fábrica encapsula la responsabilidad y el proceso de creación de objetos producto, aísla a los clientes de las clases de implementación. Los clientes manipulan las instancias a través de sus interfaces abstractas. Los nombre de las clases producto quedan aisladas en la implementación de la fábrica concreta; no aparecen en el código cliente. 230 | 231 | - La clase de una fábrica concreta sólo aparece una vez en una aplicación – cuando se crea-. Esto facilita cambiar la fábrica concreta que usa una aplicación. Como una fábrica abstracta crea una familia completa de productos, toda la familia de productos cambia de una vez. 232 | 233 | - Cuando se diseñan objetos producto en una familia para trabajar juntos, es importante que una aplicación use objetos de una sola familia a la vez. Abstract Factory facilita que se cumpla esta restricción. 234 | 235 | - Ampliar las fábricas abstractas para producir nuevos tipo de productos no es fácil. Esto se debe a que la interfaz AbstractFactory fija el conjunto de productos que se pueden crear. Permitir nuevos tipos de productos requiere ampliar la interfaz de la fábrica, lo que a su vez implica cambiar la clase AbstractFactory y todas sus subclases. 236 | -------------------------------------------------------------------------------- /previos/patron.adoc: -------------------------------------------------------------------------------- 1 | = *XXX* 2 | 3 | == Problema 4 | 5 | === Motivación: ¿Por qué? 6 | 7 | *_Ejemplo_*: _xxx_ 8 | 9 | [plantuml,xxxBad,svg] 10 | .... 11 | class xxx 12 | .... 13 | 14 | *_Ejemplo_*: _xxx_ 15 | 16 | [cols="10, 70, 20", options="header"] 17 | |=== 18 | | Diseño 19 | | Descripción 20 | | Smell code 21 | 22 | | *Cohesión* 23 | | _xxx_ 24 | | xxx 25 | 26 | | *Acoplamiento* 27 | | _xxx_ 28 | | xxx 29 | 30 | | *Tamaño* 31 | | _xxx_ 32 | | xxx 33 | |=== 34 | 35 | [cols="53,47"] 36 | |=== 37 | a| *Problemas de Diseño* 38 | a| el diseño es _difícil_ y _reutilizable_ es incluso _más difícil_ 39 | 40 | | Encontrar objetos apropiados 41 | | Cohesión 42 | 43 | | Relacionar Estructuras del Tiempo de Compilación y de Ejecución 44 | | Acoplamiento 45 | 46 | | Determinar la granularidad de los objetos 47 | | Tamaño 48 | 49 | | Especificar interfaces de objetos 50 | | Abstracción 51 | 52 | | Especificar la Implementación de Objetos 53 | | Implementación 54 | 55 | | Poner a funcionar los mecanismos de reutilización 56 | | Reusabilidad por composición, herencia y/o parametrización 57 | 58 | |=== 59 | 60 | [cols="45,55"] 61 | |=== 62 | a| *Problemas de Rediseño* 63 | a| el diseño debería ser _específico_ para el problema _actual_ pero también en _general_ para direccionar _futuros_ problemas y requisitos y, así, evitar rediseños o al menos minimizarlos 64 | 65 | | Crear un objeto _especificando su clase explícitamente_ 66 | | Acoplamiento 67 | 68 | | _Dependencias de las representaciones o implementaciones_ de objetos 69 | | Acoplamiento 70 | 71 | | _Dependencias de plataformas_ hardware o software 72 | | Acoplamiento 73 | 74 | | _Dependencias de operaciones_ concretas 75 | | Acoplamiento 76 | 77 | | _Dependencias algorítmicas_ 78 | | Acoplamiento 79 | 80 | | _Fuerte acoplamiento_ 81 | | Acoplamiento 82 | 83 | | Añadir _funcionalidad mediante herencia_ 84 | | Principio Abierto/Cerrardo 85 | 86 | | _Incapacidad para modificar las clases_ convenientemente 87 | | Principio Abierto/Cerrardo 88 | 89 | |=== 90 | 91 | === Intención: ¿Para qué? 92 | 93 | *_Ejemplo_*: _xxx_ 94 | 95 | [plantuml,xxxGood,svg] 96 | .... 97 | class xxx 98 | .... 99 | 100 | [cols="10, 90", options="header"] 101 | |=== 102 | | Diseño 103 | | Descripción 104 | 105 | | *Cohesión* 106 | | _xxx_ 107 | 108 | | *Acoplamiento* 109 | | _xxx_ 110 | 111 | | *Tamaño* 112 | | _xxx_ 113 | |=== 114 | 115 | [cols="20,80"] 116 | |=== 117 | a| *Propósito* 118 | | qué hace 119 | 120 | | Patrón Creacional 121 | | creación de objetos 122 | 123 | | Patrón Estructural 124 | | composición estrucutras complejas 125 | 126 | | Patrón de Comportamiento 127 | | composición interaccones complejas 128 | 129 | |=== 130 | 131 | === Aplicabilidad: ¿Cuándo? 132 | 133 | - xxx 134 | 135 | == Solución: ¿Cómo? 136 | 137 | === Estructura 138 | 139 | [plantuml,xxxPattern,svg] 140 | .... 141 | class xxx 142 | .... 143 | 144 | === Participantes 145 | - xxx 146 | 147 | === Relaciones 148 | 149 | xxx:: xxx 150 | 151 | ==== Comparativa 152 | 153 | xxx vs xxx:: 154 | xxx 155 | 156 | == Consecuencias 157 | 158 | - xxx -------------------------------------------------------------------------------- /previos/singleton.adoc: -------------------------------------------------------------------------------- 1 | = Singleton 2 | 3 | ==== *Nombre* 4 | 5 | ===== Nombre 6 | 7 | 8 | - _Ejemplo_: *_Singleton_* 9 | * _Solitario, solo, solterón, , ..._ (https://www.wordreference.com/es/translation.asp?tranword=singleton[*wordreference*]) 10 | 11 | ===== Sinónimos 12 | 13 | - _Ejemplo_: *_Singleton_* 14 | * _No tiene_ 15 | 16 | ==== *Problema* 17 | 18 | ===== Motivación 19 | 20 | 21 | - _Ejemplo_: *_Singleton_* 22 | * _Para algunas clases es importante tener exactamente una instancia._ 23 | ** _Aunque haya muchas impresoras en un sistema, debería haber una única cola de impresión._ 24 | ** _Debería haber un solo sistema de ficheros y un solo gestor de ventanas._ 25 | ** _Un filtro digital tendría un único convertidor analógico/digital._ 26 | ** _Un sistema de cuentas bancarias será dedicado para servir a una compañía_ 27 | 28 | ===== Intención 29 | 30 | - _Ejemplo_: *_Singleton_* 31 | 32 | [quote, Gamma et al, Patrones de Diseño] 33 | *Asegurar que una clase tenga una sola instancia y proveer un punto de acceso global para ésta.* 34 | 35 | ===== Aplicabilidad 36 | 37 | - _Ejemplo_: *_Singleton_* 38 | * _Debe ser exactamente una única instancia de la clase y debe ser accesible a los clientes desde un punto de acceso bien conocido._ 39 | * _Cuando la única instancia debería ser extensible por sub-clasificación y los clientes deberían ser capaces de usar la instancia extendida sin modificar su código_ 40 | 41 | 42 | ==== *Solución* 43 | 44 | - La solución describe los elementos que llevan a cabo el diseño, sus relaciones, responsabilidades y colaboraciones. 45 | - La solución no describe un diseño o implementación concreta particular porque un patrón es como una plantilla que puede ser aplicada en muchas situaciones diferentes 46 | - En lugar de ello, el patrón proporciona una descripción abstracta de un problema de diseño y cómo la estructura general de elementos resuelve (clases y objetos en nuestro caso). 47 | 48 | ===== Estructura 49 | 50 | - _Ejemplo_: *_Singleton_* 51 | 52 | ===== Participantes 53 | 54 | - _Ejemplo_: *_Singleton_* 55 | * _Singleton define una operación Instance que permite a los clientes acceder a su única instancia._ 56 | ** _Instance es una operación de clase (o sea, un método de clase en Smalltalk y un función miembro estática en C++)_ 57 | 58 | ===== Colaboraciones 59 | 60 | - _Ejemplo_: *_Singleton_* 61 | * _Los clientes acceden a la instancia única a través de la operación Instance de Singleton_ 62 | 63 | ===== Implementación 64 | 65 | - _Ejemplo_: *_Singleton_* 66 | 67 | ===== Código de ejemplo 68 | 69 | - _Ejemplo_: *_Singleton_* 70 | 71 | ===== Usos conocidos 72 | 73 | - _Ejemplo_: *_Singleton_* 74 | * _ChangeSet int Smalltalk-80_ 75 | * _Session y WidgetKit en InterViews_ 76 | 77 | ===== Patrones relacionados 78 | 79 | - _Ejemplo_: *_Singleton_* 80 | * _Abstract Factory_ 81 | * _Builder_ 82 | * _Prototype_ 83 | 84 | 85 | ==== *Consecuencias* 86 | 87 | - _Ejemplo_: *_Singleton_* 88 | * _Acceso controlado a una única instancia. Como la clase encapsula su única instancia, puede tener un control estricto sobre cómo y cuándo los clientes acceden a ésta._ 89 | * _Reducir el espacio de nombres. Es una mejora sobre las variables globales ya que se evita contaminar el espacio de nombres con las variables globales que almacenen las instancias únicas._ 90 | * _Permite el refinamiento de operaciones y su representación. Se pueden tener subclases y es fácil configurar una aplicación con una instancia de esta clase extendida que se necesite en tiempo de ejecución._ 91 | * _Permite un número variable de instancias. Facilita cambiar de opinión y permitir más de una instancia de la clase. Además, se puede utilizar el mismo enfoque para controlar el número de instancias que utiliza la aplicación._ 92 | * _Más flexible que operaciones de clase (static). Esta técnica hace que sea difícil cambiar un diseño para permitir más de una instancia de una clase. Y las subclases no pueden redefinirlas polimórficamente_ 93 | 94 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user guide at https://docs.gradle.org/4.7/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = 'asciidoctor-amazon-templates' 11 | -------------------------------------------------------------------------------- /src/docs/asciidoc/epubStyle/epub3-css3-only.css: -------------------------------------------------------------------------------- 1 | /* Gitden & Namo default to 16px font-size; bump it to 20px (125%) */ 2 | body.gitden-reader, 3 | body.namo-epub-library { 4 | font-size: 125%; 5 | } 6 | 7 | /* Gitden doesn't give us much margin, so let's match Kindle */ 8 | body.gitden-reader { 9 | margin: 0 25pt; 10 | } 11 | 12 | /* Namo has the same margin problem, except setting side margins doesn't work */ 13 | /*body.namo-epub-library > section.chapter { 14 | margin: 0 25pt; 15 | }*/ 16 | 17 | /* Use tighter margins and smaller font (18px) on phones (Nexus 4 and smaller) */ 18 | @media only screen and (max-device-width: 768px) and (max-device-height: 1280px), 19 | only screen and (max-device-width: 1280px) and (max-device-height: 768px) { 20 | body.gitden-reader, 21 | body.namo-epub-library { 22 | font-size: 112.5%; 23 | } 24 | 25 | body.gitden-reader { 26 | margin: 0 5pt; 27 | } 28 | 29 | /*body.namo-epub-library > section.chapter { 30 | margin: 0 5pt; 31 | }*/ 32 | } 33 | 34 | body h1, body h2, body h3:not(.list-heading), body h4, body h5, body h6, 35 | h1 :not(code), h2 :not(code), h3:not(.list-heading) :not(code), h4 :not(code), h5 :not(code), h6 :not(code) { 36 | /* !important required to override custom font setting in Kindle / Gitden / Namo */ 37 | /* Gitden requires the extra weight of a parent selector; it also makes headings bold when custom font is specified */ 38 | /* Kindle and Gitden require the override on heading child elements */ 39 | font-family: "M+ 1p", sans-serif !important; 40 | } 41 | 42 | /* QUESTION what about nested elements inside code? */ 43 | body code, body kbd, body pre, pre :not(code) { 44 | /* !important required to override custom font setting in Kindle / Gitden / Namo */ 45 | /* Gitden requires the extra weight of a parent selector */ 46 | /* Kindle and Gitden require the override on pre child elements */ 47 | font-family: "M+ 1mn", monospace !important; 48 | } 49 | 50 | @media amzn-kf8 { 51 | /* Kindle does its own margin management, so don't use an explicit margin */ 52 | /*body { 53 | margin: 0 !important; 54 | }*/ 55 | 56 | /* text-rendering is the only way to enable kerning in Kindle (and Calibre, though it seems to kern automatically) */ 57 | /* personally, I think Kindle overdoes kerning, but we're running with it for now */ 58 | /* text-rendering: optimizeLegibility kills certain Kindle eInk devices */ 59 | /*h1, h2, h3, h4, h5, h6, 60 | body p, li, dd, blockquote > footer, 61 | th, td, figcaption, caption { 62 | text-rendering: optimizeLegibility; 63 | }*/ 64 | 65 | /* hack line height of subtitle using floats on Kindle */ 66 | h1.chapter-title .subtitle { 67 | margin-top: -0.2em; 68 | margin-bottom: 0.3em; /* compensate for reduced line height */ 69 | } 70 | 71 | /* NOTE using b instead of span since Firefox ePubReader applies immutable styles to span */ 72 | h1.chapter-title .subtitle > b { 73 | float: left; 74 | display: inline-block; 75 | margin-bottom: -0.3em; /* reduce the line height */ 76 | padding-right: 0.2em; /* spacing between words */ 77 | } 78 | 79 | h1.chapter-title .subtitle > b:last-child { 80 | padding-right: 0; 81 | } 82 | 83 | h1.chapter-title .subtitle::after { 84 | display: table; 85 | content: ' '; 86 | clear: both; 87 | } 88 | } 89 | 90 | .chapter-header p.byline { 91 | height: auto; /* Aldiko requires this value to be 0; reset it for all others */ 92 | } 93 | 94 | /* Font-based icons */ 95 | .icon { 96 | display: inline-block; 97 | /* !important required to override custom font setting in Kindle (since .icon can appear inside a span) */ 98 | font-family: "FontAwesome" !important; 99 | font-style: normal !important; 100 | font-weight: normal !important; 101 | line-height: 1; 102 | } 103 | 104 | .icon-1_5x { 105 | padding: 0 0.25em; 106 | -webkit-transform: scale(1.5, 1.5); 107 | transform: scale(1.5, 1.5); 108 | } 109 | 110 | .icon-2x { 111 | padding: 0 0.5em; 112 | -webkit-transform: scale(2, 2); 113 | transform: scale(2, 2); 114 | } 115 | 116 | .icon-small { 117 | font-size: 0.85em; 118 | vertical-align: 0.075em; 119 | } 120 | 121 | .icon-1_5em { 122 | font-size: 1.5em; 123 | } 124 | 125 | .icon-2em { 126 | font-size: 2em; 127 | } 128 | 129 | .icon-3em { 130 | font-size: 3em; 131 | } 132 | 133 | .icon-4em { 134 | font-size: 4em; 135 | } 136 | 137 | .icon-rotate-90 { 138 | -webkit-transform: rotate(90deg); 139 | transform: rotate(90deg); 140 | } 141 | 142 | .icon-rotate-90i { 143 | -webkit-transform: scale(-1, 1) rotate(90deg); 144 | transform: scale(-1, 1) rotate(90deg); 145 | } 146 | 147 | .icon-rotate-180 { 148 | -webkit-transform: rotate(180deg); 149 | transform: rotate(180deg); 150 | } 151 | 152 | .icon-rotate-180i { 153 | -webkit-transform: scale(-1, 1) rotate(180deg); 154 | transform: scale(-1, 1) rotate(180deg); 155 | } 156 | 157 | .icon-rotate-270 { 158 | -webkit-transform: rotate(270deg); 159 | transform: rotate(270deg); 160 | } 161 | 162 | .icon-rotate-270i { 163 | -webkit-transform: scale(-1, 1) rotate(270deg); 164 | transform: scale(-1, 1) rotate(270deg); 165 | } 166 | 167 | .icon-flip-h { 168 | -webkit-transform: scale(-1, 1); 169 | transform: scale(-1, 1); 170 | } 171 | 172 | .icon-flip-v { 173 | -webkit-transform: scale(1, -1); 174 | transform: scale(1, -1); 175 | } 176 | -------------------------------------------------------------------------------- /src/docs/asciidoc/epubStyle/epub3.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Noto Serif"; 3 | font-style: normal; 4 | font-weight: normal; 5 | src: url(../fonts/notoserif-regular-latin.ttf); 6 | } 7 | 8 | @font-face { 9 | font-family: "Noto Serif"; 10 | font-style: italic; 11 | font-weight: normal; 12 | src: url(../fonts/notoserif-italic-latin.ttf); 13 | } 14 | 15 | @font-face { 16 | font-family: "Noto Serif"; 17 | font-style: normal; 18 | font-weight: bold; 19 | src: url(../fonts/notoserif-bold-latin.ttf); 20 | } 21 | 22 | @font-face { 23 | font-family: "Noto Serif"; 24 | font-style: italic; 25 | font-weight: bold; 26 | src: url(../fonts/notoserif-bolditalic-latin.ttf); 27 | } 28 | 29 | /* NOTE: use numeric font weights for M+ 1p since we're using weight variations */ 30 | @font-face { 31 | font-family: "M+ 1p"; 32 | font-style: normal; 33 | font-weight: 400; 34 | src: url(../fonts/mplus1p-regular-latin.ttf); 35 | } 36 | 37 | @font-face { 38 | font-family: "M+ 1p"; 39 | font-style: normal; 40 | font-weight: 200; 41 | src: url(../fonts/mplus1p-light-latin.ttf); 42 | } 43 | 44 | @font-face { 45 | font-family: "M+ 1p"; 46 | font-style: normal; 47 | font-weight: 700; 48 | src: url(../fonts/mplus1p-bold-latin.ttf); 49 | } 50 | 51 | @font-face { 52 | font-family: "M+ 1mn"; 53 | font-style: normal; 54 | font-weight: normal; 55 | src: url(../fonts/mplus1mn-regular-ascii-conums.ttf); 56 | } 57 | 58 | @font-face { 59 | font-family: "M+ 1mn"; 60 | font-style: italic; 61 | font-weight: normal; 62 | /* actually the M+ 1mn light font repurposed using FontForge to stand-in for Italic */ 63 | src: url(../fonts/mplus1mn-italic-ascii.ttf); 64 | } 65 | 66 | @font-face { 67 | font-family: "M+ 1mn"; 68 | font-style: normal; 69 | font-weight: bold; 70 | /* actually the M+ 1mn medium font repurposed using FontForge to stand-in for Bold */ 71 | src: url(../fonts/mplus1mn-bold-ascii.ttf); 72 | } 73 | 74 | @font-face { 75 | font-family: "M+ 1mn"; 76 | font-style: italic; 77 | font-weight: bold; 78 | /* actually the M+ 1mn bold font repurposed using FontForge to stand-in for Bold Italic */ 79 | src: url(../fonts/mplus1mn-bolditalic-ascii.ttf); 80 | } 81 | 82 | @font-face { 83 | font-family: "FontAwesome"; 84 | font-style: normal; 85 | font-weight: normal; 86 | src: url(../fonts/fontawesome-icons.ttf); 87 | } 88 | 89 | @font-face { 90 | font-family: "FontIcons"; 91 | font-style: normal; 92 | font-weight: normal; 93 | src: url(../fonts/assorted-icons.ttf); 94 | } 95 | 96 | *, *:before, *:after { 97 | box-sizing: border-box; 98 | } 99 | 100 | /* educate older readers about tags introduced in HTML5 */ 101 | article, aside, details, figcaption, figure, 102 | footer, header, nav, section, summary { 103 | display: block; 104 | } 105 | 106 | /* html and body declarations must be separate entries for some readers */ 107 | html { 108 | margin: 0 !important; 109 | padding: 0 !important; 110 | /* set the em base (and relative em anchor) by setting the font-size on html */ 111 | /* TODO set font-size > 100% except for Kindle */ 112 | font-size: 100%; 113 | -webkit-text-size-adjust: 100%; 114 | } 115 | 116 | /* don't set margin on body as that's how many readers frame reading area */ 117 | /* can't set the font-family on body in Kindle */ 118 | body { 119 | padding: 0 !important; 120 | /* add margin to ~ match Kindle's narrow setting */ 121 | /* don't use !important on margin as it breaks calibre */ 122 | margin: 0; 123 | font-size: 100%; 124 | /* NOTE putting optimizeLegibility on the body slows down rendering considerably */ 125 | text-rendering: optimizeSpeed; 126 | /* -webkit-font-smoothing has no noticable effect and is controversial, so leaving it off */ 127 | } 128 | 129 | /* disables night mode in Aldiko, hoo-ha! */ 130 | html body { 131 | background-color: #FFFFFF; 132 | } 133 | 134 | /* sets minimum margin permitted */ 135 | /* @page not supported by Kindle or GitDen */ 136 | @page { 137 | /* push the top & bottom margins down in Aldiko to emulate Kindle (Kindle uses ~ 10% of screen by default )*/ 138 | margin: 1cm; 139 | } 140 | 141 | div, p, blockquote, pre, figure, figcaption, 142 | h1, h2, h3, h4, h5, h6, 143 | dl, dt, dd, ol, ul, li, 144 | table, caption, thead, tfoot, tbody, tr, th, td { 145 | margin: 0; 146 | padding: 0; 147 | font-size: 100%; 148 | vertical-align: baseline; 149 | } 150 | 151 | a, abbr, address, cite, code, em, kbd, span, strong { 152 | font-size: 100%; 153 | } 154 | 155 | a { 156 | background: transparent; 157 | } 158 | 159 | a:active, a:hover { 160 | outline: 0; 161 | } 162 | 163 | abbr[title] { 164 | border-bottom: 1px dotted; 165 | } 166 | 167 | address { 168 | white-space: pre-line; 169 | } 170 | 171 | b, strong { 172 | font-weight: bold; 173 | } 174 | 175 | b.button { 176 | font-weight: normal; 177 | text-shadow: 1px 0 0 #B3B3B1; 178 | color: #191918; 179 | white-space: nowrap; 180 | } 181 | 182 | b.button .label { 183 | padding: 0 0.25em; 184 | } 185 | 186 | kbd { 187 | display: inline-block; 188 | font-size: 0.8em; 189 | line-height: 1; 190 | background-color: #F7F7F7; /* #FAFAFA */ 191 | border: 1px solid #BEBEBC; 192 | -webkit-border-radius: 3px; 193 | border-radius: 3px; 194 | -webkit-box-shadow: 1px 1px 0 rgba(102, 102, 101, 0.25), 0 0 0 1px white inset; 195 | box-shadow: 1px 1px 0 rgba(102, 102, 101, 0.25), 0 0 0 1px white inset; 196 | margin: 0 0.15em; 197 | padding: 0.25em 0.4em 0.2em 0.4em; 198 | vertical-align: 0.15em; 199 | } 200 | 201 | .keyseq { 202 | white-space: nowrap; 203 | } 204 | 205 | .menuseq .caret { 206 | /* 207 | font-family: "FontAwesome"; 208 | font-size: 0.7em; 209 | line-height: 1; 210 | font-weight: bold; 211 | vertical-align: 0.08rem; 212 | */ 213 | 214 | font-weight: bold; 215 | } 216 | 217 | .menuseq span[class~="caret"] { 218 | visibility: hidden; 219 | } 220 | 221 | .menuseq .caret::before { 222 | font-family: "FontAwesome"; 223 | content: "\f054"; 224 | font-size: 0.6em; 225 | vertical-align: 0.15em; 226 | visibility: visible; 227 | display: inline-block; 228 | width: 0; 229 | padding-right: 0.15em; 230 | } 231 | 232 | img { 233 | border: 0; 234 | } 235 | 236 | mark { 237 | background-color: #FFC14F; 238 | color: #191918; 239 | } 240 | 241 | small { 242 | font-size: 80%; 243 | } 244 | 245 | sub, sup { 246 | font-size: 0.75em; 247 | line-height: 1; 248 | } 249 | 250 | sup { 251 | /* position: relative not permitted on Kindle */ 252 | /* 253 | position: relative; 254 | top: -0.5em; 255 | */ 256 | /* alternate approach #1 */ 257 | /* 258 | display: inline-block; 259 | vertical-align: text-top; 260 | padding-top: .25em; 261 | */ 262 | /* alternate approach #2 */ 263 | line-height: 1; 264 | vertical-align: text-top; 265 | } 266 | 267 | sub { 268 | /* position: relative not permitted on Kindle */ 269 | /* 270 | position: relative; 271 | bottom: -0.25em; 272 | */ 273 | /* alternate approach #1 */ 274 | /* 275 | display: inline-block; 276 | vertical-align: text-bottom; 277 | padding-bottom: .5em; 278 | */ 279 | /* alternate approach #2 */ 280 | line-height: 1; 281 | vertical-align: text-bottom; 282 | } 283 | 284 | table { 285 | border-collapse: collapse; 286 | border-spacing: 0; 287 | } 288 | 289 | td, th { 290 | padding: 0; 291 | } 292 | 293 | body a:link { 294 | color: #333332; 295 | /* hack for font color in iBooks and Gitden (though Gitden would accept color !important too) */ 296 | -webkit-text-fill-color: #333332; 297 | /* Kindle requires the !important on text-decoration */ 298 | /* In night mode, the only indicator of a link is the underline, so we need it or a background image */ 299 | text-decoration: none !important; 300 | border-bottom: 1px dashed #666665; 301 | /* allow URLs to break anywhere if they don't fit on a line; but how do we know it's a URL? */ 302 | /* 303 | word-break: break-all; 304 | */ 305 | } 306 | 307 | body:first-of-type a:link { 308 | border-bottom: none; 309 | background-repeat: no-repeat; 310 | background-image: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, #666665 5%, #666665 95%, rgba(255,255,255,0) 100%); 311 | background-image: linear-gradient(to right, rgba(255,255,255,0) 0%, #666665 5%, #666665 95%, rgba(255,255,255,0) 100%); 312 | background-size: 100% 1px; 313 | background-position: 0 1.2em; 314 | } 315 | 316 | body a:visited { 317 | color: #666665; 318 | /* hack for font color in iBooks */ 319 | -webkit-text-fill-color: #666665; 320 | } 321 | 322 | code.literal { 323 | /* don't let it affect line spacing */ 324 | /* disable since M+ 1mn won't interrupt line height */ 325 | /*line-height: 1;*/ 326 | /* 327 | white-space: nowrap; 328 | */ 329 | word-wrap: break-word; 330 | } 331 | 332 | h1, h2, h3, h4, h5, h6 { 333 | font-family: "M+ 1p", sans-serif; 334 | font-weight: 400; 335 | letter-spacing: -0.01em; 336 | /* NOTE Kindle doesn't allow the line-height to be less than the font size (refer to heading font sizes) */ 337 | line-height: 1.4; /* or 1.2125 */ 338 | text-align: left; 339 | 340 | -webkit-hyphens: none; /* disable hyphenation where supported (e.g., iBooks) */ 341 | word-wrap: break-word; /* break in middle of long word if no other break opportunities are available */ 342 | 343 | /* avoiding page breaks does not seem to work in Kindle */ 344 | page-break-inside: avoid; 345 | page-break-after: avoid; 346 | } 347 | 348 | /* Aldiko requires a higher precedence rule to set margin and text-indent, hence the body prefix */ 349 | /* We'll just use the stronger rule for all paragraph-related stuff to be sure */ 350 | body p { 351 | margin: 1em 0 0 0; 352 | text-align: justify; 353 | text-indent: 0; 354 | 355 | widows: 2; 356 | orphans: 2; 357 | } 358 | 359 | body p, 360 | ul, ol, li, dl, dt, dd, footer, 361 | div.verse .attribution, table.table th, table.table td, 362 | figcaption, caption { 363 | color: #333332; 364 | /* NOTE iBooks will forcefully override font-family of text inside div, p and span elements when font other than Original is selected */ 365 | /* NOTE iBooks honors Original font for prose text if declared in display-options.xml */ 366 | font-family: "Noto Serif", serif; 367 | } 368 | 369 | body p, li, dt, dd, footer { 370 | line-height: 1.6; 371 | } 372 | 373 | code, kbd, pre { 374 | color: #191918; 375 | font-family: "M+ 1mn", monospace; 376 | -webkit-hyphens: none; /* disable hyphenation where supported (e.g., iBooks) */ 377 | } 378 | 379 | /* QUESTION should we kern preformatted text blocks? */ 380 | h1, h2, h3, h4, h5, h6, 381 | body p, li, dd, blockquote > footer, 382 | th, td, figcaption, caption { 383 | /* forward-compatible CSS to enable kerning (if we want ligatures, add "liga" and "dlig") */ 384 | /* WebKits that don't recognize these properties don't kern well, hence why we don't simply enable kerning via text-rendering */ 385 | -webkit-font-feature-settings: "kern"; 386 | font-feature-settings: "kern"; 387 | font-kerning: normal; 388 | /* NOTE see Kindle hack in epub3-css3-only.css for additional kerning settings (disabled) */ 389 | } 390 | 391 | p.last::after { 392 | color: #57AD68; 393 | display: inline-block; 394 | font-family: "FontAwesome"; 395 | font-size: 1em; 396 | content: "\f121"; /* i.e., */ 397 | margin-left: 0.25em; 398 | } 399 | 400 | ul li, ol li { 401 | /* minimum margin in case there is no paragraph content */ 402 | margin-top: 0.4em; 403 | } 404 | 405 | /* use paragraph-size gaps between list items */ 406 | .complex > ul > li, 407 | .complex > ol > li { 408 | margin-top: 1em; 409 | } 410 | 411 | /* squeeze content in complex lists */ 412 | /* 413 | li > figure, 414 | li > p { 415 | margin-top: 0.4em; 416 | } 417 | */ 418 | 419 | dl { 420 | margin-top: 0; 421 | margin-bottom: 0; 422 | } 423 | 424 | dt { 425 | page-break-inside: avoid; 426 | page-break-after: avoid; 427 | } 428 | 429 | dt > span.term { 430 | font-style: italic; 431 | } 432 | 433 | /* 434 | dt > span.term > code.literal { 435 | font-style: normal; 436 | } 437 | */ 438 | 439 | dt { 440 | margin-top: 0.75em; /* balances 0.25em to term */ 441 | } 442 | 443 | dl dd { 444 | /* minimum margin in case there is no paragraph content */ 445 | margin-top: 0.25em; 446 | } 447 | 448 | div.callout-list { 449 | margin-top: 0.5em; 450 | } 451 | 452 | div.callout-list ol { 453 | font-size: 80%; 454 | margin-left: 1.5em !important; 455 | list-style-type: none; 456 | } 457 | 458 | div.callout-list ol li { 459 | text-align: left; 460 | } 461 | 462 | i.conum { 463 | color: #468C54; 464 | font-family: "M+ 1mn", monospace; 465 | font-style: normal; 466 | } 467 | 468 | /* don't let conum affect line spacing; REVIEW may not need this! */ 469 | /*pre i.conum { 470 | line-height: 1; 471 | }*/ 472 | 473 | div.callout-list li > i.conum { 474 | float: left; 475 | margin-left: -1.25em; 476 | display: block; 477 | width: 1.25em; 478 | } 479 | 480 | div.itemized-list, div.ordered-list, div.description-list { 481 | margin-top: 1em; 482 | padding-bottom: 0.25em; /* REVIEW maybe, maybe not */ 483 | } 484 | 485 | /* QUESTION should we add the class "list" so we can style these generically? */ 486 | div.itemized-list div.itemized-list, 487 | div.itemized-list div.ordered-list, 488 | div.itemized-list div.description-list, 489 | div.ordered-list div.itemized-list, 490 | div.ordered-list div.ordered-list, 491 | div.ordered-list div.description-list { 492 | margin-top: 0; 493 | } 494 | 495 | /*div.description-list div.itemized-list, 496 | div.description-list div.ordered-list, 497 | div.description-list div.description-list { 498 | }*/ 499 | 500 | h3.list-heading { 501 | font-size: 1em; 502 | font-family: "Noto Serif", serif; 503 | font-weight: bold; 504 | line-height: 1.6; 505 | margin-top: 1em; 506 | margin-bottom: -0.25em; 507 | letter-spacing: 0; 508 | } 509 | 510 | div.stack li strong.subject, 511 | div.stack-subject li strong.subject { 512 | display: block; 513 | } 514 | 515 | ul { 516 | /* QUESTION do we need important here? */ 517 | margin-left: 1em !important; 518 | list-style-type: square; 519 | } 520 | 521 | ul ul { 522 | list-style-type: circle; 523 | } 524 | 525 | ul ul ul { 526 | list-style-type: disc; 527 | } 528 | 529 | /* disable list style type for CSS3-enabled clients */ 530 | body:first-of-type ul, 531 | body:first-of-type ul ul, 532 | body:first-of-type ul ul ul { 533 | list-style-type: none; 534 | } 535 | 536 | ul > li::before { 537 | float: left; 538 | margin-left: -1em; 539 | margin-top: -0.05em; 540 | padding-left: 0.25em; 541 | /* guarantee it's out of the flow */ 542 | width: 0; 543 | display: block; 544 | } 545 | 546 | ul > li::before { 547 | content: "\25AA"; /* small black square */ 548 | color: #666665; 549 | } 550 | 551 | ul ul > li::before { 552 | content: "\25E6"; /* small white circle */ 553 | color: #57AD68; 554 | } 555 | 556 | ul ul ul > li::before { 557 | content: "\2022"; /* small black circle */ 558 | color: #666665; 559 | } 560 | 561 | ul ul ul ul > li::before { 562 | content: "\25AB"; /* small white square */ 563 | color: #57AD68; 564 | } 565 | 566 | ol { 567 | margin-left: 1.75em !important; 568 | } 569 | 570 | ol { 571 | list-style-type: decimal; 572 | } 573 | 574 | ol ol { 575 | list-style-type: lower-alpha; 576 | } 577 | 578 | ol ol ol { 579 | list-style-type: lower-roman; 580 | } 581 | 582 | /* REVIEW */ 583 | dd { 584 | margin-left: 1.5rem !important; 585 | } 586 | 587 | /* Kindle does not justify list-item element, must wrap in nested block element */ 588 | li > span.principal, dd > span.principal { 589 | display: block; 590 | text-align: justify; 591 | } 592 | 593 | ol.brief > li > span.principal, 594 | ul.brief > li > span.principal { 595 | text-align: left; 596 | } 597 | 598 | /* REVIEW still considering keeping this one */ 599 | /* disable justify within a link */ 600 | /* 601 | li strong.subject a:link { 602 | white-space: pre-wrap; 603 | word-spacing: 0.1em; 604 | }*/ 605 | 606 | /* 607 | .bibliography ul li, 608 | .references ul li { 609 | text-align: left; 610 | } 611 | */ 612 | 613 | ul.bibliography > li > span.principal, 614 | ul.references > li > span.principal { 615 | text-align: left; 616 | } 617 | 618 | /* sized based on the major third modular scale (4:5, 16px, 24px) */ 619 | h1, h2 { 620 | color: #333332; 621 | font-size: 1.5em; 622 | word-spacing: -0.075em; 623 | margin-top: 1em; /* 1.5rem */ 624 | margin-bottom: -0.3333em; /* -0.5rem, 0.5rem to content */ 625 | } 626 | 627 | h3 { 628 | color: #333332; 629 | font-size: 1.25em; 630 | margin-top: 0.84em; /* 1.05rem */ 631 | margin-bottom: -0.5em; /* -0.625rem, 0.375rem to content */ 632 | } 633 | 634 | h4 { 635 | color: #4F4F4C; 636 | font-weight: 200; 637 | 638 | font-size: 1.1em; 639 | margin-top: 1em; /* 1.1rem */ 640 | margin-bottom: -0.818em; /* -0.9rem, 0.1rem to content */ 641 | 642 | font-size: 1.2em; 643 | margin-top: .917em; /* 1.1rem */ 644 | margin-top: 0.875em; /* 1.05rem */ 645 | /*margin-bottom: -0.75em;*/ /* -0.9rem, 0.1rem to content */ 646 | margin-bottom: -0.625em; /* -0.75rem, 0.25rem to content */ 647 | } 648 | 649 | h5 { 650 | color: #666665; 651 | /* 652 | font-size: 1em; 653 | text-transform: uppercase; 654 | margin-top: 1em; 655 | margin-bottom: -1em; 656 | */ 657 | 658 | font-size: 0.9em; 659 | font-weight: 700; 660 | text-transform: uppercase; 661 | margin-top: 1.11em; /* 1rem */ 662 | margin-bottom: -0.972em; /* -0.875rem */ 663 | } 664 | 665 | h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { 666 | color: inherit; 667 | } 668 | 669 | h5 code { 670 | text-transform: none; 671 | } 672 | 673 | /* Kindle strips (or unwraps)
tags, so we use an inner div to style */ 674 | .chapter-header { 675 | background-color: #333332; 676 | /* NOTE div must have at least 1px top padding for background to fill */ 677 | padding: 0.75em 1.5em 0.25em 1.5em; /* would like to use 1.5vh 1.5em */ 678 | margin-bottom: 2.5em; 679 | /* TODO maybe what we need to get articles to start in left column 680 | page-break-before: left; 681 | */ 682 | } 683 | 684 | h1.chapter-title { 685 | font-weight: 200; 686 | font-size: 1.2em; 687 | margin-top: 3.5em; /* 4.2rem - would like to use 9vh */ 688 | margin-bottom: 0; 689 | padding-bottom: 0.8333em; /* 1.2rem */ 690 | color: #B3B3B1; 691 | text-transform: uppercase; 692 | word-spacing: -0.075em; 693 | letter-spacing: -0.01em; 694 | border-bottom: 1px solid #DCDCDE; 695 | } 696 | 697 | h1.chapter-title .subtitle { 698 | font-weight: 400; 699 | color: #FFFFFF; 700 | display: block; 701 | font-size: 1.5em; 702 | margin: 0 0 0 0.75em; /* would like to use 2vw */ 703 | line-height: 1.2; /* line-height will remain 1.4 on Kindle, see hack in media query */ 704 | } 705 | 706 | h1.chapter-title em { 707 | color: #57AD68; 708 | font-style: normal; 709 | } 710 | 711 | h1.chapter-title b { 712 | font-weight: inherit; 713 | } 714 | 715 | .chapter-header p.byline { 716 | color: #DCDCDE; 717 | /* float left and height 0 takes this line out of the flow */ 718 | float: left; 719 | height: 0; 720 | width: 100%; 721 | text-align: right; 722 | margin-top: 0; 723 | line-height: 2; 724 | } 725 | 726 | .chapter-header p.byline b { 727 | font-weight: normal; 728 | padding-left: 0.2em; /* 0.25rem */ 729 | font-size: 0.8em; 730 | line-height: 2.5; /* 2rem */ 731 | } 732 | 733 | .chapter-header p.byline img { 734 | -webkit-border-radius: 0.5em; 735 | border-radius: 0.5em; 736 | vertical-align: middle; 737 | /* some readers like to resize images; we don't want the author images resized */ 738 | height: 2em !important; 739 | width: 2em !important; 740 | } 741 | 742 | div.abstract { 743 | margin: 5% 1.5em 2.5em 1.5em; 744 | } 745 | 746 | div.abstract > p { 747 | color: #666665; 748 | font-size: 1.05em; /* or 1.1em? */ 749 | line-height: 1.75; 750 | } 751 | 752 | div.abstract > p a:link { 753 | color: #666665; 754 | /* hack for font color in iBooks */ 755 | -webkit-text-fill-color: #666665; 756 | } 757 | 758 | div.abstract > p:first-child::first-line { 759 | font-weight: bold; 760 | -webkit-font-feature-settings: "kern" off; 761 | font-feature-settings: "kern" off; 762 | font-kerning: none; 763 | /* and for Kindle... */ 764 | text-rendering: optimizeSpeed; 765 | } 766 | 767 | div.abstract p strong { 768 | font-weight: inherit; 769 | font-style: italic; 770 | } 771 | 772 | p.lead { 773 | font-size: 1.05em; 774 | line-height: 1.75; 775 | } 776 | 777 | hr.thematicbreak { 778 | display: none; 779 | } 780 | 781 | hr.thematicbreak + p { 782 | margin-top: 1.5em; 783 | } 784 | 785 | /* TODO finish layout of first-letter */ 786 | hr.thematicbreak + p::first-letter { 787 | font-size: 200%; 788 | } 789 | 790 | p.stack > strong.head, 791 | p.stack-head > strong.head { 792 | display: block; 793 | } 794 | 795 | p.signature { 796 | font-size: 0.9em; 797 | } 798 | 799 | figure, 800 | aside.sidebar { 801 | margin-top: 1em; 802 | } 803 | 804 | /* 805 | aside.sidebar { 806 | page-break-inside: avoid; 807 | float: left; 808 | margin-bottom: 1em; 809 | } 810 | */ 811 | 812 | figure.image { 813 | page-break-inside: avoid; 814 | } 815 | 816 | figure.image img { 817 | } 818 | 819 | figure.coalesce { 820 | page-break-inside: avoid; 821 | } 822 | 823 | figcaption, 824 | caption { 825 | font-size: 0.9em; 826 | font-style: italic; 827 | color: #666665; 828 | letter-spacing: -0.01em; 829 | line-height: 1.4; 830 | text-align: left; 831 | padding-left: 0.1em; 832 | page-break-inside: avoid; 833 | page-break-after: avoid; 834 | } 835 | 836 | figure.image figcaption { 837 | padding-left: 0; 838 | margin-top: 0.2em; 839 | page-break-after: auto; 840 | } 841 | 842 | p + figure.listing, 843 | span.principal + figure.listing { 844 | margin-top: 0.75em; /* 0.75rem */ 845 | } 846 | 847 | figure.listing > pre { 848 | margin-top: 0; 849 | } 850 | 851 | /* REVIEW TODO put margin bottom on the figcaption instead */ 852 | figure.listing > figcaption + pre { 853 | margin-top: 0.294em; /* 0.25rem */ 854 | } 855 | 856 | aside.sidebar { 857 | border: 1px solid #B3B3B1; 858 | padding: 0 1.5em; 859 | font-size: 0.9em; 860 | background-color: #F2F2F2; 861 | text-align: right; /* aligns heading to right */ 862 | /* 863 | -webkit-box-shadow: 0px 1px 1px rgba(102, 102, 101, 0.15); 864 | box-shadow: 0px 1px 1px rgba(102, 102, 101, 0.15); 865 | */ 866 | } 867 | 868 | body:first-of-type aside.sidebar { 869 | background-color: rgba(0, 0, 0, 0.05); /* using transparency is night-mode friendly */ 870 | /*background-color: rgba(51, 51, 50, 0.06);*/ /* using transparency is night-mode friendly */ 871 | } 872 | 873 | /* a bit of a cheat; could use aside.sidebar[title] instead, but not on Aldiko */ 874 | aside.sidebar.titled { 875 | margin-top: 2em; 876 | } 877 | 878 | aside.sidebar > h2 { 879 | /*text-transform: uppercase;*/ /* uppercase done manually to support Aldiko */ 880 | font-size: 1em; 881 | /* 882 | font-weight: 700; 883 | */ 884 | font-weight: 400; 885 | letter-spacing: 0; 886 | display: inline-block; 887 | white-space: nowrap; /* for some reason it's wrapping prematurely */ 888 | border: 1px solid #B3B3B1; 889 | padding: 1.5em .75em .5em .75em; 890 | margin: -1em 0.5em -0.25em 0.5em; 891 | background-color: #FFFFFF; 892 | /* 893 | -webkit-box-shadow: 0px 1px 1px rgba(102, 102, 101, 0.1); 894 | box-shadow: 0px 1px 1px rgba(102, 102, 101, 0.1); 895 | */ 896 | } 897 | 898 | /* doesn't work 899 | body:first-of-type aside.sidebar > h2 { 900 | background-color: rgba(255, 255, 255, 1); 901 | } 902 | */ 903 | 904 | aside.sidebar > div.content { 905 | margin-bottom: 1em; 906 | text-align: justify; /* restore text alignment in content */ 907 | } 908 | 909 | /* QUESTION same for ordered-list? */ 910 | aside.sidebar > div.content > div.itemized-list > ul { 911 | margin-left: 0.5em !important; 912 | } 913 | 914 | div.blockquote { 915 | padding: 0 1em; 916 | margin: 1.25em auto; 917 | } 918 | 919 | /* display: table causes quotes to be repeated in Aldiko, so we hide this part */ 920 | div[class~="blockquote"] { 921 | display: table; 922 | } 923 | 924 | blockquote > p { 925 | color: #191918; 926 | font-style: italic; 927 | 928 | /* 929 | font-size: 1.2em; 930 | word-spacing: 0.1em; 931 | */ 932 | 933 | font-size: 1.15em; 934 | word-spacing: 0.1em; 935 | 936 | margin-top: 0; 937 | line-height: 1.75; 938 | } 939 | 940 | /* hide explicit open quote for CSS3-enabled clients */ 941 | blockquote span.open-quote:not(:empty) { 942 | display: none; 943 | } 944 | 945 | /* NOTE if we mapped the font icon to "\201c", we could just style the .open-quote */ 946 | blockquote > p:first-of-type::before { 947 | display: inline-block; 948 | color: #666665; 949 | text-shadow: 0 1px 2px rgba(102, 102, 101, 0.3); 950 | 951 | /* using serif quote from entypo */ 952 | font-family: "FontIcons"; 953 | 954 | /*content: "\f10e";*/ /* quote-right from Entypo */ 955 | /* 956 | -webkit-transform: rotate(180deg); 957 | transform: rotate(180deg); 958 | padding-left: .3em; 959 | padding-right: .2em; 960 | */ 961 | 962 | content: "\f10d"; /* quote-left, a flipped version of the quote-right from Entypo */ 963 | padding-right: .5em; 964 | font-size: 1.5em; 965 | line-height: 1.3; 966 | margin-top: -0.5em; 967 | vertical-align: text-bottom; 968 | } 969 | 970 | blockquote footer { 971 | font-size: 0.9em; 972 | font-style: italic; 973 | 974 | margin-top: 0.5rem; 975 | text-align: right; 976 | } 977 | 978 | blockquote footer .context { 979 | font-size: 0.9em; 980 | letter-spacing: -0.1em; 981 | color: #666665; 982 | } 983 | 984 | /* Kindle requires text-align: center on surrounding div to align image to center */ 985 | figure.image div.content { 986 | text-align: center; 987 | } 988 | 989 | /* in the event the viewer adds display: block to the image */ 990 | figure.image img { 991 | /* max-width not supported in Kindle, need to use a media query to add */ 992 | /*max-width: 95%;*/ 993 | margin: 0 auto; 994 | } 995 | 996 | pre { 997 | text-align: left; /* fix for Namo */ 998 | margin-top: 1em; /* 0.85rem */ 999 | /*margin-top: 1.176em;*/ /* 1rem */ 1000 | white-space: pre-wrap; 1001 | /*word-break: break-all;*/ /* break at the end of the line, no matter what */ 1002 | word-wrap: break-word; /* break in middle of long word if no other break opportunities are available */ 1003 | font-size: 0.85em; 1004 | line-height: 1.4; /* matches what Kindle uses and can't go less */ 1005 | background-color: #F2F2F2; 1006 | padding: 0.5rem 0.75rem; 1007 | /* 1008 | border-top: 3px solid #DCDCDE; 1009 | */ 1010 | /* QUESTION #B3B3B1? */ 1011 | border-top: 1px solid #DCDCDE; 1012 | border-right: 1px solid #DCDCDE; 1013 | } 1014 | 1015 | body:first-of-type pre { 1016 | background-color: rgba(0, 0, 0, 0.05); /* using transparency is night-mode friendly */ 1017 | /*background-color: rgba(51, 51, 50, 0.06);*/ /* using transparency is night-mode friendly */ 1018 | } 1019 | 1020 | /* TODO what we really want is for pre w/o caption to be unbreakable */ 1021 | pre.screen { 1022 | /* 1023 | page-break-inside: avoid; 1024 | */ 1025 | orphans: 3; 1026 | widows: 3; /* widows doesn't seem to work here */ 1027 | } 1028 | 1029 | pre.source { 1030 | orphans: 3; 1031 | widows: 3; /* widows doesn't seem to work here */ 1032 | } 1033 | 1034 | div.verse { 1035 | page-break-inside: avoid; 1036 | } 1037 | 1038 | /* TODO we may want to reenable hyphens here, but not for kf8 */ 1039 | div.verse > pre { 1040 | background-color: transparent; 1041 | border: none; 1042 | font-size: 1.2em; 1043 | text-align: center; 1044 | } 1045 | 1046 | div.verse .attribution { 1047 | display: block; 1048 | margin-top: 1.4em; 1049 | } 1050 | 1051 | aside.admonition { 1052 | margin-top: 1em; 1053 | padding: 1em; 1054 | border-left: 0.5em solid transparent; 1055 | page-break-inside: avoid; 1056 | } 1057 | 1058 | /* overrides for CSS3-enabled clients */ 1059 | aside[class~="admonition"] { 1060 | margin: 1.5em 2em; /* even if admonition is at bottom of block, we want that extra space below */ 1061 | padding: 0; 1062 | border-width: 0; 1063 | background: none !important; 1064 | } 1065 | 1066 | aside.note { 1067 | border-left-color: #B3B3B1; 1068 | background-color: #E1E1E1; /* 25% opacity of border */ 1069 | } 1070 | 1071 | aside.tip { 1072 | border-left-color: #57AD68; 1073 | background-color: #D4EAD9; /* 25% opacity of border */ 1074 | } 1075 | 1076 | aside.caution { 1077 | border-left-color: #666665; 1078 | background-color: #D8D8D8; /* 25% opacity of border */ 1079 | } 1080 | 1081 | aside.warning { 1082 | border-left-color: #C83737; 1083 | background-color: #F1CCCC; /* 25% opacity of border */ 1084 | } 1085 | 1086 | aside.important { 1087 | border-left-color: #FFC14F; 1088 | background-color: #FFEFD2; /* 25% opacity of border */ 1089 | } 1090 | 1091 | aside.admonition::before { 1092 | display: block; 1093 | font-family: "FontAwesome"; 1094 | font-size: 2em; 1095 | line-height: 1; 1096 | width: 1em; 1097 | text-align: center; 1098 | margin-bottom: -0.25em; 1099 | margin-left: -0.5em; 1100 | text-shadow: 0px 1px 2px rgba(102, 102, 101, 0.3); 1101 | } 1102 | 1103 | aside.admonition > div.content { 1104 | font-size: 90%; 1105 | margin-top: -1em; /* prevent at top of content when using block form of admonition */ 1106 | } 1107 | 1108 | aside[class~="admonition"] > div[class~="content"] { 1109 | margin-top: 0; 1110 | padding-bottom: 1em; 1111 | background-size: 100% 1px; 1112 | background-repeat: no-repeat; 1113 | background-position: 0 bottom; 1114 | /* template 1115 | background-image: -webkit-linear-gradient(left, rgba(255,255,255,0) 42.5%, 45%, 55%, rgba(255,255,255,0) 57.5%); 1116 | background-image: linear-gradient(to right, rgba(255,255,255,0) 42.5%, 45%, 55%, rgba(255,255,255,0) 57.5%); 1117 | */ 1118 | } 1119 | 1120 | aside.note::before { 1121 | /*content: "\f0f4";*/ /* fa-coffee */ 1122 | content: "\f040"; /* fa-pencil */ 1123 | color: #B3B3B1; /* 179,179,177 */ 1124 | } 1125 | 1126 | aside[class~="note"] > div[class~="content"] { 1127 | background-image: -webkit-linear-gradient(left, rgba(255,255,255,0) 42.5%, #B3B3B1 45%, #B3B3B1 55%, rgba(255,255,255,0) 57.5%); 1128 | background-image: linear-gradient(to right, rgba(255,255,255,0) 42.5%, #B3B3B1 45%, #B3B3B1 55%, rgba(255,255,255,0) 57.5%); 1129 | } 1130 | 1131 | aside.tip::before { 1132 | /*content: "\f069";*/ /* fa-asterisk */ 1133 | /*content: "\f0d6";*/ /* fa-money */ 1134 | content: "\f15a"; /* fa-bitcoin */ 1135 | color: #57AD68; /* 87,173,104 */ 1136 | } 1137 | 1138 | aside[class~="tip"] > div[class~="content"] { 1139 | background-image: -webkit-linear-gradient(left, rgba(255,255,255,0) 42.5%, #57AD68 45%, #57AD68 55%, rgba(255,255,255,0) 57.5%); 1140 | background-image: linear-gradient(to right, rgba(255,255,255,0) 42.5%, #57AD68 45%, #57AD68 55%, rgba(255,255,255,0) 57.5%); 1141 | } 1142 | 1143 | aside.caution::before { 1144 | content: "\f0c2"; /* fa-cloud */ 1145 | color: #666665; /* 102,102,101 */ 1146 | } 1147 | 1148 | aside[class~="caution"] > div[class~="content"] { 1149 | background-image: -webkit-linear-gradient(left, rgba(255,255,255,0) 42.5%, #666665 45%, #666665 55%, rgba(255,255,255,0) 57.5%); 1150 | background-image: linear-gradient(to right, rgba(255,255,255,0) 42.5%, #666665 45%, #666665 55%, rgba(255,255,255,0) 57.5%); 1151 | } 1152 | 1153 | aside.warning::before { 1154 | content: "\f0e7"; /* fa-bolt */ 1155 | color: #C83737; /* 200,55,55 */ 1156 | } 1157 | 1158 | aside[class~="warning"] > div[class~="content"] { 1159 | background-image: -webkit-linear-gradient(left, rgba(255,255,255,0) 42.5%, #C83737 45%, #C83737 55%, rgba(255,255,255,0) 57.5%); 1160 | background-image: linear-gradient(to right, rgba(255,255,255,0) 42.5%, #C83737 45%, #C83737 55%, rgba(255,255,255,0) 57.5%); 1161 | } 1162 | 1163 | aside.important::before { 1164 | content: "\f12a"; /* fa-exclamation */ 1165 | color: #FFC14F; /* 255,193,79 */ 1166 | } 1167 | 1168 | aside[class~="important"] > div[class~="content"] { 1169 | background-image: -webkit-linear-gradient(left, rgba(255,255,255,0) 42.5%, #FFC14F 45%, #FFC14F 55%, rgba(255,255,255,0) 57.5%); 1170 | background-image: linear-gradient(to right, rgba(255,255,255,0) 42.5%, #FFC14F 45%, #FFC14F 55%, rgba(255,255,255,0) 57.5%); 1171 | } 1172 | 1173 | aside.admonition > h2 { 1174 | margin-top: 0; 1175 | margin-bottom: 1.5em; 1176 | font-size: 1em; 1177 | text-align: center; 1178 | } 1179 | 1180 | aside[class~="admonition"] > h2 { 1181 | float: left; 1182 | width: 100%; 1183 | margin-top: -1.25em; 1184 | margin-bottom: 0; 1185 | } 1186 | 1187 | div.table { 1188 | margin-top: 1em; 1189 | } 1190 | 1191 | table.table thead, 1192 | table.table tbody, 1193 | table.table tfoot { 1194 | font-size: 0.8em; 1195 | } 1196 | 1197 | table.table > caption { 1198 | padding-bottom: 0.1em; 1199 | } 1200 | 1201 | table.table th, 1202 | table.table td { 1203 | line-height: 1.4; 1204 | padding: 0.5em 0.5em 1em 0.1em; 1205 | vertical-align: top; 1206 | text-align: left; 1207 | page-break-inside: avoid; 1208 | } 1209 | 1210 | table.table th { 1211 | font-weight: bold; 1212 | } 1213 | 1214 | table.table thead th { 1215 | border-bottom: 1px solid #80807F; 1216 | } 1217 | 1218 | table.table td > p { 1219 | margin-top: 0; 1220 | text-align: left; 1221 | } 1222 | 1223 | /* REVIEW */ 1224 | table.table td > p + p { 1225 | margin-top: 1em; 1226 | } 1227 | 1228 | table.table-framed { 1229 | border-width: 1px; 1230 | border-style: solid; 1231 | border-color: #80807F; 1232 | } 1233 | 1234 | table.table-framed-topbot { 1235 | border-width: 1px 0; 1236 | border-style: solid; 1237 | border-color: #80807F; 1238 | } 1239 | 1240 | table.table-framed-sides { 1241 | border-width: 0 1px; 1242 | border-style: solid; 1243 | border-color: #80807F; 1244 | } 1245 | 1246 | table.table-grid th, 1247 | table.table-grid td { 1248 | border-width: 0 1px 1px 0; 1249 | border-style: solid; 1250 | border-color: #80807F; 1251 | } 1252 | 1253 | table.table-grid thead tr > *:last-child { 1254 | border-right-width: 0; 1255 | } 1256 | 1257 | table.table-grid tbody tr:last-child > th, 1258 | table.table-grid tbody tr:last-child > td { 1259 | border-bottom-width: 0; 1260 | } 1261 | 1262 | table.table-grid-rows tbody th, 1263 | table.table-grid-rows tbody td { 1264 | border-width: 1px 0 0 0; 1265 | border-style: solid; 1266 | border-color: #80807F; 1267 | } 1268 | 1269 | table.table-grid-cols th, 1270 | table.table-grid-cols td { 1271 | border-width: 0 1px 0 0; 1272 | border-style: solid; 1273 | border-color: #80807F; 1274 | } 1275 | 1276 | table.table-grid-cols thead th:last-child { 1277 | border-right-width: 0; 1278 | } 1279 | 1280 | table.table-grid-cols tbody tr > td:last-child { 1281 | border-right-width: 0; 1282 | } 1283 | 1284 | hr.pagebreak { 1285 | page-break-after: always; 1286 | border: none; 1287 | margin: 0; 1288 | } 1289 | 1290 | /* REVIEW */ 1291 | hr.pagebreak + * { 1292 | margin-top: 0 !important; 1293 | } 1294 | 1295 | #_about_the_author { 1296 | page-break-before: always; 1297 | border-bottom: 1px solid #B3B3B3; 1298 | } 1299 | 1300 | img.headshot { 1301 | float: left; 1302 | border: 1px solid #80807F; 1303 | padding: 1px; 1304 | margin: 0.35em 1em 0.15em 0; 1305 | height: 5em !important; 1306 | width: 5em !important; 1307 | } 1308 | 1309 | /* Kindle refuses to style footer (perhaps stripped), so we use an explicit class */ 1310 | .chapter-footer { 1311 | page-break-before: always; 1312 | } 1313 | 1314 | div.footnotes { 1315 | margin-top: 1em; 1316 | } 1317 | 1318 | div.footnotes p { 1319 | font-size: 0.8rem; 1320 | margin-top: 0.4rem; 1321 | } 1322 | 1323 | div.footnotes sup.noteref { 1324 | font-weight: bold; 1325 | font-size: 0.9em; 1326 | } 1327 | 1328 | /*div.footnotes sup.noteref a {*/ 1329 | sup.noteref a { 1330 | /* Kindle wants to underline these links */ 1331 | text-decoration: none !important; 1332 | background-image: none; 1333 | } 1334 | 1335 | nav#toc ol { 1336 | list-style-type: none; 1337 | } 1338 | 1339 | .icon { 1340 | display: none; 1341 | } 1342 | 1343 | @media amzn-mobi { 1344 | /* NOTE mobi7 doesn't support custom fonts, so revert to generic ones */ 1345 | body p, ul, ol, li, dl, dt, dd, figcaption, caption, footer, 1346 | table.table th, table.table td, div.verse .attribution { 1347 | font-family: serif; 1348 | } 1349 | h1, h2, h3, h4, h5, h6 { 1350 | font-family: sans-serif; 1351 | } 1352 | code, kbd, pre, i.conum { 1353 | font-family: monospace; 1354 | } 1355 | } 1356 | 1357 | 1358 | /* Some custom css by Jorge Aguilera */ 1359 | .chapter-header { 1360 | background-color: #FFFFFF; 1361 | } 1362 | 1363 | h1.chapter-title .subtitle { 1364 | color: initial; 1365 | } -------------------------------------------------------------------------------- /src/docs/asciidoc/images/Dibujo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/src/docs/asciidoc/images/Dibujo.jpg -------------------------------------------------------------------------------- /src/docs/asciidoc/index.adoc: -------------------------------------------------------------------------------- 1 | = TicTacToe 2 | Universo Santa Tecla 3 | :toc-title: Índice 4 | :toc: left 5 | 6 | :idprefix: 7 | :idseparator: - 8 | :imagesdir: images 9 | 10 | [cols="10,15,25,50" options="header"] 11 | |=== 12 | 13 | a| Tema 14 | a| Requisitos 15 | a| Solución 16 | a| Incremento 17 | 18 | a| *Diseño* 19 | .2+a| [red]#TicTacToe. Requisitos. Versión 1. **Básica**# 20 | a| [red]#TicTacToe. Solucion. Versión 1.1. **domainModel**# 21 | a| [red]#Clases del Modelo del Dominio **pero acopladas a tecnologías de interfaz ahora y todas con la Ley del Cambio Continuo y de granos grueso con el advenimiento de nueva funcionalidad **# 22 | 23 | a| *Diseño Modular* 24 | a| [red]#TicTacToe. Solucion. Versión 2.1. **documentView**# 25 | a| [red]#Clases Vistas de Texto separadas de los Modelos del Dominio **pero con Modelos de grano grueso con el advenimiento de nueva funcionalidad**# 26 | 27 | .6+a| *Diseño Orientado a Objetos* 28 | .6+a| [blue]#TicTacToe. Requisitos. Versión 2. **Gráficos**# 29 | 30 | a| [blue]#TicTacToe. Solucion. Versión 3.2. **dv. withoutFactoryMethod**# 31 | a| [blue]#Clase Vistas de Interfaz Gráfica de Usuario **pero con DRY en Vistas de tecnologías diferentes y con Modelos de grano grueso con el advenimiento de nueva funcionalidad**# 32 | 33 | a| [blue]#TicTacToe. Solucion. Versión 4.2. **dv. withFactoryMethod**# 34 | a| [blue]#Clase Vista abstracta para Open/Close de sus tecnologías **pero con Modelos de grano grueso con el advenimiento de nueva funcionalidad**# 35 | 36 | a| [blue]#TicTacToe. Solucion. Versión 5.2. **modelViewPresenter. presentationModel**# 37 | a| [blue]#Clases Controladoras entre Vistas y Modelos por cada Caso de Uso **pero con la clase Principal y las Vistas acopladas a cada controlador actual y futuro**# 38 | 39 | a| [blue]#TicTacToe. Solucion. Versión 6.2. **mvp. pm. withFacade**# 40 | a| [blue]#Clase Lógica que encapsula Controladores y Modelos **pero con Vistas con DRY en la Lógica de Control**# 41 | 42 | a| [blue]#TicTacToe. Solucion. Versión 7.2. **mvp. pm. withoutDoubleDispatching**# 43 | a| [blue]#Clase Estado para la Inversión de Control de Vistas a la Lógica **pero violando el Principio de Sustitución de Liskov**# 44 | 45 | a| [blue]#TicTacToe. Solucion. Versión 8.2. **mvp. pm. withDoubleDispatching**# 46 | a| [blue]#Clase Vistador de Controladores para Técnica de Doble Despacho# 47 | 48 | .7+a| *Patrones de Diseño* 49 | a| [green]#TicTacToe. Requisitos. Versión 3. **UndoRedo**# 50 | a| [green]#TicTacToe. Solucion. Versión 9.3. **mvp. pm. withComposite**# 51 | a| [green]#Clase Comando del menú y Controlador Compuesto de ciertos Estados para Open/Close con nuevos Casos de Uso# 52 | 53 | .2+a| [yellow]#TicTacToe. Requisitos. Versión 4. **ClienteServidor**# 54 | a| [yellow]#TicTacToe. Solucion. Versión 10.4. **mvp. pm. withoutProxy**# 55 | a| [yellow]#Clase TCP/IP para tecnología de Despliegue **pero con Controladores acoplados, poco cohesivos y grano grueso con cada nueva tecnología**# 56 | 57 | a| [yellow]#TicTacToe. Solucion. Versión 11.4. **mvp. pm. withProxy**# 58 | a| [yellow]#Clases Proxy para Open/Close para nuevas tecnologías de Despliegue# 59 | 60 | .2+a| [purple]#TicTacToe. Requisitos. Versión 5. **Ficheros**# 61 | a| [purple]#TicTacToe. Solucion. Versión 12.5. **mvp. pm. withoutDAO**# 62 | a| [purple]#Clases Vistas y Controladores para la tecnología de persistencia **pero con Modelos de grano grueso, baja cohesión y alto acoplamiento a tecnologías de persistencia de ficheros**# 63 | 64 | a| [purple]#TicTacToe. Solucion. Versión 13.5. **mvp. pm. withDAO**# 65 | a| [purple]#Patrón DAO# 66 | 67 | .2+a| [lime]#TicTacToe. Requisitos. Versión 6. **BasesDatos**# 68 | a| [lime]#TicTacToe. Solucion. Versión 14.6. **mvp. pm. withoutPrototype**# 69 | a| [lime]#Nuevas Vistas y DAOS para la nueva tecnología **pero con clase Principal acoplada a las tecnologías actuales y futuras de persistencia**# 70 | 71 | a| [lime]#TicTacToe. Solucion. Versión 15.6. **mvp. pm. withPrototype**# 72 | a| [lime]#Open/Close para arranque con configuración de persistencia# 73 | 74 | .3+a| [red]#*Arquitectura MVC*# 75 | .3+a| [red]#TicTacToe. Requisitos. Versión 1. **Básica**# 76 | a| [red]#TicTacToe. Solucion. Versión 16.1. **mvp. pv**# 77 | a| [red]#Baile de la Triada# 78 | 79 | a| [red]#TicTacToe. Solucion. Versión 17.1. **mvp. sc**# 80 | a| [red]#Baile de la Triada# 81 | 82 | a| [red]#TicTacToe. Solucion. Versión 18.1. **mvc**# 83 | a| [red]#Baile de la Triada# 84 | 85 | |=== -------------------------------------------------------------------------------- /src/docs/asciidoc/index.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/src/docs/asciidoc/index.pdf -------------------------------------------------------------------------------- /src/docs/asciidoc/themePdf/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/src/docs/asciidoc/themePdf/logo.png -------------------------------------------------------------------------------- /src/docs/asciidoc/themePdf/personal-theme.yml: -------------------------------------------------------------------------------- 1 | font: 2 | catalog: 3 | # Noto Serif supports Latin, Latin-1 Supplement, Latin Extended-A, Greek, Cyrillic, Vietnamese & an assortment of symbols 4 | Noto Serif: 5 | normal: notoserif-regular-subset.ttf 6 | bold: notoserif-bold-subset.ttf 7 | italic: notoserif-italic-subset.ttf 8 | bold_italic: notoserif-bold_italic-subset.ttf 9 | # M+ 1mn supports ASCII and the circled numbers used for conums 10 | M+ 1mn: 11 | normal: mplus1mn-regular-ascii-conums.ttf 12 | bold: mplus1mn-bold-ascii.ttf 13 | italic: mplus1mn-italic-ascii.ttf 14 | bold_italic: mplus1mn-bold_italic-ascii.ttf 15 | # M+ 1p supports Latin, Latin-1 Supplement, Latin Extended, Greek, Cyrillic, Vietnamese, Japanese & an assortment of symbols 16 | # It also provides arrows for ->, <-, => and <= replacements in case these glyphs are missing from font 17 | M+ 1p Fallback: 18 | normal: mplus1p-regular-fallback.ttf 19 | bold: mplus1p-regular-fallback.ttf 20 | italic: mplus1p-regular-fallback.ttf 21 | bold_italic: mplus1p-regular-fallback.ttf 22 | fallbacks: 23 | - M+ 1p Fallback 24 | page: 25 | background_color: ffffff 26 | layout: portrait 27 | margin: [3.2cm, 2cm, 2.2cm, 2cm] 28 | # margin_inner and margin_outer keys are used for recto/verso print margins when media=prepress 29 | margin_inner: 0.75in 30 | margin_outer: 0.59in 31 | size: A4 32 | base: 33 | align: justify 34 | # color as hex string (leading # is optional) 35 | font_color: 333333 36 | # color as RGB array 37 | #font_color: [51, 51, 51] 38 | # color as CMYK array (approximated) 39 | #font_color: [0, 0, 0, 0.92] 40 | #font_color: [0, 0, 0, 92%] 41 | font_family: Noto Serif 42 | # choose one of these font_size/line_height_length combinations 43 | #font_size: 14 44 | #line_height_length: 20 45 | #font_size: 11.25 46 | #line_height_length: 18 47 | #font_size: 11.2 48 | #line_height_length: 16 49 | font_size: 11.25 50 | #line_height_length: 15 51 | # correct line height for Noto Serif metrics 52 | line_height_length: 18 53 | #font_size: 11.25 54 | #line_height_length: 18 55 | line_height: $base_line_height_length / $base_font_size 56 | font_size_large: round($base_font_size * 1.25) 57 | font_size_small: round($base_font_size * 0.85) 58 | font_size_min: $base_font_size * 0.75 59 | font_style: normal 60 | border_color: eeeeee 61 | border_radius: 4 62 | border_width: 0.5 63 | # FIXME vertical_rhythm is weird; we should think in terms of ems 64 | #vertical_rhythm: $base_line_height_length * 2 / 3 65 | # correct line height for Noto Serif metrics (comes with built-in line height) 66 | vertical_rhythm: $base_line_height_length 67 | horizontal_rhythm: $base_line_height_length 68 | # QUESTION should vertical_spacing be block_spacing instead? 69 | vertical_spacing: $vertical_rhythm 70 | link: 71 | font_color: 428bca 72 | # literal is currently used for inline monospaced in prose and table cells 73 | literal: 74 | font_color: b12146 75 | font_family: M+ 1mn 76 | menu_caret_content: " \u203a " 77 | heading: 78 | align: left 79 | #font_color: 181818 80 | font_color: $base_font_color 81 | font_family: $base_font_family 82 | font_style: bold 83 | # h1 is used for part titles (book doctype) or the doctitle (article doctype) 84 | h1_font_size: floor($base_font_size * 2.6) 85 | # h2 is used for chapter titles (book doctype only) 86 | h2_font_size: floor($base_font_size * 2.15) 87 | h3_font_size: round($base_font_size * 1.7) 88 | h4_font_size: $base_font_size_large 89 | h5_font_size: $base_font_size 90 | h6_font_size: $base_font_size_small 91 | #line_height: 1.4 92 | # correct line height for Noto Serif metrics (comes with built-in line height) 93 | line_height: 1 94 | margin_top: $vertical_rhythm * 0.4 95 | margin_bottom: $vertical_rhythm * 0.9 96 | 97 | 98 | title_page: 99 | logo_image: image:logo.png[] 100 | 101 | 102 | block: 103 | margin_top: 0 104 | margin_bottom: $vertical_rhythm 105 | caption: 106 | align: left 107 | font_size: $base_font_size * 0.95 108 | font_style: italic 109 | # FIXME perhaps set line_height instead of / in addition to margins? 110 | margin_inside: $vertical_rhythm / 3 111 | #margin_inside: $vertical_rhythm / 4 112 | margin_outside: 0 113 | lead: 114 | font_size: $base_font_size_large 115 | line_height: 1.4 116 | abstract: 117 | font_color: 5c6266 118 | font_size: $lead_font_size 119 | line_height: $lead_line_height 120 | font_style: italic 121 | first_line_font_style: bold 122 | title: 123 | align: center 124 | font_color: $heading_font_color 125 | font_family: $heading_font_family 126 | font_size: $heading_h4_font_size 127 | font_style: $heading_font_style 128 | admonition: 129 | column_rule_color: $base_border_color 130 | column_rule_width: $base_border_width 131 | padding: [0, $horizontal_rhythm, 0, $horizontal_rhythm] 132 | #icon: 133 | # tip: 134 | # name: far-lightbulb 135 | # stroke_color: 111111 136 | # size: 24 137 | label: 138 | text_transform: uppercase 139 | font_style: bold 140 | blockquote: 141 | font_color: $base_font_color 142 | font_size: $base_font_size_large 143 | border_color: $base_border_color 144 | border_width: 5 145 | # FIXME disable negative padding bottom once margin collapsing is implemented 146 | padding: [0, $horizontal_rhythm, $block_margin_bottom * -0.75, $horizontal_rhythm + $blockquote_border_width / 2] 147 | cite_font_size: $base_font_size_small 148 | cite_font_color: 999999 149 | # code is used for source blocks (perhaps change to source or listing?) 150 | code: 151 | font_color: $base_font_color 152 | font_family: $literal_font_family 153 | font_size: ceil($base_font_size) 154 | padding: $code_font_size 155 | line_height: 1.25 156 | # line_gap is an experimental property to control how a background color is applied to an inline block element 157 | line_gap: 3.8 158 | background_color: f5f5f5 159 | border_color: cccccc 160 | border_radius: $base_border_radius 161 | border_width: 0.75 162 | conum: 163 | font_family: M+ 1mn 164 | font_color: $literal_font_color 165 | font_size: $base_font_size 166 | line_height: 4 / 3 167 | example: 168 | border_color: $base_border_color 169 | border_radius: $base_border_radius 170 | border_width: 0.75 171 | background_color: ffffff 172 | # FIXME reenable padding bottom once margin collapsing is implemented 173 | padding: [$vertical_rhythm, $horizontal_rhythm, 0, $horizontal_rhythm] 174 | image: 175 | align: left 176 | prose: 177 | margin_top: $block_margin_top 178 | margin_bottom: $block_margin_bottom 179 | sidebar: 180 | background_color: eeeeee 181 | border_color: e1e1e1 182 | border_radius: $base_border_radius 183 | border_width: $base_border_width 184 | # FIXME reenable padding bottom once margin collapsing is implemented 185 | padding: [$vertical_rhythm, $vertical_rhythm * 1.25, 0, $vertical_rhythm * 1.25] 186 | title: 187 | align: center 188 | font_color: $heading_font_color 189 | font_family: $heading_font_family 190 | font_size: $heading_h4_font_size 191 | font_style: $heading_font_style 192 | thematic_break: 193 | border_color: $base_border_color 194 | border_style: solid 195 | border_width: $base_border_width 196 | margin_top: $vertical_rhythm * 0.5 197 | margin_bottom: $vertical_rhythm * 1.5 198 | description_list: 199 | term_font_style: bold 200 | term_spacing: $vertical_rhythm / 4 201 | description_indent: $horizontal_rhythm * 1.25 202 | outline_list: 203 | indent: $horizontal_rhythm * 1.5 204 | #marker_font_color: 404040 205 | # NOTE outline_list_item_spacing applies to list items that do not have complex content 206 | item_spacing: $vertical_rhythm / 2 207 | table: 208 | background_color: $page_background_color 209 | #head_background_color: 210 | #head_font_color: $base_font_color 211 | head_font_style: bold 212 | #body_background_color: 213 | body_stripe_background_color: f9f9f9 214 | foot_background_color: f0f0f0 215 | border_color: dddddd 216 | border_width: $base_border_width 217 | cell_padding: 3 218 | toc: 219 | indent: $horizontal_rhythm 220 | line_height: 1.4 221 | dot_leader: 222 | #content: ". " 223 | font_color: a9a9a9 224 | #levels: 2 3 225 | footnotes: 226 | font_size: round($base_font_size * 0.75) 227 | item_spacing: $outline_list_item_spacing / 2 228 | 229 | header: 230 | border_style: solid 231 | border_color: #B4B4B4 232 | border_width: 1 233 | height: 2.5cm 234 | vertical_align: middle 235 | font-color: #5D5D5D 236 | image_vertical_align: 2 237 | recto_content: 238 | left: | 239 | *{document-title}* + 240 | {document-subtitle} 241 | right: image:logo.png[width=75] 242 | verso_content: 243 | right: | 244 | *{document-title}* + 245 | {document-subtitle} 246 | left: image:logo.png[width=75] 247 | 248 | footer: 249 | font_size: $base_font_size_small 250 | # NOTE if background_color is set, background and border will span width of page 251 | border_color: dddddd 252 | border_width: 0.25 253 | height: $base_line_height_length * 2.5 254 | line_height: 1 255 | padding: [$base_line_height_length / 2, 1, 0, 1] 256 | vertical_align: top 257 | #image_vertical_align: or 258 | # additional attributes for content: 259 | # * {page-count} 260 | # * {page-number} 261 | # * {document-title} 262 | # * {document-subtitle} 263 | # * {chapter-title} 264 | # * {section-title} 265 | # * {section-or-chapter-title} 266 | recto_content: 267 | left: © Jorge Aguilera 268 | right: | 269 | {page-number} 270 | verso_content: 271 | left: © Jorge Aguilera 272 | right: | 273 | {page-number} -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/Board.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/Board.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/Coordinate.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/Coordinate.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/Error.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/Error.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/MachinePlayer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/MachinePlayer.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/Message.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/Message.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/Player.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/Player.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/TicTacToe.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/TicTacToe.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/Token.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/Token.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/Turn.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/Turn.class -------------------------------------------------------------------------------- /target/classes/usantatecla/tictactoe/UserPlayer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/tictactoe/UserPlayer.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/ClosedInterval.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/ClosedInterval.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/ConcreteCoordinate.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/ConcreteCoordinate.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/Console.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/Console.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/Coordinate.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/Coordinate.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/Direction.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/Direction.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/LimitedIntDialog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/LimitedIntDialog.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/NullCoordinate.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/NullCoordinate.class -------------------------------------------------------------------------------- /target/classes/usantatecla/utils/YesNoDialog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/classes/usantatecla/utils/YesNoDialog.class -------------------------------------------------------------------------------- /target/test-classes/usantatecla/AllTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/test-classes/usantatecla/AllTest.class -------------------------------------------------------------------------------- /target/test-classes/usantatecla/tictactoe/AllTicTacToeTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/test-classes/usantatecla/tictactoe/AllTicTacToeTest.class -------------------------------------------------------------------------------- /target/test-classes/usantatecla/tictactoe/BoardTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/test-classes/usantatecla/tictactoe/BoardTest.class -------------------------------------------------------------------------------- /target/test-classes/usantatecla/tictactoe/CoordinateTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/test-classes/usantatecla/tictactoe/CoordinateTest.class -------------------------------------------------------------------------------- /target/test-classes/usantatecla/utils/AllUtilsTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/test-classes/usantatecla/utils/AllUtilsTest.class -------------------------------------------------------------------------------- /target/test-classes/usantatecla/utils/ConsoleTest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/x-USantaTecla-game-ticTacToe/java/b8f471374c0d496d957d492fbb44a710ceb04eba/target/test-classes/usantatecla/utils/ConsoleTest.class --------------------------------------------------------------------------------