Git Product home page Git Product logo

zest-writer's People

Contributors

devhugo avatar firm1 avatar gerardpaligot avatar shiifu avatar spacefox avatar winxaito avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

zest-writer's Issues

Gestion des options

PR: Fenêtre d'options #53

Je me dis qu'il pourrait gentiment être intéressant de géré des options, qu'en penses-tu ?

Interprétation des balises codes problématique

via le forum

Actuellement, le défilement de la zone d'écriture et de prévisualisation n'est pas synchronisé : sans forcément le faire systématiquement, il serait agréable qu'il défile automatiquement jusqu'en bas quand on est en bas du fichier, permettant ainsi de voir la prévisualisation en continu.

En terme de rapports de bug, si j'écris :

`Set<Class<? extends Object>>`

...Zest Markdown prévisualise Set>. Il semble interpréter les balises HTML (ou ce qu'il croit en être).

Gestion des images et émoticones

Il serait bien de géré les images et les émoticônes.

Actuellement si on ajoute une émoticône, on a une image par défaut et si on fait Clic droit -> Copier dans le presse papier, l'application crash brutalement.

Toolbar

Il serait bien que quand nous cliquons sur un bouton (Gras, italique, etc.) le focus soit garder dans la zone d'édition.

Fermer un dossier ce n'est pas le supprimer

Sur un dossier ouvert dans l'arborescence, "Clic droit > Supprimer" ne fait que le fermer, ce qui est bien, mais du coup, il faudrait renommer ça en "Fermer" ou "Retirer du panneau".

Eviter la perte de focus lorsqu'on touche AltGr

Lorsque je saisis du texte, si j'appuie sur Alt+Gr pendant la saisie pour accéder à certains caractères, je perd le focus qui passe sur le menu, ou je me retrouve avec des caractères parasites (par ex. ~~ pour avoir voulu refermer une accolade).

WordWrap

Il ne semble pas y avoir de WordWrap. Si on fait un long mot, il va allonger le rendu.

On peut se dire qu'il ne va jamais y avoir de long mot, mais dans le cas d'une URL si.

Impossible d'avoir le rendu dans certains cas

Ce bug touche @artragis, et j'a réussi à le reproduire et donc a comprendre d’où il vient, il s'agit du fait que sur certains systèmes la webview n'arrive pas à charger le chemin vers la ressource contenant les static.

A corriger donc maintenant que c'est identifié

Build OS X

J'ai voulu te faire un build pour les utilisateurs OS X mais il y a quelques difficultés. Les voici :

  • Plusieurs warnings sur les ressources et une belle stacktrace. Log à la fin de l'issue. Par contre, cela n'empêche pas Gradle de terminer le build.
  • Impossible de produire un .dmg ou un .pkg puisqu'il faut signer l'application avec un compte développeur.
  • Je ne peux que produire un .app. Disponible ici.
  • Edit : Voir mon commentaire suivant
:packageClasses UP-TO-DATE
/Users/gerard/Documents/workspace-zds/zest-writer/build/icons/shortcut.iconset:warning: No image found for point size: 256 at scale: 2.
/Users/gerard/Documents/workspace-zds/zest-writer/build/icons/shortcut.iconset:warning: No image found for point size: 512 at scale: 1.
/Users/gerard/Documents/workspace-zds/zest-writer/build/icons/shortcut.iconset:warning: No image found for point size: 512 at scale: 2.
Icon javafx-icon.png for volume rejected from MacOSX bundling because javafx-icon.png does not exist or it is not an image.
java.io.IOException: Exec failed with code 1 command [[productbuild, --component, /var/folders/yd/kdk6_3wn4fvc71sblyjpgnn80000gn/T/fxbundler9213541538047447634/images/image-3179838175649741497/Zest Writer.app, /Applications, --sign, 3rd Party Mac Developer Installer: Pascal Paligot (U2Y4CR4HQY), --product, /var/folders/yd/kdk6_3wn4fvc71sblyjpgnn80000gn/T/fxbundler9213541538047447634/images/image-3179838175649741497/Zest Writer.app/Contents/Info.plist, /Users/gerard/Documents/workspace-zds/zest-writer/build/distributions/Zest Writer-0.1.0-MacAppStore.pkg] in unspecified directory
    at com.oracle.tools.packager.IOUtils.exec(IOUtils.java:165)
    at com.oracle.tools.packager.IOUtils.exec(IOUtils.java:138)
    at com.oracle.tools.packager.IOUtils.exec(IOUtils.java:132)
    at com.oracle.tools.packager.mac.MacAppStoreBundler.bundle(MacAppStoreBundler.java:159)
    at com.oracle.tools.packager.mac.MacAppStoreBundler.execute(MacAppStoreBundler.java:412)
    at com.oracle.tools.packager.Bundler$execute$0.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at com.oracle.tools.packager.Bundler$execute$0.call(Unknown Source)
    at org.bitbucket.shemnon.javafxplugin.tasks.JavaFXDeployTask$_processResources_closure3.doCall(JavaFXDeployTask.groovy:244)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:292)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1015)
    at groovy.lang.Closure.call(Closure.java:423)
    at groovy.lang.Closure.call(Closure.java:439)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1379)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1372)
    at org.codehaus.groovy.runtime.dgm$149.invoke(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at org.bitbucket.shemnon.javafxplugin.tasks.JavaFXDeployTask.processResources(JavaFXDeployTask.groovy:226)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:226)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:62)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:158)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:155)
    at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:36)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:103)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:97)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:97)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:102)
    at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:46)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:58)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:47)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:32)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:77)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:47)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:71)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Un unique bouton pour se connecter et télécharger/uploader le contenu

devoir faire "sychronisation=>se connecter => OK => synchronisation => télécharger les contenus" c'est d'un chiant. Faire "télécharger les contenus" qui en fonction de l'état connecté ou non (d'ailleurs un petit voyant vert/rouge serait sympa pour indiquer la connexion) demande les crédentials serait bien plus efficace.

Avoir une meilleure police de rédaction par défaut

Par défaut depuis le passage au système d'options, on a une police qui n'est pas monospace pour la rédaction.

L'idéal serait d'avoir une police lisible et de la même taille que la police du rendu (Merriweather).

Erreur lors de l'importation de Zest-writer

Bonjour,

j'essaye en vain depuis quelques jours d'importer Zest-writer dans eclipse.

Après avoir enfin réussi à trouver le plugin graddle (Je me suis trompé de truc au début, et comme j'était parti je me suis retrouver avec plus de 2000 plugins et des boutons [test1, test] en haut, c'était absolument n'importe quoi...)

L'erreur qui est sorti:
https://gist.github.com/WinXaito/3417e2546fb6e8943ce079d4137161c9#file-zest-writer-imporerror

En image:
capture

Mon procédé:
File -> Import -> Gradle project
Je sélectionne le dossier de Zest-writer

et en allant sur suivant puis suivant j'ai cette erreur.

Windows 7 / Java 1.8.0_71 / JRE 1.8.0_61-b15

Se connecter via son compte Google

Certains utilisateurs se connectent à ZdS via leur compte gmail, il pourrait être intéressant de l'utiliser pour synchroniser le contenu.

Indication nouvelle version

J'ai pensé qu'on pouvais éventuellement mettre un fichier VERSION ou quelque chose du genre à la racine et faire des contrôles au lancement du programme pour indiquer si une nouvelle Release est sortie.

Eviter de supprimer un extrait en essayant de le déplacer

Le drag n' drop est totalement chaotique, j'ai supprimé un extrait en voulant en déplacer un. Le fichier n'est pas supprimé par ailleurs (et c'est peut-être mieux ainsi), mais ce comportement est pour le moins étrange. Surtout que j'ai réussi à supprimer la conclusion (qui ne peut pas l'être par clic droit !).

Impossible de résoudre certains imports de JavaFx

Lorsque je tente de faire un build de l'application, j'ai plusieurs erreurs m'informant que j'ai des imports non résolus.

Par exemple, dans la classe MdTextController, il ne parvient pas à résoudre les imports suivants :

import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextInputDialog;

Mais les autres de JavaFX oui.

Une idée ?

CTRL+S pour sauvegarder

Bonjour,

pour sauvegarder, il faut aujourd'hui appuyer sur le bouton "disquette" (qui en plus n'a pas un énorme contraste). Faire un CTRL+S serait appréciable.

Possibilité d'ouvrir plusieurs contenus à la fois

L'idée est de pouvoir ouvrir plusieurs archives en même temps afin de les éditer en parallèle.

Ergonomiquement, il faudrait que les archives soit dans la Tree, les uns à la suite des autres. On peut donc les replier/déplier etc.

A terme on pourrait envisager de déplacer les partie/chapitres entre plusieurs archives ouvertes. Mais on va commencer au plus simple déjà.

Possibilité de défilement des deux zones en parallèles

Actuellement, le défilement de la zone d'écriture et de prévisualisation n'est pas synchronisé : sans forcément le faire systématiquement, il serait agréable qu'il défile automatiquement jusqu'en bas quand on est en bas du fichier, permettant ainsi de voir la prévisualisation en continu.
Source:AmauryPi

Page A propos

Réalisation de la page A propos accessible depuis la barre de menu.

Et comme dis, je prend directement.

Mémoriser la taille et l'emplacement de la fenêtre

Il pourrait être bien de mémoriser la taille et l'emplacement de la fenêtre lors de son redimensionnement et ou positionnement.

(On peut éventuellement faire une option si l'utilisateur souhaite automatique redimensionner la fenêtre à l'ouverture et la repositionner).

Et je prend directement ;p

Système de plugin

Je me demandais s'il était difficile de mettre en place un système de Plugin ? Cela permettrais de mettre certaines choses en options pour ceux qui préfère un éditeur simple et léger. (Par exemple le rendu, MathJax, etc).

Problème lors des drag'n drop

L'image parle d'elle même

Il y'a certainement des conditions qui sont mal faites. Il faudrait repasser sur tous les cas.

Exportation markdown

Si on va sur le bouton Exporter markdown, et que nous cliquons sur la croix (= Annuler), l'export markdown est enregistré dans le dossier de l'application.

Rendu MathJax

À quand le rendu des maths dans la prévisualisation ? Parce qu'en gros, c'est ce qui me manque le plus pour utiliser/tester plus en profondeur.

Reporté sur le forum.

Il me semble que MathJax soit déjà intégré dans le projet, tu as déjà fais quelque chose pour ? Est-ce sensé fonctionner ?

Problème de synchronisation

Alors pour l'occasion j'ai testé zest writer et j'ai croisé un petit soucis, lorsque je veux uploader un tuto, il l'upload bien mais il ne synchronise pas avec le tuto actuel, ce qui fait qu'on a des doublons ^^ VOici ce que m'affiche le soft :

Bonne soirée :)

Reporté par Dryusdan sur le forum

Prévisualisation des lignes de codes décalées

Enfin, les numéros de ligne des blocs de code sont décalés (la ligne est trop basse par rapport au numéro), sur la prévisualisation, chez moi.

Numéros de ligne décalés
:Ce n'est pas en face. Mon perfectionnisme est contrarié.

(Sous GNU/Linux, Ubuntu 14.10, KDE Plasma 5.9.0.)
Source:AmauryPi

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.