From 9e59db9ceef536fe286830e28a41b50dcef99e2a Mon Sep 17 00:00:00 2001 From: maharshigor Date: Fri, 8 Sep 2023 14:26:40 -0400 Subject: [PATCH 01/38] basic home page ready --- .gitignore | 3 +- _static/css/common/override.css | 12 ++----- _static/css/common/section-list.css | 34 ------------------- _static/css/common/variables.css | 10 +++--- _static/css/dipy.css | 8 ++++- _static/css/home/explore.css | 38 +++++++++++++++++++++ _static/css/home/index.css | 23 +++++++++++++ _static/css/home/intro.css | 38 +++++++++++++++++++++ _static/images/icons/cli.png | Bin 0 -> 389 bytes _static/images/logos/dipy-favicon.png | Bin 0 -> 21076 bytes _static/{ => images/logos}/dipy-logo.png | Bin _templates/documentation.html | 14 -------- _templates/home.html | 40 +++++++++++++++++++++++ conf.py | 25 +++++++++++--- 14 files changed, 176 insertions(+), 69 deletions(-) delete mode 100644 _static/css/common/section-list.css create mode 100644 _static/css/home/explore.css create mode 100644 _static/css/home/index.css create mode 100644 _static/css/home/intro.css create mode 100644 _static/images/icons/cli.png create mode 100644 _static/images/logos/dipy-favicon.png rename _static/{ => images/logos}/dipy-logo.png (100%) delete mode 100644 _templates/documentation.html create mode 100644 _templates/home.html diff --git a/.gitignore b/.gitignore index b50d4604..03e93670 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ reference/ _build -__pycache__ \ No newline at end of file +__pycache__ +.DS_Store \ No newline at end of file diff --git a/_static/css/common/override.css b/_static/css/common/override.css index e291d0e7..414fd900 100644 --- a/_static/css/common/override.css +++ b/_static/css/common/override.css @@ -3,15 +3,7 @@ This CSS file represents all the style changes to override the pydata-theme and sphinx. */ -h1, h2, h3, h4, h5, h6 { - color: var(--pst-color-text-base); - font-weight: 600; +.navbar-brand.logo { + padding: 1.1rem 1.1rem 1.1rem 0; } -h1 { - font-size: 2.5em; -} - -.bd-sidebar-primary .sidebar-primary-items__end { - margin-top: 0 !important; -} \ No newline at end of file diff --git a/_static/css/common/section-list.css b/_static/css/common/section-list.css deleted file mode 100644 index 48393f8e..00000000 --- a/_static/css/common/section-list.css +++ /dev/null @@ -1,34 +0,0 @@ -.section { - margin-bottom: 64px; -} - -.section .section-sub-topic-list { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 1em; -} - -.section .section-sub-topic { - border: 1px solid var(--pst-color-border); - border-radius: 4px; - - padding: 1em; - - text-decoration: none; -} - -.section .section-sub-topic:hover { - border: 1px solid var(--pst-color-secondary); - color: var(--pst-color-secondary); - cursor: pointer; -} - -.section .section-sub-topic span { - font-weight: 600; -} - -@media only screen and (max-width: 767px) { - .section .section-sub-topic-list { - grid-template-columns: repeat(1, 1fr); - } -} \ No newline at end of file diff --git a/_static/css/common/variables.css b/_static/css/common/variables.css index bd8ad0e0..65c87df0 100644 --- a/_static/css/common/variables.css +++ b/_static/css/common/variables.css @@ -1,7 +1,9 @@ html[data-theme="light"] { - --pst-color-primary: #FD8D25; - --pst-color-secondary: #1B8BF4; + --gst-color-primary: #FD8D25; + --gst-color-secondary: #1B8BF4; +} - --pst-color-link-hover: var(--pst-color-secondary); - --pst-color-border: rgb(229,229,229); +html[data-theme="dark"] { + --gst-color-primary: #FD8D25; + --gst-color-secondary: #1B8BF4; } diff --git a/_static/css/dipy.css b/_static/css/dipy.css index c6f758b2..8646f6c9 100644 --- a/_static/css/dipy.css +++ b/_static/css/dipy.css @@ -1,6 +1,12 @@ /* Index CSS file */ /* Do not add any css directly here.... */ +/* util css is no longer required as it is fetched from grg-sphinx-theme */ + +/* Common CSS */ + @import url("./common/variables.css"); -@import url("./common/section-list.css"); @import url("./common/override.css"); + +/* Home CSS */ +@import "./home/index.css"; \ No newline at end of file diff --git a/_static/css/home/explore.css b/_static/css/home/explore.css new file mode 100644 index 00000000..9caa2c43 --- /dev/null +++ b/_static/css/home/explore.css @@ -0,0 +1,38 @@ +.explore { + display: grid; +} + +.explore-tile { + box-shadow: var(--pst-shadow); +} + +.explore-tile-icon { + background-color: var(--gst-color-primary); + height: 40px; + width: 40px; + border-radius: 4px; +} + +/* Styles for phones */ +@media only screen and (max-width: 768px) { + /* Your CSS styles for phones go here */ + .explore { + grid-template-columns: repeat(1, 1fr); + } +} + +/* Styles for tablets */ +@media only screen and (min-width: 769px) and (max-width: 1024px) { + /* Your CSS styles for tablets go here */ + .explore { + grid-template-columns: repeat(3, 1fr); + } +} + +/* Styles for laptops and desktops */ +@media only screen and (min-width: 1025px) { + /* Your CSS styles for laptops and desktops go here */ + .explore { + grid-template-columns: repeat(4, 1fr); + } +} diff --git a/_static/css/home/index.css b/_static/css/home/index.css new file mode 100644 index 00000000..9c026038 --- /dev/null +++ b/_static/css/home/index.css @@ -0,0 +1,23 @@ +@import "./intro.css"; +@import "./explore.css"; + +/* CSS which is common across the home page */ +.dipy-highlight { + color: var(--pst-color-primary); +} + +h2.section-title { + padding: 10px 0; + margin: 10px 0; + text-align: center; + font-weight: 900; + font-size: 50px; + color: var(--gst-color-heading); +} + +@media only screen and (max-width: 768px) { + /* Your CSS styles for phones go here */ + h2.section-title { + font-size: 30px; + } +} \ No newline at end of file diff --git a/_static/css/home/intro.css b/_static/css/home/intro.css new file mode 100644 index 00000000..3bfc86cf --- /dev/null +++ b/_static/css/home/intro.css @@ -0,0 +1,38 @@ +.intro { + width: 100%; + padding: 96px 32px; + text-align: center; +} + +.tagline { + color: var(--gst-color-heading); + font-size: 76px; + line-height: 1.25; + font-weight: 900; + margin: 0 auto; +} + +.description { + line-height: 1.25; + font-size: 20px; + max-width: 900px; + margin: 24px auto 40px; + color: var(--pst-color-text-muted); +} + +.actions { + margin: 0 auto; +} + +@media only screen and (max-width: 768px) { + /* Your CSS styles for phones go here */ + .intro { + padding: 90px 20px; + } + .tagline { + font-size: 40px; + } + .description { + font-size: 16px; + } +} \ No newline at end of file diff --git a/_static/images/icons/cli.png b/_static/images/icons/cli.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f865ef409bacc2d65206c46c85421e0efe5964 GIT binary patch literal 389 zcmV;00eb$4P)4r zmWM2+QZ%ZnHZzqxuHP~mOMdxIHXe~62&w>dz$35(R@i5idVSE|bD0a^lXmIVVVq3M zGGnPu(wKSSUWGpJ!@CL%_+d~XR|w7!oFRA@lExr}j6)=398NwVUBfHUAFD_H}#J8Eu# zZ}vye&Uf`uMQDmlsyjqx!`D%Tm?&dXhys~ZKi38ikpZrcCS)B#$T&no#vu|i4yTaN zkUhJUMgXp|-hZ~OBwzKQv?24hZ6&FDepgH5F0I5{rw7i*7cY7j7cVxbokpf}*vMvl j02Zm||73z7kW&5tN)stO0v^c-00000NkvXXu0mjfU9XW> literal 0 HcmV?d00001 diff --git a/_static/images/logos/dipy-favicon.png b/_static/images/logos/dipy-favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..caffe0d8c964f5b57bca3f75d17516f2619d4b33 GIT binary patch literal 21076 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 literal 0 HcmV?d00001 diff --git a/_static/dipy-logo.png b/_static/images/logos/dipy-logo.png similarity index 100% rename from _static/dipy-logo.png rename to _static/images/logos/dipy-logo.png diff --git a/_templates/documentation.html b/_templates/documentation.html deleted file mode 100644 index 8f489c4f..00000000 --- a/_templates/documentation.html +++ /dev/null @@ -1,14 +0,0 @@ - -{# documentation.html #} -{% for topic in topics %} -
-

{{ topic.name }}

-
- {% for sub_topic in topic["sub-topics"] %} - - {{ sub_topic.name }} - - {% endfor %} -
-
-{% endfor %} \ No newline at end of file diff --git a/_templates/home.html b/_templates/home.html new file mode 100644 index 00000000..d4108eb8 --- /dev/null +++ b/_templates/home.html @@ -0,0 +1,40 @@ +{# Extending the incoming html page to handle everything from pydata/grg theme #} +{% extends "layout.html" %} + +{# Reimplementing the main content #} +{% block docs_main %} +
+ +

+ Diffusion Imaging in Python +

+

+ An open-source, user-friendly and growing imaging library for 3D/4D+ imaging. +

+

+ + + + + + +

+
+
+

Explore DIPY

+
+
+
+ +
+
+
+
+{% endblock docs_main %} \ No newline at end of file diff --git a/conf.py b/conf.py index b666e0a3..d58d34d8 100644 --- a/conf.py +++ b/conf.py @@ -113,7 +113,7 @@ # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. -html_theme = "pydata_sphinx_theme" +html_theme = "grg_sphinx_theme" # The style sheet to use for HTML and HTML Help pages. A file of that name # must exist either in Sphinx' static/ path, or in one of the custom paths @@ -125,7 +125,20 @@ # documentation. html_theme_options = { "secondary_sidebar_items": ["page-toc"], - "show_toc_level": 2 + "show_toc_level": 1, + # To remove search icon + "navbar_persistent": "", + "icon_links": [ + { + "name": "GitHub", + "url": "https://github.com/dipy", + "icon": "fa-brands fa-github" + } + ], + "logo": { + "image_dark": "_static/images/logos/dipy-logo.png", + "alt_text": "DIPY", + } } # Add any paths that contain custom themes here, relative to this directory. @@ -140,12 +153,12 @@ # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +html_logo = "_static/images/logos/dipy-logo.png" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +html_favicon = "_static/images/logos/dipy-favicon.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -165,7 +178,9 @@ # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +html_additional_pages = { + "index": "home.html" +} # If false, no module index is generated. # Setting to false fixes double module listing under header From 7bc3e70c09d058376de8ce0bb2603b9ca5ed0500 Mon Sep 17 00:00:00 2001 From: maharshigor Date: Tue, 12 Sep 2023 15:41:17 -0400 Subject: [PATCH 02/38] Good looking home page --- _static/css/common/util.css | 279 +++++++++++++++++++++++++ _static/css/common/variables.css | 6 + _static/css/dipy.css | 1 + _static/css/home/carousel.css | 21 ++ _static/css/home/cite.css | 59 ++++++ _static/css/home/explore.css | 42 ++-- _static/css/home/index.css | 10 +- _static/css/home/sponsors.css | 15 ++ _static/images/sponsors/NIH_NIBIB.png | Bin 0 -> 65075 bytes _static/images/sponsors/gsoc.png | Bin 0 -> 59780 bytes _static/images/sponsors/iu.webp | Bin 0 -> 10346 bytes _static/images/sponsors/luddy.png | Bin 0 -> 27845 bytes _static/images/sponsors/uwescience.png | Bin 0 -> 44438 bytes _templates/components/carousel.html | 34 +++ _templates/components/cite.html | 0 _templates/components/explore.html | 129 ++++++++++++ _templates/components/intro.html | 23 ++ _templates/components/sponsors.html | 8 + _templates/home.html | 57 +++-- conf.py | 5 + context/explore.json | 7 + context/sponsors.json | 23 ++ doc-requirements.txt | 29 ++- 23 files changed, 678 insertions(+), 70 deletions(-) create mode 100644 _static/css/common/util.css create mode 100644 _static/css/home/carousel.css create mode 100644 _static/css/home/cite.css create mode 100644 _static/css/home/sponsors.css create mode 100644 _static/images/sponsors/NIH_NIBIB.png create mode 100644 _static/images/sponsors/gsoc.png create mode 100644 _static/images/sponsors/iu.webp create mode 100644 _static/images/sponsors/luddy.png create mode 100644 _static/images/sponsors/uwescience.png create mode 100644 _templates/components/carousel.html create mode 100644 _templates/components/cite.html create mode 100644 _templates/components/explore.html create mode 100644 _templates/components/intro.html create mode 100644 _templates/components/sponsors.html create mode 100644 context/explore.json create mode 100644 context/sponsors.json diff --git a/_static/css/common/util.css b/_static/css/common/util.css new file mode 100644 index 00000000..43e7dc39 --- /dev/null +++ b/_static/css/common/util.css @@ -0,0 +1,279 @@ +/* Margin Utils */ +.mar-5 { + margin: 5px; +} +.mar-v-5 { + margin-top: 5px; + margin-bottom: 5px; +} +.mar-h-5 { + margin-left: 5px; + margin-right: 5px; +} +.mar-t-5 { + margin-top: 5px; +} +.mar-b-5 { + margin-bottom: 5px; +} +.mar-l-5 { + margin-left: 5px; +} +.mar-r-5 { + margin-right: 5px; +} +.mar-10 { + margin: 10px; +} +.mar-v-10 { + margin-top: 10px; + margin-bottom: 10px; +} +.mar-h-10 { + margin-left: 10px; + margin-right: 10px; +} +.mar-t-10 { + margin-top: 10px; +} +.mar-b-10 { + margin-bottom: 10px; +} +.mar-l-10 { + margin-left: 10px; +} +.mar-r-10 { + margin-right: 10px; +} +.mar-12 { + margin: 12px; +} +.mar-v-12 { + margin-top: 12px; + margin-bottom: 12px; +} +.mar-h-12 { + margin-left: 12px; + margin-right: 12px; +} +.mar-t-12 { + margin-top: 12px; +} +.mar-b-12 { + margin-bottom: 12px; +} +.mar-l-12 { + margin-left: 12px; +} +.mar-r-12 { + margin-right: 12px; +} + +/* Padding Utils */ +.pad-5 { + padding: 5px; +} +.pad-v-5 { + padding-top: 5px; + padding-bottom: 5px; +} +.pad-h-5 { + padding-left: 5px; + padding-right: 5px; +} +.pad-t-5 { + padding-top: 5px; +} +.pad-b-5 { + padding-bottom: 5px; +} +.pad-l-5 { + padding-left: 5px; +} +.pad-r-5 { + padding-right: 5px; +} +.pad-10 { + padding: 10px; +} +.pad-v-10 { + padding-top: 10px; + padding-bottom: 10px; +} +.pad-h-10 { + padding-left: 10px; + padding-right: 10px; +} +.pad-t-10 { + padding-top: 10px; +} +.pad-b-10 { + padding-bottom: 10px; +} +.pad-l-10 { + padding-left: 10px; +} +.pad-r-10 { + padding-right: 10px; +} +.pad-12 { + padding: 12px; +} +.pad-v-12 { + padding-top: 12px; + padding-bottom: 12px; +} +.pad-h-12 { + padding-left: 12px; + padding-right: 12px; +} +.pad-t-12 { + padding-top: 12px; +} +.pad-b-12 { + padding-bottom: 12px; +} +.pad-l-12 { + padding-left: 12px; +} +.pad-r-12 { + padding-right: 12px; +} +.pad-20 { + padding: 20px; +} +.pad-v-20 { + padding-top: 20px; + padding-bottom: 20px; +} +.pad-h-20 { + padding-left: 20px; + padding-right: 20px; +} +.pad-t-20 { + padding-top: 20px; +} +.pad-b-20 { + padding-bottom: 20px; +} +.pad-l-20 { + padding-left: 20px; +} +.pad-r-20 { + padding-right: 20px; +} +.pad-32 { + padding: 32px; +} +.pad-v-32 { + padding-top: 32px; + padding-bottom: 32px; +} +.pad-h-32 { + padding-left: 32px; + padding-right: 32px; +} +.pad-t-32 { + padding-top: 32px; +} +.pad-b-32 { + padding-bottom: 32px; +} +.pad-l-32 { + padding-left: 32px; +} +.pad-r-32 { + padding-right: 32px; +} +.pad-48 { + padding: 48px; +} +.pad-v-48 { + padding-top: 48px; + padding-bottom: 48px; +} +.pad-h-48 { + padding-left: 48px; + padding-right: 48px; +} +.pad-t-48 { + padding-top: 48px; +} +.pad-b-48 { + padding-bottom: 48px; +} +.pad-l-48 { + padding-left: 48px; +} +.pad-r-48 { + padding-right: 48px; +} + +/* Grid Utils */ + +/* Styles for phones */ +@media only screen and (max-width: 768px) { + /* Your CSS styles for phones go here */ + .grid-1, + .grid-2, + .grid-3 { + display: grid; + grid-template-columns: repeat(1, 1fr); + } + + .grid-4, + .grid-5 { + display: grid; + grid-template-columns: repeat(2, 1fr); + } +} + +/* Styles for tablets */ +@media only screen and (min-width: 769px) and (max-width: 1024px) { + /* Your CSS styles for tablets go here */ + .grid-1 { + display: grid; + grid-template-columns: repeat(1, 1fr); + } + + .grid-2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + } + + .grid-3, + .grid-4, + .grid-5 { + display: grid; + grid-template-columns: repeat(3, 1fr); + } +} + +/* Styles for laptops and desktops */ +@media only screen and (min-width: 1025px) { + /* Your CSS styles for laptops and desktops go here */ + .grid-1 { + display: grid; + grid-template-columns: repeat(1, 1fr); + } + + .grid-2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + } + + .grid-3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + } + + .grid-4 { + display: grid; + grid-template-columns: repeat(4, 1fr); + } + + .grid-5 { + display: grid; + grid-template-columns: repeat(5, 1fr); + } +} \ No newline at end of file diff --git a/_static/css/common/variables.css b/_static/css/common/variables.css index 65c87df0..19456eaa 100644 --- a/_static/css/common/variables.css +++ b/_static/css/common/variables.css @@ -1,9 +1,15 @@ html[data-theme="light"] { --gst-color-primary: #FD8D25; --gst-color-secondary: #1B8BF4; + --gst-color-bg: var(--bs-white); + --gst-color-bg-gray: var(--bs-gray-200); + --gst-color-light-border: var(--pst-color-border); } html[data-theme="dark"] { --gst-color-primary: #FD8D25; --gst-color-secondary: #1B8BF4; + --gst-color-bg: var(--bs-gray-900); + --gst-color-bg-gray: var(--bs-gray-900); + --gst-color-light-border: transparent; } diff --git a/_static/css/dipy.css b/_static/css/dipy.css index 8646f6c9..c4817131 100644 --- a/_static/css/dipy.css +++ b/_static/css/dipy.css @@ -7,6 +7,7 @@ @import url("./common/variables.css"); @import url("./common/override.css"); +@import url("./common/util.css"); /* Home CSS */ @import "./home/index.css"; \ No newline at end of file diff --git a/_static/css/home/carousel.css b/_static/css/home/carousel.css new file mode 100644 index 00000000..36d2da8d --- /dev/null +++ b/_static/css/home/carousel.css @@ -0,0 +1,21 @@ +.carousel-item { + height: 520px; +} + +.carousel-control-next-icon, +.carousel-control-prev-icon { + color: var(--gst-color-primary); + background: none; + font-size: 40px; + font-weight: 900; +} + +.carousel-indicators [data-bs-target] { + background-color: var(--gst-color-primary); +} + +@media only screen and (max-width: 768px) { + .carousel-item { + height: 260px; + } +} \ No newline at end of file diff --git a/_static/css/home/cite.css b/_static/css/home/cite.css new file mode 100644 index 00000000..0fdf279e --- /dev/null +++ b/_static/css/home/cite.css @@ -0,0 +1,59 @@ +.cite { + display: grid; + grid-template-columns: 100px 1fr; + gap: 1em; + border: 2px solid var(--gst-color-light-border); + background-color: var(--gst-color-bg); + border-radius: 12px; + width: fit-content; + margin: 0 auto; +} + +.cite-icon-bg { + height: 90px; + width: 90px; + border-radius: 50%; + + background-color: var(--gst-color-primary); + color: var(--bs-white); + font-size: 52px; + margin: 0 auto; + + display: flex; + justify-content: center; + align-items: center; + + box-shadow: var(--pst-shadow); +} + + +.cite-detail { + display: flex; + flex-direction: column; + align-items: start; + justify-content: center; +} + +.cite-detail p { + margin: 0; + margin-bottom: 0; + font-size: 18px; +} + +.cite-link, +.cite-link:visited { + color: var(--gst-color-primary); + text-decoration: underline; + font-weight: 600; +} + +@media only screen and (max-width: 768px) { + .cite { + grid-template-columns: 1fr; + } + + .cite-detail { + flex-direction: column; + align-items: start; + } +} \ No newline at end of file diff --git a/_static/css/home/explore.css b/_static/css/home/explore.css index 9caa2c43..40b35add 100644 --- a/_static/css/home/explore.css +++ b/_static/css/home/explore.css @@ -1,38 +1,32 @@ .explore { display: grid; + gap: 3em; } .explore-tile { box-shadow: var(--pst-shadow); + border-radius: 12px; + /* TODO This should be removed as the util will be available */ + /* padding: 48px 20px; */ + background-color: var(--gst-color-bg); } .explore-tile-icon { background-color: var(--gst-color-primary); - height: 40px; - width: 40px; - border-radius: 4px; -} - -/* Styles for phones */ -@media only screen and (max-width: 768px) { - /* Your CSS styles for phones go here */ - .explore { - grid-template-columns: repeat(1, 1fr); - } + height: 55px; + width: 55px; + border-radius: 12px; + /* TODO This should be removed as the util will be available */ + padding: 12px; + margin-bottom: 24px; + box-shadow: var(--pst-shadow); } -/* Styles for tablets */ -@media only screen and (min-width: 769px) and (max-width: 1024px) { - /* Your CSS styles for tablets go here */ - .explore { - grid-template-columns: repeat(3, 1fr); - } +.explore-tile-title { + font-weight: 600; } -/* Styles for laptops and desktops */ -@media only screen and (min-width: 1025px) { - /* Your CSS styles for laptops and desktops go here */ - .explore { - grid-template-columns: repeat(4, 1fr); - } -} +.explore-tile-know-more, +.explore-tile-know-more:visited { + color: var(--gst-color-primary); +} \ No newline at end of file diff --git a/_static/css/home/index.css b/_static/css/home/index.css index 9c026038..145fccc6 100644 --- a/_static/css/home/index.css +++ b/_static/css/home/index.css @@ -1,14 +1,22 @@ @import "./intro.css"; @import "./explore.css"; +@import "./carousel.css"; +@import "./sponsors.css"; +@import "./cite.css"; /* CSS which is common across the home page */ .dipy-highlight { color: var(--pst-color-primary); } +div.section:nth-child(n+3) { + margin: 32px 0; + padding: 0 20px; +} + h2.section-title { padding: 10px 0; - margin: 10px 0; + margin: 10px 0 10px; text-align: center; font-weight: 900; font-size: 50px; diff --git a/_static/css/home/sponsors.css b/_static/css/home/sponsors.css new file mode 100644 index 00000000..5e5ae244 --- /dev/null +++ b/_static/css/home/sponsors.css @@ -0,0 +1,15 @@ +.sponsors { + gap: 5px; +} +.sponsors-item { + background-color: var(--gst-color-bg-gray); + border-radius: 2px; + display: flex; + justify-content: space-around; + align-items: center; + padding: 20px; +} + +html[data-theme=dark] .sponsors-item img:not(.only-dark):not(.dark-light) { + filter: grayscale(1) invert(1); +} \ No newline at end of file diff --git a/_static/images/sponsors/NIH_NIBIB.png b/_static/images/sponsors/NIH_NIBIB.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebddde664f0d549bc90094f42d8c917e10837b7 GIT binary patch literal 65075 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%0D0(;K?lZ+8S^ZJ>X4Aj5+%ZEqczX^MA>?fzuC=h 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⁣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 literal 0 HcmV?d00001 diff --git a/_static/images/sponsors/gsoc.png b/_static/images/sponsors/gsoc.png new file mode 100644 index 0000000000000000000000000000000000000000..4665b4a590fe8f929fb3876db0a5a12ebfcb745e GIT binary patch literal 59780 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 BJX-(& literal 0 HcmV?d00001 diff --git a/_static/images/sponsors/iu.webp b/_static/images/sponsors/iu.webp new file mode 100644 index 0000000000000000000000000000000000000000..c76c512eb98ff9b25ffd5931225df2cc0c210a33 GIT binary patch literal 10346 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 literal 0 HcmV?d00001 diff --git a/_static/images/sponsors/luddy.png b/_static/images/sponsors/luddy.png new file mode 100644 index 0000000000000000000000000000000000000000..7c00fc6963e60b9b61f7b16eb9ae820cbc81997e GIT binary patch literal 27845 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ϙLbJpk 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 literal 0 HcmV?d00001 diff --git a/_templates/components/carousel.html b/_templates/components/carousel.html new file mode 100644 index 00000000..e61c57fc --- /dev/null +++ b/_templates/components/carousel.html @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/_templates/components/cite.html b/_templates/components/cite.html new file mode 100644 index 00000000..e69de29b diff --git a/_templates/components/explore.html b/_templates/components/explore.html new file mode 100644 index 00000000..024eeec2 --- /dev/null +++ b/_templates/components/explore.html @@ -0,0 +1,129 @@ +

Explore DIPY

+
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
+
+ +
+

Command-Line Interfaces

+

+ All the algorithms are available using CLI. You can also create your own algorithms. +

+ + + Know more + + +
+
\ No newline at end of file diff --git a/_templates/components/intro.html b/_templates/components/intro.html new file mode 100644 index 00000000..6040d0fb --- /dev/null +++ b/_templates/components/intro.html @@ -0,0 +1,23 @@ +
+

+ Diffusion Imaging in Python +

+

+ An open-source, user-friendly and growing imaging library for 3D/4D+ imaging. +

+

+ + + + + + +

+
\ No newline at end of file diff --git a/_templates/components/sponsors.html b/_templates/components/sponsors.html new file mode 100644 index 00000000..4cdab825 --- /dev/null +++ b/_templates/components/sponsors.html @@ -0,0 +1,8 @@ +

Sponsors

+
+ {% for sponsor in sponsors %} + + {{ sponsor.name }} + + {% endfor %} +
\ No newline at end of file diff --git a/_templates/home.html b/_templates/home.html index d4108eb8..e311bec1 100644 --- a/_templates/home.html +++ b/_templates/home.html @@ -3,37 +3,34 @@ {# Reimplementing the main content #} {% block docs_main %} -
- -

- Diffusion Imaging in Python -

-

- An open-source, user-friendly and growing imaging library for 3D/4D+ imaging. -

-

- - - - - - -

+
+ {%- include "components/intro.html" %} +
+
+ {%- include "components/carousel.html" with context %} +
+
+ {%- include "components/explore.html" with context %}
-
-

Explore DIPY

-
-
-
- -
+
+ {%- include "components/sponsors.html" with context %} +
+
+

Cite Us!

+
+
+ +
+
+

+ DIPY, a library for the analysis of diffusion MRI data. +

+

+ Garyfallidis E, Brett M, Amirbekian B, Rokem A, van der Walt S, Descoteaux M, Nimmo-Smith I and Dipy Contributors (2014).

+

+ Frontiers in Neuroinformatics, vol.8, no.8. +

diff --git a/conf.py b/conf.py index d58d34d8..bc84e698 100644 --- a/conf.py +++ b/conf.py @@ -13,6 +13,7 @@ import os import sys +import json from packaging.version import Version @@ -141,6 +142,10 @@ } } +html_context = { + "sponsors": json.load(open("./context/sponsors.json")) +} + # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] diff --git a/context/explore.json b/context/explore.json new file mode 100644 index 00000000..a30783f3 --- /dev/null +++ b/context/explore.json @@ -0,0 +1,7 @@ +[ + { + "title": "", + "description": "", + "url": "" + } +] \ No newline at end of file diff --git a/context/sponsors.json b/context/sponsors.json new file mode 100644 index 00000000..7c58f3ff --- /dev/null +++ b/context/sponsors.json @@ -0,0 +1,23 @@ +[ + { + "name": "NIH NIBIB", + "image": "NIH_NIBIB.png", + "url": "https://www.nibib.nih.gov/" + }, { + "name": "Luddy IU", + "image": "luddy.png", + "url": "https://luddy.indiana.edu/" + }, { + "name": "Google Summer of Code", + "image": "gsoc.png", + "url": "https://summerofcode.withgoogle.com/" + }, { + "name": "Indiana Univesity", + "image": "iu.webp", + "url": "https://www.iu.edu/" + }, { + "name": "UW eScience Institute", + "image": "uwescience.png", + "url": "https://escience.washington.edu/" + } +] \ No newline at end of file diff --git a/doc-requirements.txt b/doc-requirements.txt index 7507a132..a549012d 100644 --- a/doc-requirements.txt +++ b/doc-requirements.txt @@ -1,19 +1,18 @@ -cython +# cython numpy>=1.22.4 -scipy>=1.8.1 -nibabel>=4.0.0 -h5py -cvxpy -pandas -tables -matplotlib -fury>=0.9.0 -scikit-learn -scikit-image -statsmodels +# scipy>=1.8.1 +# nibabel>=4.0.0 +# h5py +# cvxpy +# pandas +# tables +# matplotlib +# fury>=0.9.0 +# scikit-learn +# scikit-image +# statsmodels numpydoc sphinx!=4.4 -sphinx-gallery>=0.10.0 -tomli>=2.0.1 +# tomli>=2.0.1 pydata-sphinx-theme==0.13.3 -Jinja2 \ No newline at end of file +# Jinja2 \ No newline at end of file From db546eb07e7f10ad379e248dec67e0a47662f31d Mon Sep 17 00:00:00 2001 From: shilpiprd Date: Thu, 31 Aug 2023 16:31:55 +0530 Subject: [PATCH 03/38] Pushing Week14 BlogPost --- posts/2023/2023_08_28_Shilpi_Week14.rst | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 posts/2023/2023_08_28_Shilpi_Week14.rst diff --git a/posts/2023/2023_08_28_Shilpi_Week14.rst b/posts/2023/2023_08_28_Shilpi_Week14.rst new file mode 100644 index 00000000..1489e443 --- /dev/null +++ b/posts/2023/2023_08_28_Shilpi_Week14.rst @@ -0,0 +1,27 @@ +Writing Tests & Making Documentation: Week 13 +============================================= + +.. post:: August 28, 2023 + :author: Shilpi Prasad + :tags: google + :category: gsoc + + +What I did this week +~~~~~~~~~~~~~~~~~~~~ + +This week I fixed the test for the isotropic source of kurtosis so now it's working for all DTDs. I also created tests for the ``K_micro`` function. Initially while running the test, I got some errors which made me look deeper into the actual function. The error was that I was doing sqrt of some elements when actually I was supposed to calculate square of them. Also I was using a '1/5' factor which was not actually required. On fixing these issues, the overall map image of ``K_micro`` improved significantly. +Previously the multi-voxel test case was failing due to different eigenvalues in the isotropic total diffusion tensors simulations. Removing the eigenvalue assertion made the test pass, as verifying the kt, cvt, and evals values sufficed. +I also provided documentation to some functions in the test file such as ``_perpendicular_directions_temp_`` and ``from_qte_to_cti`` etc. +Also had to change the name of some functions to make it sound more relatable to what they were actually doing. +This week I almost finished with the CTI tutorial. The only thing remaining is to create a fetcher for the data so that all the users can download the data and use it. Currently the path given for the data retrieval is of my local system. +I also added some references and overall improved the wording and information in the tutorial. +I also finished up writing my final work report and get it reviewed by my mentors and then updated it. +Finally, before pushing the file onto the main PR, I cleaned up the code by removing all the extra comments and some unnecessary code and overall made sure that the entire code was following the pep8 standard. + +What is coming up Next Week +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now that almost everything is completed and all the unit tests are passing, I'll just focus on getting the PR merged. +At present, the merging of my PR is on hold as we're actively seeking a pair of reviewers who can conduct a thorough examination of the entire codebase and provide their expert feedback. +Additionally, I'll try to get the QTI simulation merged as well . From b516a8a62a5aa131216fa9f2b6e5ee35caf35c15 Mon Sep 17 00:00:00 2001 From: shilpiprd Date: Thu, 31 Aug 2023 16:36:09 +0530 Subject: [PATCH 04/38] Fixing Week Number --- posts/2023/2023_08_28_Shilpi_Week14.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/posts/2023/2023_08_28_Shilpi_Week14.rst b/posts/2023/2023_08_28_Shilpi_Week14.rst index 1489e443..7ee8df6d 100644 --- a/posts/2023/2023_08_28_Shilpi_Week14.rst +++ b/posts/2023/2023_08_28_Shilpi_Week14.rst @@ -1,5 +1,5 @@ -Writing Tests & Making Documentation: Week 13 -============================================= +Doing Final Touch-Ups: Week 14 +============================== .. post:: August 28, 2023 :author: Shilpi Prasad @@ -23,5 +23,6 @@ What is coming up Next Week ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Now that almost everything is completed and all the unit tests are passing, I'll just focus on getting the PR merged. +I will also aim to achieve a 100% coverage report, thereby ensuring that every line of code is thoroughly tested. At present, the merging of my PR is on hold as we're actively seeking a pair of reviewers who can conduct a thorough examination of the entire codebase and provide their expert feedback. Additionally, I'll try to get the QTI simulation merged as well . From 4455d5292b1977ebb8cca4dbd73fb472e40a2712 Mon Sep 17 00:00:00 2001 From: Serge Koudoro Date: Thu, 7 Sep 2023 22:09:11 -0400 Subject: [PATCH 05/38] more cleaning --- Makefile | 24 +- _static/{ => images}/DM-MNIST-112epoch.png | Bin .../DM-MNIST-DDIM300-108epoch.png | Bin _static/{ => images}/colorfa.png | Bin _static/{ => images}/dipy-banner.png | Bin _static/images/dipy-logo.png | Bin 0 -> 16189 bytes _static/{ => images}/dipy-ws-header.png | Bin _static/{ => images}/dipy_paper_logo.jpg | Bin _static/{ => images}/dm3d-monai-B8-DM500.png | Bin .../dm3d-monai-training-curves.png | Bin .../{ => images}/dm3d-reconst-D200-D300.png | Bin _static/{ => images}/dm3d-training-curves.png | Bin _static/{ => images}/formula_.png | Bin _static/{ => images}/hbm2015_exhibitors.jpg | Bin _static/{ => images}/pretty_tracks.png | Bin .../{ => images}/simplified_tractography.png | Bin .../three_brains_golden_new_small.png | Bin _static/{ => images}/vq-vae-results.png | Bin .../{ => images}/vqvae-f3-higher-epochs.png | Bin _static/{ => images}/vqvae-monai-B12-CC.png | Bin _static/{ => images}/vqvae-monai-B12-both.png | Bin .../vqvae-reconstructions-comparison.png | Bin .../{ => images}/vqvae3d-monai-B10-ICNR.png | Bin _static/{ => images}/vqvae3d-monai-B10.png | Bin _static/{ => images}/vqvae3d-monai-B5.png | Bin .../vqvae3d-monai-training-plots.png | Bin .../{ => images}/vqvae3d-monai-training.png | Bin _static/{ => images}/vqvae3d-reconst-f2.png | Bin _static/{ => images}/vqvae3d-reconst-f3.png | Bin .../{ => images}/vqvae3d-training-curves.png | Bin blog.rst | 3 + conf.py | 2 +- doc-requirements.txt | 18 - documentation.rst | 17 - glossary.rst | 2 +- index.rst | 2 +- introduction.rst | 2 +- posts/2023/2023_05_29_Shilpi_Week_0_1.rst | 34 +- posts/2023/2023_06_12_vara_week3.rst | 2 +- posts/2023/2023_06_13_Shipi_week3.rst | 10 +- posts/2023/2023_06_19_Shilpi_week4.rst | 6 +- posts/2023/2023_06_26_vara_week5.rst | 4 +- .../2023/2023_07_10_vara_week6_and_week7.rst | 14 +- posts/2023/2023_07_24_vara_week_8_9.rst | 8 +- posts/2023/2023_08_07_vara_week_10_11.rst | 8 +- posts/2023/2023_08_21_vara_week_12_13.rst | 12 +- requirements.txt | 6 + stateoftheart.rst | 31 +- tools/LICENSE.txt | 7 - tools/apigen.py | 560 ------------------ tools/build_modref_templates.py | 81 --- tools/docgen_cmd.py | 193 ------ 52 files changed, 69 insertions(+), 977 deletions(-) rename _static/{ => images}/DM-MNIST-112epoch.png (100%) rename _static/{ => images}/DM-MNIST-DDIM300-108epoch.png (100%) rename _static/{ => images}/colorfa.png (100%) rename _static/{ => images}/dipy-banner.png (100%) create mode 100644 _static/images/dipy-logo.png rename _static/{ => images}/dipy-ws-header.png (100%) rename _static/{ => images}/dipy_paper_logo.jpg (100%) rename _static/{ => images}/dm3d-monai-B8-DM500.png (100%) rename _static/{ => images}/dm3d-monai-training-curves.png (100%) rename _static/{ => images}/dm3d-reconst-D200-D300.png (100%) rename _static/{ => images}/dm3d-training-curves.png (100%) rename _static/{ => images}/formula_.png (100%) rename _static/{ => images}/hbm2015_exhibitors.jpg (100%) rename _static/{ => images}/pretty_tracks.png (100%) rename _static/{ => images}/simplified_tractography.png (100%) rename _static/{ => images}/three_brains_golden_new_small.png (100%) rename _static/{ => images}/vq-vae-results.png (100%) rename _static/{ => images}/vqvae-f3-higher-epochs.png (100%) rename _static/{ => images}/vqvae-monai-B12-CC.png (100%) rename _static/{ => images}/vqvae-monai-B12-both.png (100%) rename _static/{ => images}/vqvae-reconstructions-comparison.png (100%) rename _static/{ => images}/vqvae3d-monai-B10-ICNR.png (100%) rename _static/{ => images}/vqvae3d-monai-B10.png (100%) rename _static/{ => images}/vqvae3d-monai-B5.png (100%) rename _static/{ => images}/vqvae3d-monai-training-plots.png (100%) rename _static/{ => images}/vqvae3d-monai-training.png (100%) rename _static/{ => images}/vqvae3d-reconst-f2.png (100%) rename _static/{ => images}/vqvae3d-reconst-f3.png (100%) rename _static/{ => images}/vqvae3d-training-curves.png (100%) create mode 100644 blog.rst delete mode 100644 doc-requirements.txt create mode 100644 requirements.txt delete mode 100644 tools/LICENSE.txt delete mode 100644 tools/apigen.py delete mode 100644 tools/build_modref_templates.py delete mode 100644 tools/docgen_cmd.py diff --git a/Makefile b/Makefile index 74065bfa..d2f308c4 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,6 @@ help: clean: -rm -rf _build/* - -rm *-stamp gitwash-update: python ../tools/gitwash_dumper.py devel dipy --repo-name=dipy --github-user=dipy \ @@ -71,9 +70,7 @@ qthelp: @echo "To view the help file:" @echo "# assistant -collectionFile _build/qthelp/dipy.qhc" -latex: rstexamples latex-after-examples - -latex-after-examples: +latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex @echo @echo "Build finished; the LaTeX files are in _build/latex." @@ -95,22 +92,3 @@ doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in _build/doctest/output.txt." - -rstexamples: rstexamples-stamp -rstexamples-stamp: - cd examples_built && ../../tools/make_examples.py - touch $@ - -pdf: pdf-stamp -pdf-stamp: latex - cd _build/latex && make all-pdf - touch $@ - -upload: html - ./upload-gh-pages.sh _build/html/ dipy dipy - -xvfb: - export TEST_WITH_XVFB=true && make html - -memory_profile: - export TEST_WITH_MEMPROF=true && make html diff --git a/_static/DM-MNIST-112epoch.png b/_static/images/DM-MNIST-112epoch.png similarity index 100% rename from _static/DM-MNIST-112epoch.png rename to _static/images/DM-MNIST-112epoch.png diff --git a/_static/DM-MNIST-DDIM300-108epoch.png b/_static/images/DM-MNIST-DDIM300-108epoch.png similarity index 100% rename from _static/DM-MNIST-DDIM300-108epoch.png rename to _static/images/DM-MNIST-DDIM300-108epoch.png diff --git a/_static/colorfa.png b/_static/images/colorfa.png similarity index 100% rename from _static/colorfa.png rename to _static/images/colorfa.png diff --git a/_static/dipy-banner.png b/_static/images/dipy-banner.png similarity index 100% rename from _static/dipy-banner.png rename to _static/images/dipy-banner.png diff --git a/_static/images/dipy-logo.png b/_static/images/dipy-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d9bac5eb3a56fcd5bff26c118cad1eb3a1411c7e GIT binary patch literal 16189 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.22.4 -# scipy>=1.8.1 -# nibabel>=4.0.0 -# h5py -# cvxpy -# pandas -# tables -# matplotlib -# fury>=0.9.0 -# scikit-learn -# scikit-image -# statsmodels -numpydoc -sphinx!=4.4 -# tomli>=2.0.1 -pydata-sphinx-theme==0.13.3 -# Jinja2 \ No newline at end of file diff --git a/documentation.rst b/documentation.rst index 8cb41bf6..f9965d57 100644 --- a/documentation.rst +++ b/documentation.rst @@ -10,26 +10,9 @@ Documentation introduction mission installation - data - examples_built/index - interfaces/index faq developers - cite - devel/index - theory/index - reference/index - reference_cmd/index - api_changes .. Main content will be displayed using the jinja template -.. - Indices and tables - ================== - - * :ref:`genindex` - * :ref:`modindex` - * :ref:`search` - diff --git a/glossary.rst b/glossary.rst index 898cccfa..bae8f98b 100644 --- a/glossary.rst +++ b/glossary.rst @@ -6,7 +6,7 @@ Affine matrix A matrix implementing an :term:`affine transformation` in - :term:`homogenous coordinates`. For a 3 dimensional transform, the + :term:`Homogeneous coordinates`. For a 3 dimensional transform, the matrix is shape 4 by 4. Affine transformation diff --git a/index.rst b/index.rst index dd52ba22..26a989e8 100644 --- a/index.rst +++ b/index.rst @@ -79,7 +79,7 @@ As an exercise, you can try to calculate `color FA` with your datasets. You will to replace the filepaths `fdwi`, `fbval` and `fbvec`. Here is what a slice should look like. -.. image:: _static/colorfa.png +.. image:: _static/images/colorfa.png :align: center ********** diff --git a/introduction.rst b/introduction.rst index ba6ab66c..1bbc5bea 100644 --- a/introduction.rst +++ b/introduction.rst @@ -13,7 +13,7 @@ guidelines and try the :ref:`examples`. Didn't find what you are looking for? Then try :ref:`faq` and then if this doesn't help send an e-mail to our e-mail list neuroimaging@python.org with subject starting with ``[DIPY]``. -.. figure:: _static/pretty_tracks.png +.. figure:: _static/images/pretty_tracks.png :align: center This is a depiction of tractography created with DIPY. diff --git a/posts/2023/2023_05_29_Shilpi_Week_0_1.rst b/posts/2023/2023_05_29_Shilpi_Week_0_1.rst index e3536e08..3f6e9647 100644 --- a/posts/2023/2023_05_29_Shilpi_Week_0_1.rst +++ b/posts/2023/2023_05_29_Shilpi_Week_0_1.rst @@ -11,20 +11,20 @@ About Myself ~~~~~~~~~~~~ Hey there! I'm Shilpi, a Computer Science and Engineering undergrad at Dayananda Sagar College of Engineering, Bangalore. I'm on track to grab my degree in 2024. -My relationship with Python started just before I started college - got my hands dirty with this awesome Python Specialization course on Coursera. +My relationship with Python started just before I started college - got my hands dirty with this awesome Python Specialization course on Coursera. When it comes to what makes me tick, it's all things tech. I mean, new technology always excites me. Ubuntu, with its fancy terminal and all, used to intimidate me at first, but now, I get a thrill out of using it to do even the simplest things. -Up until 2nd year I used to do competitive programming and a bit of ML. But from 3rd year I've been into ML very seriously, doing several courses on ML as well solving ML problems on kaggle. ML is very fun and I've done a few project on ML as well. -Coding? Absolutely love it. It's like, this is what I was meant to do, y'know? I got introduced to git and GitHub in my first year - was super curious about how the whole version control thing worked. And then, I stumbled upon the world of open source in my second year and made my first contribution to Tardis: (`https://github.com/tardis-sn/tardis/pull/1825`_) +Up until 2nd year I used to do competitive programming and a bit of ML. But from 3rd year I've been into ML very seriously, doing several courses on ML as well solving ML problems on kaggle. ML is very fun and I've done a few project on ML as well. +Coding? Absolutely love it. It's like, this is what I was meant to do, y'know? I got introduced to git and GitHub in my first year - was super curious about how the whole version control thing worked. And then, I stumbled upon the world of open source in my second year and made my first contribution to Tardis: (``_) Initially, I intended on doing GSoC during my second year but ended up stepping back for reasons. This time, though, I was fired up to send in a proposal to at least one organization in GSoC. And, well, here we are! Intro to Open-Source and GSoC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ So, I started off finding out about GSoC - how many hours do selected folks put in, the kind of projects people usually tackle, and all that stuff. To get a handle on what they want in a proposal, I turned to some successful ones from previous years. Really gave me an idea of the kind of stuff they expect you to bring to the table. -Trying to find the organization that'd go with my skill set, I stumbled upon Python Software Foundation, and I was like, "This is it!". And under PSF, there was DIPY. +Trying to find the organization that'd go with my skill set, I stumbled upon Python Software Foundation, and I was like, "This is it!". And under PSF, there was DIPY. Diving into DIPY's docs was a breeze as they've got it so well put together that I managed to get my head around a completely new topic, "Diffusion MRI", just by going through their introductory docs and a bit of gpt. -While exploring DIPY, I noticed this issue that needed a new feature. It took a good bit of reading to really understand what they were looking for and how to actually build that feature. And then, I submitted my first PR (`check it out here: https://github.com/dipy/dipy/pull/2749`_)! Getting it merged wasn't exactly easy - there was a lot of room for improvement up in my code, but honestly, I feel like it's all part of the learning curve. -I was a bit of a latecomer to GSoC, so I didn't have much time to make up a ton of PRs. Plus, by the time I'd submitted my first PR, the proposal submission period had already begun. So, I focused all my energy on increasing my knowledge on the topic and polishing my proposal. Plus, I'd wanted to get my proposal reviewed at least once before I submitted it. +While exploring DIPY, I noticed this issue that needed a new feature. It took a good bit of reading to really understand what they were looking for and how to actually build that feature. And then, I submitted my first PR (`check it out here `__)! Getting it merged wasn't exactly easy - there was a lot of room for improvement up in my code, but honestly, I feel like it's all part of the learning curve. +I was a bit of a latecomer to GSoC, so I didn't have much time to make up a ton of PRs. Plus, by the time I'd submitted my first PR, the proposal submission period had already begun. So, I focused all my energy on increasing my knowledge on the topic and polishing my proposal. Plus, I'd wanted to get my proposal reviewed at least once before I submitted it. Code contributions: @@ -38,16 +38,16 @@ I tried logging into Google to check, but couldn't. Too many people doing the sa Fast forward to 1:30am - I figured by now, the log-in rush should have calmed down. I gave it another shot and... I got in! I clicked over to the dashboard, and there it was. My project. Right there, listed under the Projects section. I had heard that if you get selected, your proposal shows up there. To confirm that it was actually happening, I picked my phone to check if I'd gotten any official email yet. And yes!! I'd gotten it at 12:49 am. I just hadn't checked. I whooped, woke up my roomies, rushed to call my parents. -Honestly, words can't even begin to capture how I felt at that moment. -Pure, undiluted joy, that's what it was. My parents, surprisingly actually picked up my call. But the minute I told them I'd made the cut, they congratulated me. It was heck of a day, (^^). +Honestly, words can't even begin to capture how I felt at that moment. +Pure, undiluted joy, that's what it was. My parents, surprisingly actually picked up my call. But the minute I told them I'd made the cut, they congratulated me. It was heck of a day, (^^). What I did this week ~~~~~~~~~~~~~~~~~~~~ As this was my first week I majorly spent a lot of time knowing about the codebase of the organization. I also went through a couple of research papers of projects which have already been implemented to get information related to my branch. -I'm currently in the middle of reading through the research paper, which is directly related to my project: `here `_ -I also went through some of the videos related to information on cti, a couple of them are: `this `_ and also, `this `_ -I also submitted `this `_ PR. In this PR members of my organization are supposed to submit all the +I'm currently in the middle of reading through the research paper, which is directly related to my project: `here `__ +I also went through some of the videos related to information on cti, a couple of them are: `this `__ and also, `this `__ +I also submitted `this `__ PR. In this PR members of my organization are supposed to submit all the blogs. But mostly I spent a lot of time in implementing the already existing MultiTensor Simulation on my local system , and also completing the assignment which my mentor gave me. In this assignment, I was given a specific number of directions, 'n' and some steps on how to produce bvals and bvecs. I had to create ``gtab1`` and ``gtab2``. and then taking ``gtab1`` & ``gtab2`` as input, I was supposed to create a function which would give output btensor i.e btens. @@ -60,17 +60,23 @@ These simulations were basically the first task of the proposal. So after the btensor I intend on producing the synthetic signals using the qti model (hint on how it is done in qti tests). make a figure similar to figure 1 of the 2021 CTI paper: -`here `_ +`here `__ Did I get stuck anywhere ~~~~~~~~~~~~~~~~~~~~~~~~ -I got stuck while creating `this `_ PR. I had to rebase a bunch of commits, and this was a new concept to me, so it took me a while to figure it out. Due to rebasing, I ended up creating a bunch of other commits, which made the commit history of this PR a mess. So, I had to learn about the concept of squashing the commits. +I got stuck while creating `this `__ PR. I had to rebase a bunch of commits, and this was a new concept to me, so it took me a while to figure it out. Due to rebasing, I ended up creating a bunch of other commits, which made the commit history of this PR a mess. So, I had to learn about the concept of squashing the commits. + +I also got stuck a lot while trying to find out the perpendicular directions to the vectors used in ``gtab1``. I was supposed to implement the following formula: + +.. image:: https://github.com/dipy/dipy/blob/09a8c4f8436f995e55231fb3d11fbfe6749610a9/_static/images/formula_.png?raw=true + :width: 400 + :alt: formula cti gtab -I also got stuck a lot while trying to find out the perpendicular directions to the vectors used in ``gtab1``. I was supposed to implement the formula in .. image:: https://github.com/dipy/dipy/blob/09a8c4f8436f995e55231fb3d11fbfe6749610a9/doc/_static/formula_.png?raw=true I had to spend a lot of time figuring out how to combine 3 vectors of shape (81, 3) to get V. And also working on the function which would give me the perpendicular vector to the vector in ``gtab1``. I got a bunch of ``ValueErrors`` saying: could not broadcast input array from shape (3,3,1) into shape (3,3) and some ``IndexError`` saying: shape mismatch: indexing arrays could not be broadcast together with shapes (81,) (3,1) (3,). I also had to experiment on how to concatenate different vectors to get the vector of the right shape, since there are a bunch of possible options while stacking, such as vstack, hstack, stack, etc. + diff --git a/posts/2023/2023_06_12_vara_week3.rst b/posts/2023/2023_06_12_vara_week3.rst index ec936a46..c0803223 100644 --- a/posts/2023/2023_06_12_vara_week3.rst +++ b/posts/2023/2023_06_12_vara_week3.rst @@ -17,7 +17,7 @@ The official code in Keras uses a ``tfp.layers.DistributionLambda(tfp.distributi Therefore, the autoregressive nature of PixelCNN combined with a sampling layer for every pixel delivers an effective generative model. The outputs for all my experiments are shown in the image below - -.. image:: /doc/_static/vq-vae-results.png +.. image:: /_static/images/vq-vae-results.png :width: 800 Based on qualitative analysis, PixelCNN outputs may require some extra work. This leads me to the next step in my research - to explore Diffusion models. The first breakthrough paper on Diffusion models is by DDPM - Denoising Diffusion Probabilistic models. Inspired by previous work on nonequilibrium thermodynamics, they show that training diffusion models while maximizing the posterior likelihood in an image generation task is mathematically equivalent to denoising score matching. diff --git a/posts/2023/2023_06_13_Shipi_week3.rst b/posts/2023/2023_06_13_Shipi_week3.rst index b596a387..9dfeae63 100644 --- a/posts/2023/2023_06_13_Shipi_week3.rst +++ b/posts/2023/2023_06_13_Shipi_week3.rst @@ -6,20 +6,20 @@ CTI Simulation and QTI tutorial : Week 3 :tags: google :category: gsoc -What I did this week: +What I did this week: _____________________ -This week I worked on finishing the simulations with the appropriate documentation. I also worked on creating a general tutorial for CTI/ QTI as one doesn't already exist for QTI. +This week I worked on finishing the simulations with the appropriate documentation. I also worked on creating a general tutorial for CTI/ QTI as one doesn't already exist for QTI. The idea behind this general tutorial was that there isn't any tutorial for advanced diffusion encoding. The closest documentation QTI has is :ref:`here `. However, there are several youtube videos. So, in this tutorial we started with simulating qti, and then we make things a little more complex by adding information on CTI as QTI can only handle a single Gradient Table whereas CTI can handle multiple Gradient Tables. -This week I also started by initializing ``cti_tests.py`` file by adding relevant simulations to it. +This week I also started by initializing ``cti_tests.py`` file by adding relevant simulations to it. -What Is coming up next week: +What Is coming up next week: ____________________________ I intend on finishing the simulations with appropriate documentation and theory lines. If time permits, I'll resume working on the ``cti.py`` file and it's tests section. The work on creating simulations is not entirely complete as it requires conversion of all .py files into rst so that it could be generated by sphinx. I also intend on making the tutorial more complete by maybe adding some more detail to it. -The major thing I intend on working on is the construction of the design matrix for the CTI model. +The major thing I intend on working on is the construction of the design matrix for the CTI model. In the context of diffusion MRI, a design matrix refers to a matrix that encodes the relationship between the data (diffusion-weighted signals) and the model parameters we want to estimate. It is essentially a way to map the model parameters to the observed data. The design matrix in case of CTI captures more complex tissue microstructure information than either DTI or DKI or QTI. diff --git a/posts/2023/2023_06_19_Shilpi_week4.rst b/posts/2023/2023_06_19_Shilpi_week4.rst index d07462eb..17677d03 100644 --- a/posts/2023/2023_06_19_Shilpi_week4.rst +++ b/posts/2023/2023_06_19_Shilpi_week4.rst @@ -11,10 +11,10 @@ Re-Engineering Simulation Codes with the QTI Model and Design Matrix What I did this week ~~~~~~~~~~~~~~~~~~~~ -I had to change the ``cti_test.py`` file as the signals generated were not exactly correct. I was advised to follow the multiple gaussian signal generation method. While doing this I had to look closely at several already implemented methods and go in depth to understand how those functions were achieving the desired output. +I had to change the ``cti_test.py`` file as the signals generated were not exactly correct. I was advised to follow the multiple gaussian signal generation method. While doing this I had to look closely at several already implemented methods and go in depth to understand how those functions were achieving the desired output. The multiple gaussian signal generation method is preferred because the CTI signal generation closely resembles the multiple gaussian signals. We're using the multiple gaussian signals so that we can have a priori of what to expect from the outcome, if we fit our model to this signal. I also managed to implement the design matrix for the CTI tensor and managed to save it up in the ``utils.py`` file. The design matrix is a crucial component of the CTI tensor as it represents the relationships between the different variables in our model. By accurately modeling these relationships, we can generate more realistic simulations and gain a deeper understanding of the CTI tensor. -The link of my work: :ref:`Here` +The link of my work: `Here __` @@ -26,4 +26,4 @@ This week I'll work on fitting CTI on multiple Gaussian simulations and see if i Did I get stuck anywhere ~~~~~~~~~~~~~~~~~~~~~~~~ -No, I didn't get stuck anywhere. +No, I didn't get stuck anywhere. diff --git a/posts/2023/2023_06_26_vara_week5.rst b/posts/2023/2023_06_26_vara_week5.rst index 6e2c44c4..497e6a03 100644 --- a/posts/2023/2023_06_26_vara_week5.rst +++ b/posts/2023/2023_06_26_vara_week5.rst @@ -23,14 +23,14 @@ Continuing on my MNIST experiments, I ran into Multi Distribution issues while t I followed the architecture described in my previous blog for the DM. I trained this on VQ-VAE latents of MNIST dataset for 200 diffusion steps, 2 Nvidia V100 GPUs, Adam Optimizer with 2e-4 learning rate, 200 batch size per GPU for 100+ epochs. For the generative process, I denoised random samples for 50, 100 and 200 steps on the best performing model(112 epochs). Here are the results I achieved - -.. image:: /doc/_static/DM-MNIST-112epoch.png +.. image:: /_static/images/DM-MNIST-112epoch.png :width: 800 We see some resemblance of digit shapes in the generated outputs. On further training for 300 diffusion timesteps for the best performing model( 108 epochs) with least training loss, the visuals have improved drastically - -.. image:: /doc/_static/DM-MNIST-DDIM300-108epoch.png +.. image:: /_static/images/DM-MNIST-DDIM300-108epoch.png :width: 800 diff --git a/posts/2023/2023_07_10_vara_week6_and_week7.rst b/posts/2023/2023_07_10_vara_week6_and_week7.rst index 8e2cf499..a4886526 100644 --- a/posts/2023/2023_07_10_vara_week6_and_week7.rst +++ b/posts/2023/2023_07_10_vara_week6_and_week7.rst @@ -1,5 +1,5 @@ Diffusion Model results on pre-trained VQVAE latents of NFBS MRI Dataset: Week 6 & Week 7 -======================================================================================== +========================================================================================= .. post:: July 10, 2023 @@ -17,36 +17,36 @@ What I did this week My current code for VQVAE & DM is well tested on MNIST dataset as shown in the previous blog posts. I extended the current codebase for MRI dataset by using 3D convolutions instead of 2D ones, which resulted in 600k parameters for VQVAE for a downsampling factor f=3. I used a preprocess function to transform MRI volumes to the desired shape (128,128,128,1) through DIPY's reslice and scipy's affine_transform functions, followed by MinMax normalization. I trained the VQVAE architecture for batch_size=10, Adam optimizer's lr=2e-4, 100 epochs. I followed suit for downsampling factor f=2 as well and got the following training curves- -.. image:: /doc/_static/vqvae3d-training-curves.png +.. image:: /_static/images/vqvae3d-training-curves.png :width: 800 The reconstructed brain volumes on the test dataset on the best performing model are as shown below. As seen in the first image, there are black artifacts in the captured blurry brain structure. Whereas the second image(f=2) does a better job in producing less blurrier brain structure. Nonetheless we only see the outline of the brain being captured with no micro-structural information inside them. -.. image:: /doc/_static/vqvae3d-reconst-f3.png +.. image:: /_static/images/vqvae3d-reconst-f3.png :width: 800 -.. image:: /doc/_static/vqvae3d-reconst-f2.png +.. image:: /_static/images/vqvae3d-reconst-f2.png :width: 800 Later, the 3D Diffusion Model was trained for approximately 200 epochs for 200 & 300 diffusion time steps in two different experiments respectively. The training curves and obtained generations are shown respectively. Both the generations are noisy and don't really have a convincing outlook. -.. image:: /doc/_static/dm3d-training-curves.png +.. image:: /_static/images/dm3d-training-curves.png :width: 800 -.. image:: /doc/_static/dm3d-reconst-D200-D300.png +.. image:: /_static/images/dm3d-reconst-D200-D300.png :width: 800 Given the achieved noisy generations, I decided to train VQVAE for a higher number of epochs. This may also indicate that the performance of DM is hitched on good latent representations i.e., a trained encoder capable of perfect reconstructions. So I trained f=3 VQVAE for a higher number of epochs as shown below. -.. image:: /doc/_static/vqvae-f3-higher-epochs.png +.. image:: /_static/images/vqvae-f3-higher-epochs.png :width: 800 diff --git a/posts/2023/2023_07_24_vara_week_8_9.rst b/posts/2023/2023_07_24_vara_week_8_9.rst index 4a96488a..a4643c17 100644 --- a/posts/2023/2023_07_24_vara_week_8_9.rst +++ b/posts/2023/2023_07_24_vara_week_8_9.rst @@ -30,7 +30,7 @@ Both methods have shown to perform better qualitatively in dealing with the chec I ran multiple experiments with batch_size=5,10,10(with ICNR). The training loss curves obtained are as follows, all of them trained on 1 GPU for 24hrs. We see that all of them converge except the last one(B=10 with ICNR). -.. image:: /doc/_static/vqvae3d-monai-training.png +.. image:: /_static/images/vqvae3d-monai-training.png :width: 800 @@ -40,20 +40,20 @@ The best training checkpoint has been used to reconstruct test images. Following The first one is for B=10, the best training checkpoint had training loss=0.0037. Compared to our previous VQVAE model, we see a better performance in capturing the brain outer structure. Moreover, we don't see white blobs or artifacts as inner matter, rather some curvatures contributing to the inner microstructure of a human brain. -.. image:: /doc/_static/vqvae3d-monai-B10.png +.. image:: /_static/images/vqvae3d-monai-B10.png :width: 800 The second one is for B=10 with ICNR kernel initialization, the best training checkpoint had training loss=0.0067. Although, the test results do not look complete. I implemented ICNR through DIPY's resize function to achieve NN resize equivalent output on the kernel filters. This initialization didn't work as it was intended to, further proving that the training is yet to be converged. -.. image:: /doc/_static/vqvae3d-monai-B10-ICNR.png +.. image:: /_static/images/vqvae3d-monai-B10-ICNR.png :width: 800 The next & last image is for B=5, the best training checkpoint had training loss = 0.0031. By far the best one quantitatively as well as visually. The test loss for the below reconstructions is 0.0013. The superior performance of this batch size can be owed to the Batch Normalization(BN) layers in the architecture that calculate mean & average of the batch to perform normalization over all batch elements using these statistics. Having lesser batch size may contribute to least variation in the output of the layer & helps in achieving converging outputs faster. This explanation stems from the concept of Contrastive Learning, where BN layers are used as the source of implicit negative loss learners. Higher the batch size, more implicit negative samples to move away from. Whereas our objective is to minimize the reconstruction loss, having lesser batch size consequently may help in lesser variation. -.. image:: /doc/_static/vqvae3d-monai-B5.png +.. image:: /_static/images/vqvae3d-monai-B5.png :width: 800 diff --git a/posts/2023/2023_08_07_vara_week_10_11.rst b/posts/2023/2023_08_07_vara_week_10_11.rst index f433a567..5bf4822a 100644 --- a/posts/2023/2023_08_07_vara_week_10_11.rst +++ b/posts/2023/2023_08_07_vara_week_10_11.rst @@ -1,5 +1,5 @@ Carbonate issues, GPU availability, Tensorflow errors: Week 10 & Week 11 -======================================================================= +======================================================================== .. post:: August 7, 2023 :author: Vara Lakshmi Bayanagari @@ -10,11 +10,11 @@ Carbonate issues, GPU availability, Tensorflow errors: Week 10 & Week 11 What I did this week ~~~~~~~~~~~~~~~~~~~~ -Recently, I've been an assigned RP(Research Project) account on University of Bloomington's HPC cluster - Carbonate. This account lets me access multiple GPUs for my experiments in a dedicated account. +Recently, I've been an assigned RP(Research Project) account on University of Bloomington's HPC cluster - Carbonate. This account lets me access multiple GPUs for my experiments in a dedicated account. -Once I started configuring my sbatch file accordingly, I started running into issues like GPU access. My debug print statements revealed that I'm accessing 1 CPU despite configuring the sbatch job for more than 1 GPUs. I double checked my dataloader definition, DistributionStrategy, train function. I read through IU's blogs as well as other resources online to see if I'm missing something. +Once I started configuring my sbatch file accordingly, I started running into issues like GPU access. My debug print statements revealed that I'm accessing 1 CPU despite configuring the sbatch job for more than 1 GPUs. I double checked my dataloader definition, DistributionStrategy, train function. I read through IU's blogs as well as other resources online to see if I'm missing something. -Nothing worked, my mentor eventually asked me to raise a IT request on Carbonate, the IT personnel couldn't help either. This could only mean that Tensorflow is picking upon assigned GPUs. So, on my mentor's suggestion, I loaded an older version of the deeplearning module 2.9.1(used 2.11.1 earlier). This worked! +Nothing worked, my mentor eventually asked me to raise a IT request on Carbonate, the IT personnel couldn't help either. This could only mean that Tensorflow is picking upon assigned GPUs. So, on my mentor's suggestion, I loaded an older version of the deeplearning module 2.9.1(used 2.11.1 earlier). This worked! This also meant using a downgraded version of tensorflow(2.9). This meant I ran into errors again, time taking yet resolvable. I made some architectural changes - replaced GroupNorm with BatchNorm layers, tensor_slices based DataLoader to DataGenerator - to accommodate for the older tensorflow version. Additionally, I also had to change the model structure from a list of layers to ``tensorflow.keras.Sequential`` set of layers with input_shape information defined in the first layer. Without this last change, I ran into ``None`` object errors. diff --git a/posts/2023/2023_08_21_vara_week_12_13.rst b/posts/2023/2023_08_21_vara_week_12_13.rst index 3174e577..ee8dee4a 100644 --- a/posts/2023/2023_08_21_vara_week_12_13.rst +++ b/posts/2023/2023_08_21_vara_week_12_13.rst @@ -17,37 +17,37 @@ Monai's VQVAE results on T1-weighted NFBS dataset, 125 samples, for batch size o Using existing training parameters, carried out two experiments, one on CC359 alone & another on both datasets combined. Additionally, I made a slight modification in the loss definition by attributing different weights of 0.5 & 1 to background & foreground pixels compared to equal weights from previous experiments. This resulted in faster convergence as shown in the red, blue & purple lines in the combined plot shown below. (Naming convention for each each training curve is ``B-``, where CC=CC359, NFBS=NFBS, both=[NFBS,CC359]) -.. image:: /doc/_static/vqvae3d-monai-training-plots.png +.. image:: /_static/images/vqvae3d-monai-training-plots.png :alt: Combined trainings plots for all experiments :width: 800 Inference results on the best performing model, B12-both, is shown below, where every two rows correspond to reconstructions & original volumes respectively, with equally spaced slices in each row. These slices visualised are anterior-posterior topdown & ventral-dorsal LR. -.. image:: /doc/_static/vqvae-monai-B12-both.png +.. image:: /_static/images/vqvae-monai-B12-both.png :alt: VQVAE-Monai-B12-both reconstructions & originals showing equally spaced 5 slices for 2 different test samples :width: 800 Here's a similar visualization of the inference on the next best performing model, B12-CC. -.. image:: /doc/_static/vqvae-monai-B12-CC.png +.. image:: /_static/images/vqvae-monai-B12-CC.png :alt: VQVAE-Monai-B12-CC reconstructions & originals showing equally spaced 5 slices for 2 different test samples :width: 800 This shows that our training not only converged quickly but also improved visually. Here's a comparison of our current best performing model i.e., VQVAE-Monai-B12-both & the previous one on NFBS i.e., VQVAE-Monai-B5-NFBS. The test reconstruction loss is 0.0013 & 0.0015 respectively. -.. image:: /doc/_static/vqvae-reconstructions-comparison.png +.. image:: /_static/images/vqvae-reconstructions-comparison.png :alt: VQVAE reconstruction comparison for B12-both & B5-NFBS :width: 800 I also carried out Diffusion Model training on the best performing VQVAE-Monai-B12-both model for 300 & 500 diffusion steps and the training curves obtained are as follows- -.. image:: /doc/_static/dm3d-monai-training-curves.png +.. image:: /_static/images/dm3d-monai-training-curves.png :alt: Diffusion Model training plots for 300 & 500 diffusion steps :width: 800 These curves seemed to converge pretty quickly but the sampling outputs in the generation pipeline are still pure noise as shown below- -.. image:: /doc/_static/dm3d-monai-B8-DM500.png +.. image:: /_static/images/dm3d-monai-B8-DM500.png :alt: Diffusion Model training plots for 300 & 500 diffusion steps :width: 800 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..e768fbe2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +numpydoc +sphinx!=4.4 +tomli>=2.0.1 +grg-sphinx-theme>=0.1.0 +Jinja2 +ablog==0.11.5 \ No newline at end of file diff --git a/stateoftheart.rst b/stateoftheart.rst index a9d7cf79..fa1baaf7 100644 --- a/stateoftheart.rst +++ b/stateoftheart.rst @@ -4,7 +4,7 @@ A quick overview of features ============================ -Here are just a few of the state-of-the-art :ref:`technologies ` and algorithms which are provided in DIPY_: +Here are just a few of the state-of-the-art `technologies ` and algorithms which are provided in DIPY_: - Reconstruction algorithms: CSD, DSI, GQI, DTI, DKI, QBI, SHORE and MAPMRI. - Fiber tracking algorithms: deterministic and probabilistic. @@ -21,33 +21,8 @@ With the help of some external tools you can also: - Read many different file formats e.g. Trackvis or Nifti (with nibabel). - Examine your datasets interactively (with ipython). -For more information on specific algorithms we recommend starting by looking at DIPY's :ref:`gallery ` of examples. - -For a full list of the features implemented in the most recent release cycle, check out the release notes. - -.. toctree:: - :maxdepth: 1 - - release_notes/release1.7 - release_notes/release1.6 - release_notes/release1.5 - release_notes/release1.4.1 - release_notes/release1.4 - release_notes/release1.3 - release_notes/release1.2 - release_notes/release1.1 - release_notes/release1.0 - release_notes/release0.16 - release_notes/release0.15 - release_notes/release0.14 - release_notes/release0.13 - release_notes/release0.12 - release_notes/release0.11 - release_notes/release0.10 - release_notes/release0.9 - release_notes/release0.8 - release_notes/release0.7 - release_notes/release0.6 +For more information on specific algorithms we recommend starting by looking at DIPY's `gallery ` of examples. + ================= Systems supported diff --git a/tools/LICENSE.txt b/tools/LICENSE.txt deleted file mode 100644 index 9e1d415a..00000000 --- a/tools/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -These files were obtained from - -https://www.mail-archive.com/sphinx-dev@googlegroups.com/msg02472.html - -and were released under a BSD/MIT license by Fernando Perez, Matthew Brett and -the PyMVPA folks. Further cleanups by the scikit-image crew. - diff --git a/tools/apigen.py b/tools/apigen.py deleted file mode 100644 index ed8d9733..00000000 --- a/tools/apigen.py +++ /dev/null @@ -1,560 +0,0 @@ -"""Attempt to generate templates for module reference with Sphinx. - -To include extension modules, first identify them as valid in the -``_uri2path`` method, then handle them in the ``_parse_module_with_import`` -script. - -Notes ------ -This parsing is based on the import and introspection of modules. -Previously functions and classes were found by parsing the text of .py files. - -Extension modules should be discovered and included as well. - -This is a modified version of a script originally shipped with the PyMVPA -project, then adapted for use first in NIPY and then in skimage. PyMVPA -is an MIT-licensed project. -""" - -import ast -import os -import re -from importlib import import_module - -from types import BuiltinFunctionType, FunctionType -from inspect import ismethod, getmodule - -# suppress print statements (warnings for empty files) -DEBUG = True - - -class ApiDocWriter(object): - """Automatic detection and parsing of API docs to Sphinx-parsable reST - format.""" - - # only separating first two levels - rst_section_levels = ['*', '=', '-', '~', '^'] - - def __init__(self, - package_name, - rst_extension='.txt', - package_skip_patterns=None, - module_skip_patterns=None, - object_skip_patterns=None, - other_defines=True - ): - r"""Initialize package for parsing. - - Parameters - ---------- - package_name : string - Name of the top-level package. *package_name* must be the - name of an importable package - rst_extension : string, optional - Extension for reST files, default '.rst' - package_skip_patterns : None or sequence of {strings, regexps} - Sequence of strings giving URIs of packages to be excluded - Operates on the package path, starting at (including) the - first dot in the package path, after *package_name* - so, - if *package_name* is ``sphinx``, then ``sphinx.util`` will - result in ``.util`` being passed for searching by these - regexps. If is None, gives default. Default is: - ['\.tests$'] - module_skip_patterns : None or sequence - Sequence of strings giving URIs of modules to be excluded - Operates on the module name including preceding URI path, - back to the first dot after *package_name*. For example - ``sphinx.util.console`` results in the string to search of - ``.util.console`` - If is None, gives default. Default is: - ['\.setup$', '\._'] - object_skip_patterns: None or sequence of {strings, regexps} - skip some specific class or function - other_defines : {True, False}, optional - Whether to include classes and functions that are imported in a - particular module but not defined there. - """ - if package_skip_patterns is None: - package_skip_patterns = ['\\.tests$'] - if module_skip_patterns is None: - module_skip_patterns = ['\\.setup$', '\\._'] - if object_skip_patterns is None: - object_skip_patterns = [] - - self.package_name = package_name - self.rst_extension = rst_extension - self.package_skip_patterns = package_skip_patterns - self.module_skip_patterns = module_skip_patterns - self.object_skip_patterns = object_skip_patterns - self.other_defines = other_defines - - def get_package_name(self): - return self._package_name - - def set_package_name(self, package_name): - """Set package_name. - - >>> docwriter = ApiDocWriter('sphinx') - >>> import sphinx - >>> docwriter.root_path == sphinx.__path__[0] - True - >>> docwriter.package_name = 'docutils' - >>> import docutils - >>> docwriter.root_path == docutils.__path__[0] - True - """ - # It's also possible to imagine caching the module parsing here - self._package_name = package_name - root_module = self._import(package_name) - self.root_path = root_module.__path__[-1] - self.written_modules = None - - package_name = property(get_package_name, set_package_name, None, - 'get/set package_name') - - def _import(self, name): - """Import namespace package.""" - mod = __import__(name) - components = name.split('.') - for comp in components[1:]: - mod = getattr(mod, comp) - return mod - - def _get_object_name(self, line): - """Get second token in line. - - Examples - -------- - >>> docwriter = ApiDocWriter('sphinx') - >>> docwriter._get_object_name(" def func(): ") - 'func' - >>> docwriter._get_object_name(" class Klass(object): ") - 'Klass' - >>> docwriter._get_object_name(" class Klass: ") - 'Klass' - """ - name = line.split()[1].split('(')[0].strip() - # in case we have classes which are not derived from object - # ie. old style classes - return name.rstrip(':') - - def _uri2path(self, uri): - """Convert uri to absolute filepath. - - Parameters - ---------- - uri : string - URI of python module to return path for - - Returns - ------- - path : None or string - Returns None if there is no valid path for this URI - Otherwise returns absolute file system path for URI - - Examples - -------- - >>> docwriter = ApiDocWriter('sphinx') - >>> import sphinx - >>> modpath = sphinx.__path__[0] - >>> res = docwriter._uri2path('sphinx.builder') - >>> res == os.path.join(modpath, 'builder.py') - True - >>> res = docwriter._uri2path('sphinx') - >>> res == os.path.join(modpath, '__init__.py') - True - >>> docwriter._uri2path('sphinx.does_not_exist') - - """ - if uri == self.package_name: - return os.path.join(self.root_path, '__init__.py') - path = uri.replace(self.package_name + '.', '') - path = path.replace('.', os.path.sep) - path = os.path.join(self.root_path, path) - # XXX maybe check for extensions as well? - if os.path.exists(path + '.py'): # file - path += '.py' - elif os.path.exists(path + '.pyx'): # file - path += '.pyx' - elif os.path.exists(os.path.join(path, '__init__.py')): - path = os.path.join(path, '__init__.py') - else: - return None - return path - - def _path2uri(self, dirpath): - """Convert directory path to uri.""" - package_dir = self.package_name.replace('.', os.path.sep) - relpath = dirpath.replace(self.root_path, package_dir) - if relpath.startswith(os.path.sep): - relpath = relpath[1:] - return relpath.replace(os.path.sep, '.') - - def _parse_module(self, uri): - """Parse module defined in *uri*.""" - filename = self._uri2path(uri) - if filename is None: - print(filename, 'erk') - # nothing that we could handle here. - return [], [] - - f = open(filename, 'rt') - functions, classes = self._parse_lines(f) - f.close() - return functions, classes - - def _parse_module_with_import(self, uri): - """Look for functions and classes in an importable module. - - Parameters - ---------- - uri : str - The name of the module to be parsed. This module needs to be - importable. - - Returns - ------- - functions : list of str - A list of (public) function names in the module. - classes : list of str - A list of (public) class names in the module. - """ - mod = import_module(uri) - patterns = '(?:{0})'.format('|'.join(self.object_skip_patterns)) - pat = re.compile(patterns) - - if mod.__file__.endswith('.py'): - with open(mod.__file__) as fi: - node = ast.parse(fi.read()) - - functions = [] - classes = [] - for n in node.body: - - if not hasattr(n, 'name'): - if not isinstance(n, ast.Assign): - continue - - if isinstance(n, ast.ClassDef): - if n.name.startswith('_') or pat.search(n.name): - continue - classes.append(n.name) - elif isinstance(n, ast.FunctionDef): - if n.name.startswith('_') or pat.search(n.name): - continue - functions.append(n.name) - # Specific condition for vtk and fury - elif isinstance(n, ast.Assign): - try: - if isinstance(n.value, ast.Call): - if isinstance(n.targets[0], ast.Tuple): - continue - functions.append(n.targets[0].id) - elif hasattr(n.value, 'attr') and n.value.attr.startswith('vtk'): - classes.append(n.targets[0].id) - except Exception: - print(mod.__file__) - print(n.lineno) - print(n.targets[0]) - - return functions, classes - else: - # find all public objects in the module. - obj_strs = [obj for obj in dir(mod) if not obj.startswith('_')] - functions = [] - classes = [] - for obj_str in obj_strs: - # find the actual object from its string representation - if obj_str not in mod.__dict__: - continue - obj = mod.__dict__[obj_str] - # Check if function / class defined in module - if not self.other_defines and not getmodule(obj) == mod: - continue - # figure out if obj is a function or class - if (hasattr(obj, 'func_name') or - isinstance(obj, BuiltinFunctionType) or - ismethod(obj) or isinstance(obj, FunctionType)): - functions.append(obj_str) - else: - try: - issubclass(obj, object) - classes.append(obj_str) - except TypeError: - # not a function or class - pass - return functions, classes - - def _parse_lines(self, linesource): - """Parse lines of text for functions and classes.""" - functions = [] - classes = [] - for line in linesource: - if line.startswith('def ') and line.count('('): - # exclude private stuff - name = self._get_object_name(line) - if not name.startswith('_'): - functions.append(name) - elif line.startswith('class '): - # exclude private stuff - name = self._get_object_name(line) - if not name.startswith('_'): - classes.append(name) - else: - pass - functions.sort() - classes.sort() - return functions, classes - - def generate_api_doc(self, uri): - """Make autodoc documentation template string for a module. - - Parameters - ---------- - uri : string - python location of module - e.g 'sphinx.builder' - - Returns - ------- - head : string - Module name, table of contents. - body : string - Function and class docstrings. - """ - # get the names of all classes and functions - functions, classes = self._parse_module_with_import(uri) - if not len(functions) and not len(classes) and DEBUG: - print('WARNING: Empty -', uri) # dbg - - # Make a shorter version of the uri that omits the package name for - # titles - uri_short = re.sub(r'^%s\.' % self.package_name, '', uri) - - head = '.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n' - body = '' - - # Set the chapter title to read 'module' for all modules except for the - # main packages - if '.' in uri_short: - title = 'Module: :mod:`' + uri_short + '`' - head += title + '\n' + self.rst_section_levels[2] * len(title) - else: - title = ':mod:`' + uri_short + '`' - head += title + '\n' + self.rst_section_levels[1] * len(title) - - head += '\n.. automodule:: ' + uri + '\n' - head += '\n.. currentmodule:: ' + uri + '\n' - body += '\n.. currentmodule:: ' + uri + '\n\n' - for c in classes: - body += '\n:class:`' + c + '`\n' \ - + self.rst_section_levels[3] * \ - (len(c) + 9) + '\n\n' - body += '\n.. autoclass:: ' + c + '\n' - # must NOT exclude from index to keep cross-refs working - body += ' :members:\n' \ - ' :undoc-members:\n' \ - ' :show-inheritance:\n' \ - '\n' \ - ' .. automethod:: __init__\n\n' - head += '.. autosummary::\n\n' - for f in classes + functions: - head += ' ' + f + '\n' - head += '\n' - - for f in functions: - # must NOT exclude from index to keep cross-refs working - body += f + '\n' - body += self.rst_section_levels[3] * len(f) + '\n' - body += '\n.. autofunction:: ' + f + '\n\n' - - return head, body - - def _survives_exclude(self, matchstr, match_type): - r"""Return True if *matchstr* does not match patterns. - - ``self.package_name`` removed from front of string if present - - Examples - -------- - >>> dw = ApiDocWriter('sphinx') - >>> dw._survives_exclude('sphinx.okpkg', 'package') - True - >>> dw.package_skip_patterns.append('^\\.badpkg$') - >>> dw._survives_exclude('sphinx.badpkg', 'package') - False - >>> dw._survives_exclude('sphinx.badpkg', 'module') - True - >>> dw._survives_exclude('sphinx.badmod', 'module') - True - >>> dw.module_skip_patterns.append('^\\.badmod$') - >>> dw._survives_exclude('sphinx.badmod', 'module') - False - """ - if match_type == 'module': - patterns = self.module_skip_patterns - elif match_type == 'package': - patterns = self.package_skip_patterns - else: - raise ValueError('Cannot interpret match type "%s"' - % match_type) - # Match to URI without package name - L = len(self.package_name) - if matchstr[:L] == self.package_name: - matchstr = matchstr[L:] - for pat in patterns: - try: - pat.search - except AttributeError: - pat = re.compile(pat) - if pat.search(matchstr): - return False - - return True - - def discover_modules(self): - r"""Return module sequence discovered from ``self.package_name``. - - Parameters - ---------- - None - - Returns - ------- - mods : sequence - Sequence of module names within ``self.package_name`` - - Examples - -------- - >>> dw = ApiDocWriter('sphinx') - >>> mods = dw.discover_modules() - >>> 'sphinx.util' in mods - True - >>> dw.package_skip_patterns.append('\.util$') - >>> 'sphinx.util' in dw.discover_modules() - False - >>> - """ - modules = [self.package_name] - # raw directory parsing - for dirpath, dirnames, filenames in os.walk(self.root_path): - # Check directory names for packages - root_uri = self._path2uri(os.path.join(self.root_path, - dirpath)) - - # Normally, we'd only iterate over dirnames, but since - # dipy does not import a whole bunch of modules we'll - # include those here as well (the *.py filenames). - filenames = [os.path.splitext(f)[0] for f in filenames - if (f.endswith('.py') and - not f.startswith('__init__')) - or f.endswith('.pyx')] - - for subpkg_name in dirnames + filenames: - package_uri = '.'.join((root_uri, subpkg_name)) - package_path = self._uri2path(package_uri) - if (package_path and - self._survives_exclude(package_uri, 'package')): - modules.append(package_uri) - - return sorted(modules) - - def write_modules_api(self, modules, outdir): - # upper-level modules - ulms = ['.'.join(m.split('.')[:2]) if m.count('.') >= 1 - else m.split('.')[0] for m in modules] - - from collections import OrderedDict - module_by_ulm = OrderedDict() - - for v, k in zip(modules, ulms): - if k in module_by_ulm: - module_by_ulm[k].append(v) - else: - module_by_ulm[k] = [v] - - written_modules = [] - - for ulm, mods in module_by_ulm.items(): - print("Generating docs for %s:" % ulm) - document_head = [] - document_body = [] - - for m in mods: - print(" -> " + m) - head, body = self.generate_api_doc(m) - - document_head.append(head) - document_body.append(body) - - out_module = ulm + self.rst_extension - outfile = os.path.join(outdir, out_module) - fileobj = open(outfile, 'wt') - - fileobj.writelines(document_head + document_body) - fileobj.close() - written_modules.append(out_module) - - self.written_modules = written_modules - - def write_api_docs(self, outdir): - """Generate API reST files. - - Parameters - ---------- - outdir : string - Directory name in which to store files - We create automatic filenames for each module - - Returns - ------- - None - - Notes - ----- - Sets self.written_modules to list of written modules - """ - if not os.path.exists(outdir): - os.mkdir(outdir) - # compose list of modules - modules = self.discover_modules() - self.write_modules_api(modules, outdir) - - def write_index(self, outdir, froot='gen', relative_to=None): - """Make a reST API index file from written files. - - Parameters - ---------- - path : string - Filename to write an index to - outdir : string - Directory to which to write generated index file - froot : string, optional - root (filename without extension) of filename to write to - Defaults to 'gen'. We add ``self.rst_extension``. - relative_to : string - path to which written filenames are relative. This - component of the written file path will be removed from - outdir, in the generated index. Default is None, meaning, - leave the path as it is. - """ - if self.written_modules is None: - raise ValueError('No modules written') - # Get full filename path - path = os.path.join(outdir, froot + self.rst_extension) - # Path written into index is relative to rootpath - if relative_to is not None: - relpath = (outdir + os.path.sep).replace( - relative_to + os.path.sep, '') - else: - relpath = outdir - idx = open(path, 'wt') - w = idx.write - w('.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n') - - title = "API Reference" - w(title + "\n") - w("=" * len(title) + "\n\n") - w('.. toctree::\n\n') - for f in self.written_modules: - w(' %s\n' % os.path.join(relpath, f)) - idx.close() diff --git a/tools/build_modref_templates.py b/tools/build_modref_templates.py deleted file mode 100644 index 1b520317..00000000 --- a/tools/build_modref_templates.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python -"""Script to auto-generate our API docs. -""" - -# stdlib imports -import sys -import re -from os.path import join as pjoin - -# local imports -from apigen import ApiDocWriter - -# version comparison -from packaging.version import Version - -# ***************************************************************************** - - -def abort(error): - print('*WARNING* API documentation not generated: %s' % error) - exit() - - -if __name__ == '__main__': - package = sys.argv[1] - outdir = sys.argv[2] - try: - other_defines = sys.argv[3] - except IndexError: - other_defines = True - else: - other_defines = other_defines in ('True', 'true', '1') - - # Check that the package is available. If not, the API documentation is not - # (re)generated and existing API documentation sources will be used. - - try: - __import__(package) - except ImportError as e: - abort("Can not import " + package) - - module = sys.modules[package] - - # Check that the source version is equal to the installed - # version. If the versions mismatch the API documentation sources - # are not (re)generated. This avoids automatic generation of documentation - # for older or newer versions if such versions are installed on the system. - - installed_version = Version(module.__version__) - - info_file = pjoin('..', package, 'info.py') - info_lines = open(info_file).readlines() - source_version = '.'.join([v.split('=')[1].strip(" '\n.") - for v in info_lines if re.match( - '^_version_(major|minor|micro|extra)', v - )]).strip('.') - source_version = Version(source_version) - print('***', source_version) - - if source_version != installed_version: - print('***', installed_version) - abort("Installed version does not match source version") - - docwriter = ApiDocWriter(package, rst_extension='.rst', - other_defines=other_defines) - docwriter.package_skip_patterns += [r'\.tracking\.interfaces.*$', - r'\.tracking\.gui_tools.*$', - r'.*test.*$', - r'^\.utils.*', - r'\.boots\.resampling.*$', - r'\.info.*$', - r'\.pkg_info.*$', - ] - docwriter.object_skip_patterns += [ - r'.*FetcherError.*$', - r'.*urlopen.*', - r'.*add_callback.*', - ] - docwriter.write_api_docs(outdir) - docwriter.write_index(outdir, 'index', relative_to=outdir) - print('%d files written' % len(docwriter.written_modules)) diff --git a/tools/docgen_cmd.py b/tools/docgen_cmd.py deleted file mode 100644 index 9d643b9c..00000000 --- a/tools/docgen_cmd.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python -""" -Script to generate documentation for command line utilities -""" -import os -from os.path import join as pjoin -import re -from subprocess import Popen, PIPE, CalledProcessError -import sys -import importlib -import inspect - -# version comparison -from packaging.version import Version - -# List of workflows to ignore -SKIP_WORKFLOWS_LIST = ('Workflow', 'CombinedWorkflow') - - -def sh3(cmd): - """ - Execute command in a subshell, return stdout, stderr - If anything appears in stderr, print it out to sys.stderr - - https://github.com/scikit-image/scikit-image/blob/master/doc/gh-pages.py - - Copyright (C) 2011, the scikit-image team All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of skimage nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True) - out, err = p.communicate() - retcode = p.returncode - if retcode: - raise CalledProcessError(retcode, cmd) - else: - return out.rstrip(), err.rstrip() - - -def abort(error): - print('*WARNING* Command line API documentation not generated: %s' % error) - exit() - - -def get_help_string(class_obj): - # return inspect.getdoc(class_obj.run) - try: - ia_module = importlib.import_module("dipy.workflows.base") - parser = ia_module.IntrospectiveArgumentParser() - parser.add_workflow(class_obj()) - except Exception as e: - abort("Error on {0}: {1}".format(class_obj.__name__, e)) - - return parser.format_help() - - -def format_title(text): - text = text.title() - line = '-' * len(text) - return '{0}\n{1}\n\n'.format(text, line) - - -if __name__ == '__main__': - # package name: Eg: dipy - package = sys.argv[1] - # directory in which the generated rst files will be saved - outdir = sys.argv[2] - - try: - __import__(package) - except ImportError: - abort("Cannot import " + package) - - module = sys.modules[package] - - # Check that the source version is equal to the installed - # version. If the versions mismatch the API documentation sources - # are not (re)generated. This avoids automatic generation of documentation - # for older or newer versions if such versions are installed on the system. - - installed_version = Version(module.__version__) - - info_file = pjoin('..', package, 'info.py') - info_lines = open(info_file).readlines() - source_version = '.'.join( - [v.split('=')[1].strip(" '\n.") - for v in info_lines - if re.match('^_version_(major|minor|micro|extra)', v)]).strip('.') - source_version = Version(source_version) - print('***', source_version) - - if source_version != installed_version: - print('***', installed_version) - abort("Installed version does not match source version") - - - # generate docs - command_list = [] - - workflows_folder = pjoin('..', 'bin') - workflow_module = importlib.import_module("dipy.workflows.workflow") - - workflow_flist = [os.path.abspath(pjoin(workflows_folder, f)) - for f in os.listdir(workflows_folder) - if os.path.isfile(pjoin(workflows_folder, f)) and - f.lower().startswith("dipy_")] - - workflow_flist = sorted(workflow_flist) - workflow_desc = {} - # We get all workflows class obj in a dictionary - for path_file in os.listdir(pjoin('..', 'dipy', 'workflows')): - module_name = inspect.getmodulename(path_file) - if module_name is None: - continue - - module = importlib.import_module("dipy.workflows." + module_name) - members = inspect.getmembers(module) - d_wkflw = {name: {"module": obj, "help": get_help_string(obj)} - for name, obj in members - if inspect.isclass(obj) and - issubclass(obj, workflow_module.Workflow) and - name not in SKIP_WORKFLOWS_LIST - } - - workflow_desc.update(d_wkflw) - - cmd_list = [] - for fpath in workflow_flist: - fname = os.path.basename(fpath) - with open(fpath) as file_object: - flow_name = set(re.findall(r"[A-Z]\w+Flow", file_object.read(), - re.X | re.M)) - - if not flow_name or len(flow_name) != 1: - continue - - flow_name = list(flow_name)[-1] - print("Generating docs for: {0} ({1})".format(fname, flow_name)) - out_fname = fname + ".rst" - with open(pjoin(outdir, out_fname), "w") as fp: - dashes = "=" * len(fname) - fp.write("\n{0}\n{1}\n{0}\n\n".format(dashes, fname)) - # Trick to avoid docgen_cmd.py as cmd line - help_txt = workflow_desc[flow_name]["help"] - help_txt = help_txt.replace("docgen_cmd.py", fname) - help_txt = help_txt.replace("usage:", format_title('usage')) - help_txt = help_txt.replace("positional arguments:", - format_title("positional arguments")) - help_txt = help_txt.replace("optional arguments:", - format_title("optional arguments")) - help_txt = help_txt.replace( - "output arguments(optional):", - format_title("output arguments(optional)")) - help_txt = help_txt.replace("References:", - format_title("References")) - help_txt = help_txt.rstrip() - fp.write(help_txt) - - cmd_list.append(out_fname) - print("Done") - - # generate index.rst - print("Generating index.rst") - with open(pjoin(outdir, "index.rst"), "w") as index: - index.write(".. _workflows_reference:\n\n") - index.write("Command Line Utilities Reference\n") - index.write("================================\n\n") - index.write(".. toctree::\n\n") - for cmd in cmd_list: - index.write(" " + cmd) - index.write("\n") - print("Done") From 223a6556c30ffec2eddb7a18f43a2b418a77ff80 Mon Sep 17 00:00:00 2001 From: Serge Koudoro Date: Thu, 7 Sep 2023 23:13:11 -0400 Subject: [PATCH 06/38] update readme --- README.md | 149 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 136 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 3e7b11f4..268d12c9 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,27 @@ -# Documentation Generation +# DIPY.ORG +## Background + +This site makes use of [Sphinx](https://www.sphinx-doc.org/en/stable/) and was built upon [Bootstrap](https://getbootstrap.com) via the [GRG Sphinx theme](https://github.com/GRG-Projects/grg-sphinx-theme) and [PYData Sphinx Theme](https://pydata-sphinx-theme.readthedocs.io/en/latest/). +We use Github Action to deploy the website and Github Page to host the [website](https://dipy.org.github.io). ## Index -- `_static`: Contains images, css, js for Sphinx to look at -- `_templates`: Contains html layout for custom Sphinx design -- `build`: Contains the generated documentation -- `devel`: Contains `*.rst` files for the Developer's Guide -- `examples`: DIPY application showcases. Add any tutorial here -- `examples_built`: Keep it empty. Only for example generation -- `releases_notes`: Contains all API changes / PRs, issues resolved for a specific release -- `sphinxext`: Sphinx custom plugins -- `theory`: Diffusion theory + FAQ files -- `tools`: Scripts to generate some parts of the documentation, like the API +- `_static`: Contains all assets (images, CSS, JS) for Sphinx to look at. +- `_templates`: Contains html layout for custom Sphinx design. +- `_build`: Contains the generated documentation. +- `sphinxext`: Sphinx custom plugins. +- `theory`: Diffusion theory + FAQ files. +- `tools`: Contains all scripts to generate some parts of the documentation, like the API. +- `posts`: Contains all blog posts. -## Doc generation steps: +## Testing Locally: Doc generation steps: ### Installing requirements +To set up your computer to run this site locally, you need to install the various Python packages in the [requirements.txt](requirements.txt) at the top level of this repository. + ```bash -$ pip install -U -r doc-requirements.txt +$ pip install -U -r requirements.txt ``` ### Generate all the Documentation @@ -35,3 +38,123 @@ $ make -C . clean && make -C . html $ ./make.bat clean $ ./make.bat html ``` + +This will build a collection of html pages under `_build/html` and you can open the `index.html` using your browser of choice. + +## Creating a PR + +When you are happy with any changes you have made to the website. +We recommend building the website and making sure that everything is building fine. +You should see no warnings for the build. + +Once you are sure everything is in order, you can send a PR to this repository. +If you are unfamiliar with this, please see this guide from [GitHub.](https://help.github.com/articles/about-pull-requests/) + +## PR Review + +When a PR is opened, Github Action will create a preview of any content or style changes. + +This must pass before the PR will be merged, furthermore, one review is required before a PR can be merged as well. + +## Creating a Blog Post + +Blog posts can be added by creating a new text file in the `posts/` directory. +The filename must use the following naming convention `YEAR-MONTH-DAY-title.{ext}` and be written in one of the following formats: + +- [RST](https://www.sphinx-doc.org/en/stable/rest.html) formatted text, `ext=rst`, +- [Jupyter notebook](https://jupyter.org/), `ext=ipynb`; (notebooks are converted to RST using the [nbsphinx](https://nbsphinx.readthedocs.io) extension) +- [MD](https://www.markdownguide.org/cheat-sheet/) formatted text, `ext=md`, + +Please also see the [ABlog documentation](https://ablog.readthedocs.io/) for more information. + +### RST + +If you write your post in RST formatted text, each file must also contain the following header for Sphinx via [Ablog](https://github.com/sunpy/ablog) to parse the post properly: + +```rst +.. post:: + :author: + :tags: + :category: + + +========= + +``` + +or + +```rst +:blogpost: true +:date: <Date> +:author: <Name> +:category: <One of the below> + +<Title> +========= + +``` + +### Jupyter Notebook + +When writing posts as Jupyter notebooks, the first cell should be a Markdown cell with the title as a top-level heading (i.e. using a single `#`) and the second cell should be a raw cell containing the following + +```rst +.. post:: <Date> + :author: <Name> + :tags: <Tag list with commas> + :category: <One of the below> + :exclude: + + <Short description of post> +``` + +The short description will appear as a preview of your post on the blog page. +See the [nbsphinx docs](https://nbsphinx.readthedocs.io/raw-cells.html) for information on making raw notebook cells compatible with Sphinx and RST. + +You might have to open the notebook in a text editor and change the "metadata" for the post cell to include the following + +``` + "metadata": { + "raw_mimetype": "text/restructuredtext" + }, +``` + +In theory the alternative rst style and the below markdown style should also work in this cell. + +Additionally, Sphinx will automatically add a link to the interactive version of your notebook, hosted on [Binder](https://mybinder.org/), to the top of your post. +If your notebook requires any other dependencies besides SunPy (or its dependencies), they will need to be added to `binder/requirements.txt`. + +### Markdown + +If you write your post in markdown formatted text, each file must contain the following header for Sphinx via [Ablog](https://github.com/sunpy/ablog) to parse the post properly: + +``` +--- +blogpost: true +date: <Date> +author: <Name> +category: <One of the below> +--- + +# <Title> + +``` + +### Metadata + +Please note that the date for the post is different from the way it is written for the blog filename. +Since this date is reader-facing, we want month day year **e.g.,** May 14 2056. + +The current range of categories we have "officially" are: + +- release +- update +- gsoc +- news +- tutorial +- event + +Please select the more appropriate one, for many `update` or `news` would be enough. + +For tags, you can choose what you prefer for your post but please don't use any that are in the categories list. From 0b471c9eff372475de504d6298833251a6e0c9b2 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 11:13:28 -0400 Subject: [PATCH 07/38] add some actions --- .github/workflows/pr-close.yml | 29 ++++++++++++++++++ .github/workflows/publish.yml | 54 ++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 .github/workflows/pr-close.yml create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/pr-close.yml b/.github/workflows/pr-close.yml new file mode 100644 index 00000000..a0868bf2 --- /dev/null +++ b/.github/workflows/pr-close.yml @@ -0,0 +1,29 @@ +name: delete preview on PR close +on: + pull_request: + types: [closed] + +jobs: + delete_preview: + runs-on: ubuntu-latest + env: + PR_PATH: pull/${{github.event.number}} + steps: + - name: make empty dir + run: mkdir ${{ env.PR_PATH }} + + - name: delete folder + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ${{ env.PR_PATH }} + destination_dir: ${{ env.PR_PATH }} + + - name: Comment on PR + uses: hasura/comment-progress@v2.2.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.repository }} + number: ${{ github.event.number }} + id: deploy-preview + message: "🪓 PR closed, deleted preview at https://github.com/${{ github.repository }}/tree/gh-pages/${{ env.PR_PATH }}/" \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..c9426afd --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,54 @@ +name: github pages + +on: + push: + branches: + - master + pull_request: + branches: + - master + schedule: + - cron: '0 0 * * 1' + +permissions: + contents: write + +jobs: + deploy: + runs-on: ubuntu-latest + env: + PR_PATH: pull/${{github.event.number}} + steps: + - name: Comment on PR + uses: hasura/comment-progress@v2.2.0 + if: github.ref != 'refs/heads/master' + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.repository }} + number: ${{ github.event.number }} + id: deploy-preview + message: "Starting deployment of preview ⏳..." + + - name: Checkout website repo + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + # - name: Install dependencies + # run: | + # python -m pip install --upgrade pip + # pip install -r requirements.txt + + - name: Build website + uses: ammaraskar/sphinx-action@master + with: + docs-folder: "." + + - name: Upload HTML + uses: actions/upload-artifact@v1 + with: + name: DocumentationHTML + path: _build/html/ From 5ea3a0c27258769055f9abd33d25cffc92c0ce1a Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 11:23:33 -0400 Subject: [PATCH 08/38] fix build --- .github/workflows/publish.yml | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c9426afd..47c026f8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -37,18 +37,25 @@ jobs: with: python-version: '3.10' - # - name: Install dependencies - # run: | - # python -m pip install --upgrade pip - # pip install -r requirements.txt + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt - name: Build website - uses: ammaraskar/sphinx-action@master - with: - docs-folder: "." + run: | + make -C . html - name: Upload HTML uses: actions/upload-artifact@v1 with: name: DocumentationHTML path: _build/html/ + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + if: github.ref == 'refs/heads/master' + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./_build/html + # cname: ${{ env.DOMAIN # TODO: set this if you're using a custom domain. From e6c45015abf8e696a36de28a28a022904634a211 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 11:41:45 -0400 Subject: [PATCH 09/38] Update website link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 268d12c9..56984f41 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Background This site makes use of [Sphinx](https://www.sphinx-doc.org/en/stable/) and was built upon [Bootstrap](https://getbootstrap.com) via the [GRG Sphinx theme](https://github.com/GRG-Projects/grg-sphinx-theme) and [PYData Sphinx Theme](https://pydata-sphinx-theme.readthedocs.io/en/latest/). -We use Github Action to deploy the website and Github Page to host the [website](https://dipy.org.github.io). +We use Github Action to deploy the website and Github Page to host the [website](https://dipy.github.io/dipy.org/). ## Index - `_static`: Contains all assets (images, CSS, JS) for Sphinx to look at. From 6b8de956a91e693b6b96c9d915ddd40abb032d43 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 12:04:42 -0400 Subject: [PATCH 10/38] update pr management --- .github/workflows/pr-close.yml | 17 +++++++++-------- .github/workflows/publish.yml | 27 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pr-close.yml b/.github/workflows/pr-close.yml index a0868bf2..facf48be 100644 --- a/.github/workflows/pr-close.yml +++ b/.github/workflows/pr-close.yml @@ -9,15 +9,16 @@ jobs: env: PR_PATH: pull/${{github.event.number}} steps: - - name: make empty dir - run: mkdir ${{ env.PR_PATH }} - - - name: delete folder - uses: peaceiris/actions-gh-pages@v3 + - name: Checkout website repo + uses: actions/checkout@v4 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ${{ env.PR_PATH }} - destination_dir: ${{ env.PR_PATH }} + ref: gh-pages + + - name: Delete preview + run: | + git rm -r ${{ env.PR_PATH }} + git commit -m "Delete preview for PR #${{ github.event.number }}" + git push origin gh-pages - name: Comment on PR uses: hasura/comment-progress@v2.2.0 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 47c026f8..ff170144 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,6 +18,7 @@ jobs: runs-on: ubuntu-latest env: PR_PATH: pull/${{github.event.number}} + BASE_URL: https://dipy.github.io/dipy.org steps: - name: Comment on PR uses: hasura/comment-progress@v2.2.0 @@ -58,4 +59,30 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./_build/html + user_name: 'github-actions[bot]' + user_email: 'github-actions[bot]@users.noreply.github.com' + commit_message: ${{ github.event.head_commit.message }} # cname: ${{ env.DOMAIN # TODO: set this if you're using a custom domain. + + - name: Deploy to PR preview + uses: peaceiris/actions-gh-pages@v3 + if: github.ref != 'refs/heads/master' + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./_build/html + destination_dir: ${{ env.PR_PATH }} + keep_files: true + user_name: 'github-actions[bot]' + user_email: 'github-actions[bot]@users.noreply.github.com' + commit_message: ${{ github.event.head_commit.message }} + + - name: Update comment + uses: hasura/comment-progress@v2.2.0 + if: github.ref != 'refs/heads/master' + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.repository }} + number: ${{ github.event.number }} + id: deploy-preview + message: "A preview of ${{ github.event.after }} is uploaded and can be seen here:\n\n ✨ ${{ env.BASE_URL }}/${{ env.PR_PATH }} ✨\n\nChanges may take a few minutes to propagate. The source is here: https://github.com/${{ github.repository }}/tree/gh-pages/${{ env.PR_PATH }}/" + From 43b01fc3ac152b305c28b19a284f5631f2bd0bd1 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 12:50:45 -0400 Subject: [PATCH 11/38] menu update --- conf.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/conf.py b/conf.py index a56582db..859d9e7e 100644 --- a/conf.py +++ b/conf.py @@ -127,6 +127,140 @@ html_theme_options = { "secondary_sidebar_items": ["page-toc"], "show_toc_level": 1, + "navbar_center": ["components/navbar-links.html"], + "navbar_links": [ + { + "name": "Docs", + "children": [ + { + "name": "Quick Start", + "url": "https://docs.dipy.org", + }, + { + "name": "Tutorials", + "url": "https://docs.dipy.org/tutorials", + }, + { + "name": "Recipes", + "url": "https://docs.dipy.org/recipes", + }, + { + "name": "CLI / Workflows", + "url": "https://docs.dipy.org/cli", + }, + { + "name": "API", + "url": "https://docs.dipy.org/reference", + }, + { + "name": "CLI API", + "url": "https://docs.dipy.org/cli/reference", + } + ] + }, + { + "name": "Workshops", + "children": [ + { + "name": "DIPY Workshop 2024", + "url": "https://dipy.org/workshops/dipy-workshop-2024", + "external": True + }, + { + "name": "DIPY Workshop 2023", + "url": "https://dipy.org/workshops/dipy-workshop-2023", + "external": True + }, + { + "name": "DIPY Workshop 2022", + "url": "https://dipy.org/workshops/dipy-workshop-2022", + "external": True + }, + { + "name": "DIPY Workshop 2021", + "url": "https://dipy.org/workshops/dipy-workshop-2021", + "external": True + }, + { + "name": "DIPY Workshop 2020", + "url": "https://dipy.org/workshops/dipy-workshop-2020", + "external": True + }, + { + "name": "DIPY Workshop 2019", + "url": "https://dipy.org/workshops/dipy-workshop-2019", + "external": True + }, + ] + }, + { + "name": "Community", + "sections": [ + { + "name": "News", + "children": [ + { + "name": "Newsletters", + "url": "", + "external": True + }, + { + "name": "Blog", + "url": "blog" + }, + { + "name": "Youtube", + "url": "blog", + "external": True + } + ] + }, + { + "name": "Help", + "children": [ + { + "name": "Live Chat (Gitter)", + "url": "" + }, + { + "name": "Github Discussions", + "url": "", + "external": True + } + ] + } + ] + }, + { + "name": "About", + "children": [ + { + "name": "Team", + "url": "team", + }, + { + "name": "FAQ", + "url": "faq", + }, + { + "name": "Mission Statement", + "url": "mission", + }, + { + "name": "Releases", + "url": "releases", + }, + { + "name": "Cite", + "url": "cite", + }, + { + "name": "Glossary", + "url": "glossary", + }, + ] + }, + ], # To remove search icon "navbar_persistent": "", "icon_links": [ From e139333b951543785d38306b3b95efe6f737283a Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 15:28:40 -0400 Subject: [PATCH 12/38] update version and secrets name --- .github/workflows/publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ff170144..44c9f8b8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,10 +21,10 @@ jobs: BASE_URL: https://dipy.github.io/dipy.org steps: - name: Comment on PR - uses: hasura/comment-progress@v2.2.0 + uses: hasura/comment-progress@v2.3.0 if: github.ref != 'refs/heads/master' with: - github-token: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.GH_TOKEN }} repository: ${{ github.repository }} number: ${{ github.event.number }} id: deploy-preview @@ -77,10 +77,10 @@ jobs: commit_message: ${{ github.event.head_commit.message }} - name: Update comment - uses: hasura/comment-progress@v2.2.0 + uses: hasura/comment-progress@v2.3.0 if: github.ref != 'refs/heads/master' with: - github-token: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.GH_TOKEN }} repository: ${{ github.repository }} number: ${{ github.event.number }} id: deploy-preview From fd9e0d15a6560762c52bb5d4b93cc916cc441ea2 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 15:33:44 -0400 Subject: [PATCH 13/38] update permissions --- .github/workflows/publish.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 44c9f8b8..665e54a7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,6 +12,7 @@ on: permissions: contents: write + pull-requests: write jobs: deploy: @@ -24,7 +25,7 @@ jobs: uses: hasura/comment-progress@v2.3.0 if: github.ref != 'refs/heads/master' with: - github-token: ${{ secrets.GH_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} number: ${{ github.event.number }} id: deploy-preview @@ -80,7 +81,7 @@ jobs: uses: hasura/comment-progress@v2.3.0 if: github.ref != 'refs/heads/master' with: - github-token: ${{ secrets.GH_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} number: ${{ github.event.number }} id: deploy-preview From 43146b64e51b83028cccb6224b0cc84fa27dfd49 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 15:37:23 -0400 Subject: [PATCH 14/38] all permissions to see if it works --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 665e54a7..b5d18f3d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,9 +10,9 @@ on: schedule: - cron: '0 0 * * 1' -permissions: - contents: write - pull-requests: write +permissions: write-all +# contents: write +# pull-requests: write jobs: deploy: From b7c5dceaa5f7ea3312bdaf4523f99258a8a316e3 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 16:20:52 -0400 Subject: [PATCH 15/38] update permissions --- .github/workflows/publish.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b5d18f3d..bfc317eb 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,13 +10,12 @@ on: schedule: - cron: '0 0 * * 1' -permissions: write-all -# contents: write -# pull-requests: write - jobs: deploy: runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write env: PR_PATH: pull/${{github.event.number}} BASE_URL: https://dipy.github.io/dipy.org From d6aac928bcb68eadb1601f0cff450ea313d58274 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 21:52:16 -0400 Subject: [PATCH 16/38] new test for permissions --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bfc317eb..6177a4a0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,9 +13,9 @@ on: jobs: deploy: runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write + permissions: write-all + # contents: write + # pull-requests: write env: PR_PATH: pull/${{github.event.number}} BASE_URL: https://dipy.github.io/dipy.org From e39d044e4f6599d874e5413930c39b91a62b5226 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 22:46:17 -0400 Subject: [PATCH 17/38] update permissions --- .github/workflows/publish.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6177a4a0..7ea5225d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,9 +13,10 @@ on: jobs: deploy: runs-on: ubuntu-latest - permissions: write-all - # contents: write - # pull-requests: write + permissions: + contents: write + pull-requests: write + issues: 'write' env: PR_PATH: pull/${{github.event.number}} BASE_URL: https://dipy.github.io/dipy.org From 4a04debdd61ddf8983a2e18e0e95423c2a4210bc Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 22:47:04 -0400 Subject: [PATCH 18/38] use string --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7ea5225d..61047a71 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,8 +14,8 @@ jobs: deploy: runs-on: ubuntu-latest permissions: - contents: write - pull-requests: write + contents: 'write' + pull-requests: 'write' issues: 'write' env: PR_PATH: pull/${{github.event.number}} From 9a4133a6f0513a945b3ca03b3cd48bf2a09c0bca Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 22:53:05 -0400 Subject: [PATCH 19/38] change token --- .github/workflows/publish.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 61047a71..656b8387 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -17,6 +17,7 @@ jobs: contents: 'write' pull-requests: 'write' issues: 'write' + id-token: 'write' env: PR_PATH: pull/${{github.event.number}} BASE_URL: https://dipy.github.io/dipy.org @@ -25,7 +26,7 @@ jobs: uses: hasura/comment-progress@v2.3.0 if: github.ref != 'refs/heads/master' with: - github-token: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.GH_TOKEN }} repository: ${{ github.repository }} number: ${{ github.event.number }} id: deploy-preview From 210af593e50084996f0f72c495f1fb5b9d8df96e Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 23:11:17 -0400 Subject: [PATCH 20/38] back to initial test --- .github/workflows/publish.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 656b8387..a72e9c64 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,14 +10,16 @@ on: schedule: - cron: '0 0 * * 1' +permissions: write-all + jobs: deploy: runs-on: ubuntu-latest - permissions: - contents: 'write' - pull-requests: 'write' - issues: 'write' - id-token: 'write' + permissions: write-all + # contents: 'write' + # pull-requests: 'write' + # issues: 'write' + # id-token: 'write' env: PR_PATH: pull/${{github.event.number}} BASE_URL: https://dipy.github.io/dipy.org @@ -26,7 +28,7 @@ jobs: uses: hasura/comment-progress@v2.3.0 if: github.ref != 'refs/heads/master' with: - github-token: ${{ secrets.GH_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} number: ${{ github.event.number }} id: deploy-preview From f5ebaa0f858d28d19c15628863eece43fe94b5ff Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Mon, 11 Sep 2023 12:41:03 -0400 Subject: [PATCH 21/38] use pull request target --- .github/workflows/pr-close.yml | 2 +- .github/workflows/publish.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-close.yml b/.github/workflows/pr-close.yml index facf48be..d8833f18 100644 --- a/.github/workflows/pr-close.yml +++ b/.github/workflows/pr-close.yml @@ -1,6 +1,6 @@ name: delete preview on PR close on: - pull_request: + pull_request_target: types: [closed] jobs: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a72e9c64..aa33273d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ on: push: branches: - master - pull_request: + pull_request_target: branches: - master schedule: From 8c288ba9fd5abbb281bd4d753b9ad6acc38d4e9d Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Mon, 11 Sep 2023 13:07:08 -0400 Subject: [PATCH 22/38] add some conditions --- .github/workflows/publish.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index aa33273d..b115282c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,23 +10,20 @@ on: schedule: - cron: '0 0 * * 1' -permissions: write-all - jobs: deploy: runs-on: ubuntu-latest - permissions: write-all - # contents: 'write' - # pull-requests: 'write' - # issues: 'write' - # id-token: 'write' + permissions: + contents: read + pull-requests: write + issues: write env: PR_PATH: pull/${{github.event.number}} BASE_URL: https://dipy.github.io/dipy.org steps: - name: Comment on PR uses: hasura/comment-progress@v2.3.0 - if: github.ref != 'refs/heads/master' + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} with: github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} @@ -59,7 +56,7 @@ jobs: - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 - if: github.ref == 'refs/heads/master' + if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./_build/html @@ -70,7 +67,7 @@ jobs: - name: Deploy to PR preview uses: peaceiris/actions-gh-pages@v3 - if: github.ref != 'refs/heads/master' + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./_build/html @@ -82,7 +79,7 @@ jobs: - name: Update comment uses: hasura/comment-progress@v2.3.0 - if: github.ref != 'refs/heads/master' + if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} with: github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} From 360c3f80891b9c997d0a592063777fc06549e24d Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Mon, 11 Sep 2023 16:00:12 -0400 Subject: [PATCH 23/38] allow write to content --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b115282c..c60eb216 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,7 +14,7 @@ jobs: deploy: runs-on: ubuntu-latest permissions: - contents: read + contents: write pull-requests: write issues: write env: From f12105639914a239aecde562e0a438f2d6e9b36f Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Mon, 11 Sep 2023 21:26:25 -0400 Subject: [PATCH 24/38] update condition --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c60eb216..a4fe4af3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Comment on PR uses: hasura/comment-progress@v2.3.0 - if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + if: ${{github.event.number}} && ${{ github.event.pull_request.head.repo.full_name != github.repository }} with: github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} @@ -67,7 +67,7 @@ jobs: - name: Deploy to PR preview uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + if: ${{github.event.number}} && ${{ github.event.pull_request.head.repo.full_name != github.repository }} with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./_build/html @@ -79,7 +79,7 @@ jobs: - name: Update comment uses: hasura/comment-progress@v2.3.0 - if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} + if: ${{github.event.number}} && ${{ github.event.pull_request.head.repo.full_name != github.repository }} with: github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} From 533288015c5536ad59268719ba326c8f7ae41d9b Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Mon, 11 Sep 2023 21:31:12 -0400 Subject: [PATCH 25/38] debug info --- .github/workflows/publish.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a4fe4af3..08d99c75 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,6 +20,10 @@ jobs: env: PR_PATH: pull/${{github.event.number}} BASE_URL: https://dipy.github.io/dipy.org + HEAD: ${{ github.event.pull_request.head.repo.full_name }} + BASE: ${{ github.repository }} + NB: ${{github.event.number}} + STATUS: ${{github.event.pull_request.head.repo.full_name != github.repository}} steps: - name: Comment on PR uses: hasura/comment-progress@v2.3.0 From dfe3d44497b00872bd8a73510d9530c86d19dbd0 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Mon, 11 Sep 2023 21:50:50 -0400 Subject: [PATCH 26/38] test null --- .github/workflows/publish.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 08d99c75..2e21582d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,11 +23,12 @@ jobs: HEAD: ${{ github.event.pull_request.head.repo.full_name }} BASE: ${{ github.repository }} NB: ${{github.event.number}} + REF: ${{github.ref}} STATUS: ${{github.event.pull_request.head.repo.full_name != github.repository}} steps: - name: Comment on PR uses: hasura/comment-progress@v2.3.0 - if: ${{github.event.number}} && ${{ github.event.pull_request.head.repo.full_name != github.repository }} + if: ${{ github.event.pull_request.head.repo.full_name != '' && github.event.pull_request.head.repo.full_name != github.repository }} with: github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} @@ -71,7 +72,7 @@ jobs: - name: Deploy to PR preview uses: peaceiris/actions-gh-pages@v3 - if: ${{github.event.number}} && ${{ github.event.pull_request.head.repo.full_name != github.repository }} + if: ${{ github.event.pull_request.head.repo.full_name != '' && github.event.pull_request.head.repo.full_name != github.repository }} with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./_build/html @@ -83,7 +84,7 @@ jobs: - name: Update comment uses: hasura/comment-progress@v2.3.0 - if: ${{github.event.number}} && ${{ github.event.pull_request.head.repo.full_name != github.repository }} + if: ${{ github.event.pull_request.head.repo.full_name != '' && github.event.pull_request.head.repo.full_name != github.repository }} with: github-token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} From 33a09ef0a650550729a7f3a5534cbe9fc71972f0 Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Mon, 11 Sep 2023 21:56:15 -0400 Subject: [PATCH 27/38] make sure to deploy --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2e21582d..7b7ee436 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -61,7 +61,7 @@ jobs: - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + if: ${{ github.event.pull_request.head.repo.full_name == '' || github.event.pull_request.head.repo.full_name == github.repository }} with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./_build/html From f452985dad398ffba155a3ee0e711826e9cb1a52 Mon Sep 17 00:00:00 2001 From: maharshigor <gor.maharshi@gmail.com> Date: Fri, 8 Sep 2023 14:26:40 -0400 Subject: [PATCH 28/38] basic home page ready --- _static/css/dipy.css | 1 - conf.py | 1 - 2 files changed, 2 deletions(-) diff --git a/_static/css/dipy.css b/_static/css/dipy.css index c4817131..8646f6c9 100644 --- a/_static/css/dipy.css +++ b/_static/css/dipy.css @@ -7,7 +7,6 @@ @import url("./common/variables.css"); @import url("./common/override.css"); -@import url("./common/util.css"); /* Home CSS */ @import "./home/index.css"; \ No newline at end of file diff --git a/conf.py b/conf.py index 859d9e7e..e1b572ce 100644 --- a/conf.py +++ b/conf.py @@ -126,7 +126,6 @@ # documentation. html_theme_options = { "secondary_sidebar_items": ["page-toc"], - "show_toc_level": 1, "navbar_center": ["components/navbar-links.html"], "navbar_links": [ { From 982b455455043e21a16401a90b0b05a4f4b22ba4 Mon Sep 17 00:00:00 2001 From: maharshigor <gor.maharshi@gmail.com> Date: Tue, 12 Sep 2023 15:41:17 -0400 Subject: [PATCH 29/38] Good looking home page --- _static/css/dipy.css | 1 + 1 file changed, 1 insertion(+) diff --git a/_static/css/dipy.css b/_static/css/dipy.css index 8646f6c9..c4817131 100644 --- a/_static/css/dipy.css +++ b/_static/css/dipy.css @@ -7,6 +7,7 @@ @import url("./common/variables.css"); @import url("./common/override.css"); +@import url("./common/util.css"); /* Home CSS */ @import "./home/index.css"; \ No newline at end of file From e675cebeb6e3316a3638c3c1a6425dbd24c63b4d Mon Sep 17 00:00:00 2001 From: Serge Koudoro <skab12@gmail.com> Date: Fri, 8 Sep 2023 12:50:45 -0400 Subject: [PATCH 30/38] menu update --- conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/conf.py b/conf.py index e1b572ce..859d9e7e 100644 --- a/conf.py +++ b/conf.py @@ -126,6 +126,7 @@ # documentation. html_theme_options = { "secondary_sidebar_items": ["page-toc"], + "show_toc_level": 1, "navbar_center": ["components/navbar-links.html"], "navbar_links": [ { From b94f0d4ed1b88e3290d4363a4e1dd8f2f8b0603b Mon Sep 17 00:00:00 2001 From: maharshigor <gor.maharshi@gmail.com> Date: Tue, 12 Sep 2023 16:17:26 -0400 Subject: [PATCH 31/38] deleted not used file --- _static/css/common/util.css | 279 ------------------------------------ 1 file changed, 279 deletions(-) delete mode 100644 _static/css/common/util.css diff --git a/_static/css/common/util.css b/_static/css/common/util.css deleted file mode 100644 index 43e7dc39..00000000 --- a/_static/css/common/util.css +++ /dev/null @@ -1,279 +0,0 @@ -/* Margin Utils */ -.mar-5 { - margin: 5px; -} -.mar-v-5 { - margin-top: 5px; - margin-bottom: 5px; -} -.mar-h-5 { - margin-left: 5px; - margin-right: 5px; -} -.mar-t-5 { - margin-top: 5px; -} -.mar-b-5 { - margin-bottom: 5px; -} -.mar-l-5 { - margin-left: 5px; -} -.mar-r-5 { - margin-right: 5px; -} -.mar-10 { - margin: 10px; -} -.mar-v-10 { - margin-top: 10px; - margin-bottom: 10px; -} -.mar-h-10 { - margin-left: 10px; - margin-right: 10px; -} -.mar-t-10 { - margin-top: 10px; -} -.mar-b-10 { - margin-bottom: 10px; -} -.mar-l-10 { - margin-left: 10px; -} -.mar-r-10 { - margin-right: 10px; -} -.mar-12 { - margin: 12px; -} -.mar-v-12 { - margin-top: 12px; - margin-bottom: 12px; -} -.mar-h-12 { - margin-left: 12px; - margin-right: 12px; -} -.mar-t-12 { - margin-top: 12px; -} -.mar-b-12 { - margin-bottom: 12px; -} -.mar-l-12 { - margin-left: 12px; -} -.mar-r-12 { - margin-right: 12px; -} - -/* Padding Utils */ -.pad-5 { - padding: 5px; -} -.pad-v-5 { - padding-top: 5px; - padding-bottom: 5px; -} -.pad-h-5 { - padding-left: 5px; - padding-right: 5px; -} -.pad-t-5 { - padding-top: 5px; -} -.pad-b-5 { - padding-bottom: 5px; -} -.pad-l-5 { - padding-left: 5px; -} -.pad-r-5 { - padding-right: 5px; -} -.pad-10 { - padding: 10px; -} -.pad-v-10 { - padding-top: 10px; - padding-bottom: 10px; -} -.pad-h-10 { - padding-left: 10px; - padding-right: 10px; -} -.pad-t-10 { - padding-top: 10px; -} -.pad-b-10 { - padding-bottom: 10px; -} -.pad-l-10 { - padding-left: 10px; -} -.pad-r-10 { - padding-right: 10px; -} -.pad-12 { - padding: 12px; -} -.pad-v-12 { - padding-top: 12px; - padding-bottom: 12px; -} -.pad-h-12 { - padding-left: 12px; - padding-right: 12px; -} -.pad-t-12 { - padding-top: 12px; -} -.pad-b-12 { - padding-bottom: 12px; -} -.pad-l-12 { - padding-left: 12px; -} -.pad-r-12 { - padding-right: 12px; -} -.pad-20 { - padding: 20px; -} -.pad-v-20 { - padding-top: 20px; - padding-bottom: 20px; -} -.pad-h-20 { - padding-left: 20px; - padding-right: 20px; -} -.pad-t-20 { - padding-top: 20px; -} -.pad-b-20 { - padding-bottom: 20px; -} -.pad-l-20 { - padding-left: 20px; -} -.pad-r-20 { - padding-right: 20px; -} -.pad-32 { - padding: 32px; -} -.pad-v-32 { - padding-top: 32px; - padding-bottom: 32px; -} -.pad-h-32 { - padding-left: 32px; - padding-right: 32px; -} -.pad-t-32 { - padding-top: 32px; -} -.pad-b-32 { - padding-bottom: 32px; -} -.pad-l-32 { - padding-left: 32px; -} -.pad-r-32 { - padding-right: 32px; -} -.pad-48 { - padding: 48px; -} -.pad-v-48 { - padding-top: 48px; - padding-bottom: 48px; -} -.pad-h-48 { - padding-left: 48px; - padding-right: 48px; -} -.pad-t-48 { - padding-top: 48px; -} -.pad-b-48 { - padding-bottom: 48px; -} -.pad-l-48 { - padding-left: 48px; -} -.pad-r-48 { - padding-right: 48px; -} - -/* Grid Utils */ - -/* Styles for phones */ -@media only screen and (max-width: 768px) { - /* Your CSS styles for phones go here */ - .grid-1, - .grid-2, - .grid-3 { - display: grid; - grid-template-columns: repeat(1, 1fr); - } - - .grid-4, - .grid-5 { - display: grid; - grid-template-columns: repeat(2, 1fr); - } -} - -/* Styles for tablets */ -@media only screen and (min-width: 769px) and (max-width: 1024px) { - /* Your CSS styles for tablets go here */ - .grid-1 { - display: grid; - grid-template-columns: repeat(1, 1fr); - } - - .grid-2 { - display: grid; - grid-template-columns: repeat(2, 1fr); - } - - .grid-3, - .grid-4, - .grid-5 { - display: grid; - grid-template-columns: repeat(3, 1fr); - } -} - -/* Styles for laptops and desktops */ -@media only screen and (min-width: 1025px) { - /* Your CSS styles for laptops and desktops go here */ - .grid-1 { - display: grid; - grid-template-columns: repeat(1, 1fr); - } - - .grid-2 { - display: grid; - grid-template-columns: repeat(2, 1fr); - } - - .grid-3 { - display: grid; - grid-template-columns: repeat(3, 1fr); - } - - .grid-4 { - display: grid; - grid-template-columns: repeat(4, 1fr); - } - - .grid-5 { - display: grid; - grid-template-columns: repeat(5, 1fr); - } -} \ No newline at end of file From 74de37c3d64ee8cf7b189641831179efd8fbec6a Mon Sep 17 00:00:00 2001 From: maharshigor <gor.maharshi@gmail.com> Date: Wed, 13 Sep 2023 09:20:19 -0400 Subject: [PATCH 32/38] few changes for the slide --- _static/css/home/index.css | 4 ++-- _templates/components/carousel.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_static/css/home/index.css b/_static/css/home/index.css index 145fccc6..3cb55cf8 100644 --- a/_static/css/home/index.css +++ b/_static/css/home/index.css @@ -10,13 +10,13 @@ } div.section:nth-child(n+3) { - margin: 32px 0; + margin: 72px 0; padding: 0 20px; } h2.section-title { padding: 10px 0; - margin: 10px 0 10px; + margin: 10px 0; text-align: center; font-weight: 900; font-size: 50px; diff --git a/_templates/components/carousel.html b/_templates/components/carousel.html index e61c57fc..f9a6e855 100644 --- a/_templates/components/carousel.html +++ b/_templates/components/carousel.html @@ -1,4 +1,4 @@ -<div id="banners" class="carousel slide" data-bs-ride="carousel"> +<div id="banners" class="carousel slide carousel-fade" data-bs-ride="carousel"> <div class="carousel-indicators"> <button type="button" data-bs-target="#banners" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"></button> <button type="button" data-bs-target="#banners" data-bs-slide-to="1" aria-label="Slide 2"></button> From 41127bd255967f079f1f35254fc02d0118c1ce68 Mon Sep 17 00:00:00 2001 From: maharshigor <gor.maharshi@gmail.com> Date: Wed, 13 Sep 2023 09:47:09 -0400 Subject: [PATCH 33/38] small changes fixed --- _static/css/common/variables.css | 2 +- _static/css/dipy.css | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/_static/css/common/variables.css b/_static/css/common/variables.css index 19456eaa..0245be3a 100644 --- a/_static/css/common/variables.css +++ b/_static/css/common/variables.css @@ -2,7 +2,7 @@ html[data-theme="light"] { --gst-color-primary: #FD8D25; --gst-color-secondary: #1B8BF4; --gst-color-bg: var(--bs-white); - --gst-color-bg-gray: var(--bs-gray-200); + --gst-color-bg-gray: var(--bs-gray-100); --gst-color-light-border: var(--pst-color-border); } diff --git a/_static/css/dipy.css b/_static/css/dipy.css index c4817131..8646f6c9 100644 --- a/_static/css/dipy.css +++ b/_static/css/dipy.css @@ -7,7 +7,6 @@ @import url("./common/variables.css"); @import url("./common/override.css"); -@import url("./common/util.css"); /* Home CSS */ @import "./home/index.css"; \ No newline at end of file From 88d976f2e0b51104f32007c6015d091d22ec7043 Mon Sep 17 00:00:00 2001 From: maharshigor <gor.maharshi@gmail.com> Date: Wed, 13 Sep 2023 11:11:07 -0400 Subject: [PATCH 34/38] icons-added --- conf.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 3c569f73..0c5cc9cd 100644 --- a/conf.py +++ b/conf.py @@ -269,7 +269,22 @@ "name": "GitHub", "url": "https://github.com/dipy", "icon": "fa-brands fa-github" - } + }, + { + "name": "Twitter/X", + "url": "https://twitter.com/dipymri", + "icon": "fa-brands fa-twitter" + }, + { + "name": "YouTube", + "url": "https://www.youtube.com/c/diffusionimaginginpython", + "icon": "fa-brands fa-youtube" + }, + { + "name": "LinkedIn", + "url": "https://www.linkedin.com/company/dipy/", + "icon": "fa-brands fa-linkedin" + }, ], "logo": { "image_dark": "_static/images/logos/dipy-logo.png", From 72c70273d2fe2acc3fdb683290a86cc357efb7f0 Mon Sep 17 00:00:00 2001 From: maharshigor <gor.maharshi@gmail.com> Date: Wed, 13 Sep 2023 14:52:17 -0400 Subject: [PATCH 35/38] Comments addressed --- _static/css/home/carousel.css | 44 +++++++-- _static/css/home/explore.css | 21 +++- _static/images/icons/chart.png | Bin 0 -> 797 bytes _static/images/icons/cli.png | Bin 389 -> 0 bytes _static/images/icons/cli.svg | 1 + _static/images/icons/denoise.png | Bin 0 -> 345 bytes _static/images/icons/preprocessing.png | Bin 0 -> 807 bytes _static/images/icons/reconstruction.svg | 1 + _static/images/icons/registration.svg | 1 + _static/images/icons/stat.svg | 1 + _static/images/icons/tractography.svg | 5 + _templates/components/carousel.html | 42 +++----- _templates/components/explore.html | 126 ++---------------------- conf.py | 8 +- context/context.json | 103 +++++++++++++++++++ context/explore.json | 7 -- context/sponsors.json | 23 ----- 17 files changed, 195 insertions(+), 188 deletions(-) create mode 100644 _static/images/icons/chart.png delete mode 100644 _static/images/icons/cli.png create mode 100644 _static/images/icons/cli.svg create mode 100644 _static/images/icons/denoise.png create mode 100644 _static/images/icons/preprocessing.png create mode 100644 _static/images/icons/reconstruction.svg create mode 100644 _static/images/icons/registration.svg create mode 100644 _static/images/icons/stat.svg create mode 100644 _static/images/icons/tractography.svg create mode 100644 context/context.json delete mode 100644 context/explore.json delete mode 100644 context/sponsors.json diff --git a/_static/css/home/carousel.css b/_static/css/home/carousel.css index 36d2da8d..a7947f6d 100644 --- a/_static/css/home/carousel.css +++ b/_static/css/home/carousel.css @@ -1,17 +1,45 @@ .carousel-item { - height: 520px; + height: 440px; } -.carousel-control-next-icon, -.carousel-control-prev-icon { - color: var(--gst-color-primary); - background: none; - font-size: 40px; - font-weight: 900; +.carousel-indicators [data-bs-target] { + background-color: var(--gst-color-primary); } -.carousel-indicators [data-bs-target] { + +.carousel-caption { + opacity: 0.9; + width: fit-content; + bottom: auto; + top: 40px; + left: 0; + background-color: var(--gst-color-primary); + box-shadow: var(--pst-shadow); +} + +.carousel-caption::after { + position: absolute; + content: ""; + height: 100%; + clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 35% 50%); background-color: var(--gst-color-primary); + width: 60px; + transform: scaleX(-1); + right: -40px; + top: 0; +} + + +.carousel-caption h5 { + color: var(--bs-white); + font-size: 24px; + font-weight: 900; + margin: 0; +} + +.carousel-caption a, +.carousel-caption a:visited { + color: var(--bs-white); } @media only screen and (max-width: 768px) { diff --git a/_static/css/home/explore.css b/_static/css/home/explore.css index 40b35add..d76a8e9a 100644 --- a/_static/css/home/explore.css +++ b/_static/css/home/explore.css @@ -4,11 +4,15 @@ } .explore-tile { - box-shadow: var(--pst-shadow); border-radius: 12px; - /* TODO This should be removed as the util will be available */ - /* padding: 48px 20px; */ - background-color: var(--gst-color-bg); + background-color: var(--gst-color-bg-gray); + border: 1px solid var(--pst-color-border); + transition: all 0.2s ease-in-out; +} + +.explore-tile:hover, +.explore-tile:hover .explore-tile-icon { + box-shadow: var(--pst-shadow); } .explore-tile-icon { @@ -19,7 +23,11 @@ /* TODO This should be removed as the util will be available */ padding: 12px; margin-bottom: 24px; - box-shadow: var(--pst-shadow); + transition: all 0.2s ease-in-out; +} + +.explore-tile-icon img { + filter: invert(1) !important; } .explore-tile-title { @@ -29,4 +37,7 @@ .explore-tile-know-more, .explore-tile-know-more:visited { color: var(--gst-color-primary); + text-transform: uppercase; + font-size: 14px; + font-weight: 600; } \ No newline at end of file diff --git a/_static/images/icons/chart.png b/_static/images/icons/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd259cf0778548e212e573b9369b3f8b8dffe31 GIT binary patch literal 797 zcmV+&1LFLNP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00009a7bBm000XU z000XU0RWnu7ytkQ&q+i<RCt{2o6BkxK@^6+5!#JWpFqWpK7l@hdskj?ViFyql8uNL z+!#SYMP0d2a3`7Ud;xs`MSKczqYDv1F(%b=paMlr^>p`4U#hG6hXb9Y(sTZ=>zuCX znS%DT2N>#*<LI;qq&fsbbXqq6$Z_j>0&E#cg&N}Vu?xUo50Yyt#Os98$f5_(&j3qp zPszRn=z9Qt6QsWj(BB5>*8#X7+yoMeNygm@Z6UNkIqeM%z-?`+jDiA?W`qK+#R@=8 zF&{jD9bja6Sd9gM0<K#5U(!&52cR70SG4)mM*x3-kH81u_nhb2(Pm9uHq3hkKmkvI zgT`yfz5Icd@I2;sr+w-h00mqjTNi-slIEAEOna{YC`UIw3LKshf|y(?Xg)O-ORcN~ zmBai{KZ@RRd;pRMK}=q>{%1L-gk;6I54h7b0OeSeoU;tNuI3rwUqSOrGxm?#0Vs$0 ztSjZ}4>pADn$1@Z;Cg}XY+qd&W0yl#sVr7(zH$Hy#(72slXWd+4*^H4-wjLNF<Jp| zPeZt&r}#Wg)1DP|n6Df_>d}I!a{$sBmdv#QP{0`2C^^-AjM4z?dfki(fO0gejhFzu zvBs{(Rs!R|%$EkBG=y;==1T)e1B?m%@*t_E;-?G1XAcr<Dn7XY-1Q)_ra~T;Oy~gc z)q~{fjxWG|GISF7;X#shg?Kwbj*bKGJxI3dcn2KIGjD?!=`S)r>S(NM52cLv>eY<o zdpv9U>G6OF&A&Ao)a#hG%_Nrjs30U6=A(d+<d_c{LgFz0%{cyU{q1E)jWKbUe+Aq( zewGExix6i*;xNB^b?t3)gU}!(4)f2AsqNY~7z~8OVg6acjgy^+kT}fC8<R3SM+dr8 zI@uW4ti&JAxOLVA;XEDCijlB%`Ya8Naq=-Z1t6TI0~!FQfm1o-q^8BV#I*XB^NDeZ b%1hus5U=yj6E%R#00000NkvXXu0mjf8h&PN literal 0 HcmV?d00001 diff --git a/_static/images/icons/cli.png b/_static/images/icons/cli.png deleted file mode 100644 index c0f865ef409bacc2d65206c46c85421e0efe5964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 389 zcmV;00eb$4P)<h;3K|Lk000e1NJLTq001-q001-y1^@s6#dsU*00009a7bBm000XU z000XU0RWnu7ytkPH%UZ6RCt{2nn6y(Knz7K6_G;#_n{nv6${{2uwf53C}kDS05>4r zmWM2+QZ%ZnHZzqxuHP~mOMdxIHXe~62&w>dz$35(R@i5idVSE|bD0a^lXmIVVVq3M zGGnPu(wKSSUWGpJ!@CL%_+d~XR|w7!oFRA@lExr}j6)=398NwVU<N#8FX9)tlU5VL zuoP2A&Z-n8-;hNqN`DI0q$m}#CPfV)OHx!8dUhd%5t%ANmSl>BfHUAFD_H}#J8Eu# zZ}vye&Uf`uMQDmlsyjqx!`D%Tm?&dXhys~ZKi38ikpZrcCS)B#$T&no#vu|i4yTaN zkUhJUMgXp|-hZ~OBwzKQv?24hZ6&FDepgH5F0I5{rw7i*7cY7j7cVxbokpf}*vMvl j02Zm||73z7kW&5tN)stO0v^c-00000NkvXXu0mjfU9XW> diff --git a/_static/images/icons/cli.svg b/_static/images/icons/cli.svg new file mode 100644 index 00000000..a082ad98 --- /dev/null +++ b/_static/images/icons/cli.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 40" fill="none" x="0px" y="0px"><path fill-rule="evenodd" clip-rule="evenodd" d="M7 4C4.23858 4 2 6.23858 2 9V23C2 25.7614 4.23858 28 7 28H25C27.7614 28 30 25.7614 30 23V9C30 6.23858 27.7614 4 25 4H7ZM8.26299 12.4038C7.87246 12.7943 7.87246 13.4275 8.26299 13.818L11.445 17L8.26299 20.182C7.87246 20.5725 7.87246 21.2057 8.26299 21.5962C8.65351 21.9867 9.28668 21.9867 9.6772 21.5962L13.5663 17.7071C13.9568 17.3166 13.9568 16.6834 13.5663 16.2929L9.6772 12.4038C9.28667 12.0133 8.65351 12.0133 8.26299 12.4038ZM14 21C14 20.4477 14.4477 20 15 20H21C21.5523 20 22 20.4477 22 21C22 21.5523 21.5523 22 21 22H15C14.4477 22 14 21.5523 14 21Z" fill="black"/><text x="0" y="47" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Braja Omar Justico</text><text x="0" y="52" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg> \ No newline at end of file diff --git a/_static/images/icons/denoise.png b/_static/images/icons/denoise.png new file mode 100644 index 0000000000000000000000000000000000000000..3878205cd978283bec047673ccaf02c812229fc6 GIT binary patch literal 345 zcmV-f0jB<mP)<h;3K|Lk000e1NJLTq001%o001%w1^@s69zTe&00009a7bBm000XU z000XU0RWnu7ytkP3rR#lRCt{2nMn?VFbqZiLFlsL?iJ!@l?oU5RV83iDT?C&8SE!{ z0m|SP>}&uW$I<WrFacNru##8-%mBs|iFXBwGZ4Sr28qa2L9&d*OCnNJIWZ86L?m@l z?Y!KGVpfEiiMU9N+>=WkuU*Hk2rG>!=0r-B99;zWlt}YE(v1j9_XukjaZ1BZ0;LnU ztY;V)pnV^E&V3)GJCU8-#HFPm6|gJ9$b{tPOWcRT1G6ha;l`=!XiL<dNN$4vXb)n? zMR?N5Nymrwx$M?zUW7M2Q`uwvi|m|r3+2wIS&>!PtY?*m=JNPRMCJxWCW*+{!0+iN rgbdp+;H84Zxy7=539*FZI5_wM-uOJlnvaCz00000NkvXXu0mjf^FWdi literal 0 HcmV?d00001 diff --git a/_static/images/icons/preprocessing.png b/_static/images/icons/preprocessing.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc91e28072d02a2699f014836ca2933bc964c51 GIT binary patch literal 807 zcmV+?1K9kDP)<h;3K|Lk000e1NJLTq001%o001%w1^@s69zTe&00009a7bBm000XU z000XU0RWnu7ytkQ*-1n}RCt{2n!jrlK@`V7!C+8xCxX$!9|$>6BVwYW5lgYrUM)TJ z4=}{e7!V<%V*Y|y*?EYCt%8L{ETXN2DCSVOSZR@5?vh&>cnizA?#|54-R_<F!WROW zn|a^ec{|^IZ(#%f2krywfEQvDn52tPjS%7U16_h5(25aK2m0v(jK_%Zc__;O_X88a zP{O#fhLB4Ma|{7DfPFZ|0pP0yQ3Ec<jD4sf<W9`*&jH_MoXWM5D-orL<W)KF2p9;B z-2uGO5b_ErgnqkOE<!lJ7J=b*hzRl{Fd}*J99Y#5;d2>y0vrVn0t+!?Q;FG|Ai`(E zAowV%JFucLZV}jHBSa@@JI$*$Lbd{*auB>H{0t0Yi4zXCjte${)1<_74unkM0Lo6x zXDH$=un9*fWwgbXU7R67oXO~JtOG|}3VC4|fU+^SfKgzZa7^}k&2X+cS0Z-FQ$u&* zrxEre2=%{;!F<1fEw=9y%5q#6KlR>FM4!eQeTHIQ0}teoK9z8xxF<Hic0bpW7KpfD zODWd-CNckowUmjea>5k1Q?9udHEG=IsSb}>2pLPcW~&`SY<y55k3tF-LW+45GMbmI z)yTlur8T6Ds7Y^1@vPpV$M1IFr{!98iFGo`?W*_i%fO6gF~MiW;6Qw4Fz-v?u9T4u z+ZOmtElNd_IPOlEi1=-5QCyhDB{}Sl%VT*^{+_njPLJsU8{cwm<3|j)mn*JF&C3Y} zq!8z2#09BBrp9cBB0QlgrKZAp2PeL(T)AK?Vkht;2O_+{fxFvA$V3i;_d--X6RXCK zP7!;xLq+VW#MG9y!aEr=E~m9^TVXh%2v~K|@QD)BlvBDtqR}(2Sxg8UOjS*sig4jh zyH>&0+ZW($%Ez@bfd9hDKo`KNh+yNVEXB4sT+<M8MWdxrwr%Wm(w8YKo_iE~<%5Bq l`Gf<h0QSU3H5<SZe*j_9gje%7LV5rI002ovPDHLkV1gC?X{i7J literal 0 HcmV?d00001 diff --git a/_static/images/icons/reconstruction.svg b/_static/images/icons/reconstruction.svg new file mode 100644 index 00000000..a3d15b53 --- /dev/null +++ b/_static/images/icons/reconstruction.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 48 60" style="enable-background:new 0 0 48 48;" xml:space="preserve"><path d="M31.781,40.689C31.924,41.87,32,42.986,32,44h-4c0-2.457-2.491-5.194-4.263-8.358c0.313-0.194,0.604-0.42,0.891-0.651 c0.539,0.841,1.192,1.657,1.958,2.423C28.121,38.949,29.942,40.077,31.781,40.689z M37,35c-1.179,0-2.333-0.305-3.361-0.876 C32.52,34.7,31.284,35,30,35c-1.236,0-2.427-0.298-3.507-0.827C26.921,34.805,27.421,35.421,28,36c3.314,3.314,7.791,4.209,10,2 c0.606-0.606,0.97-1.385,1.123-2.261c-0.598-0.17-1.174-0.422-1.716-0.752C37.269,34.995,37.134,35,37,35z M45.307,26.5 C45.736,27.238,46,28.085,46,29c0,2.761-2.239,5-5,5c-1.17,0-2.233-0.419-3.084-1.092C37.618,32.963,37.314,33,37,33 c-0.513,0-0.997-0.098-1.461-0.244C37.042,31.3,38,29.252,38,27c0-0.553-0.448-1-1-1s-1,0.447-1,1c0,1.917-0.905,3.624-2.308,4.723 C32.673,32.52,31.394,33,30,33c-1.852,0-3.506-0.84-4.607-2.158C24.523,29.801,24,28.46,24,27c0-0.553-0.448-1-1-1s-1,0.447-1,1 c0,2.169,0.874,4.14,2.28,5.582C22.998,34.061,21.111,35,19,35c-3.804,0-7-3.102-7-7c0-1.906,0.729-3.729,2-5 c0.391-0.391,0.391-1.023,0-1.414s-1.023-0.391-1.414,0C10.942,23.229,10,25.567,10,28c0,0.299,0.016,0.605,0.045,0.897 C9.705,28.957,9.358,29,9,29c-3.05,0-5.562-2.277-5.944-5.223C4.179,24.544,5.541,25,7,25c0.552,0,1-0.447,1-1s-0.448-1-1-1 c-1.498,0-2.83-0.673-3.747-1.72C2.483,20.4,2,19.261,2,18c0-1.675,0.831-3.148,2.095-4.056C4.914,13.352,5.915,13,7,13 c0.552,0,1-0.447,1-1s-0.448-1-1-1c-0.975,0-1.926,0.213-2.771,0.575c0.562-1.865,2.174-3.269,4.161-3.513 C9.148,6.263,10.926,5,13,5c0.085,0,0.167,0.012,0.251,0.017C12.468,6.147,12,7.525,12,9c0,0.553,0.448,1,1,1s1-0.447,1-1 c0-1.311,0.516-2.498,1.345-3.391C16.258,4.625,17.552,4,19,4c1.131,0,2.162,0.39,3,1.023C23.209,5.936,24,7.371,24,9 c0,0.553,0.448,1,1,1s1-0.447,1-1c0-1.895-0.769-3.624-1.996-4.885C24.326,4.047,24.656,4,25,4c1.448,0,2.742,0.625,3.655,1.609 C29.357,5.233,30.148,5,31,5c1.252,0,2.392,0.465,3.269,1.225C31.249,7.002,29,9.742,29,13c0,0.553,0.448,1,1,1s1-0.447,1-1 c0-2.619,2.024-4.774,4.59-4.983C35.693,8.005,35.863,8,36,8c2.761,0,5,2.239,5,5c0,0.137-0.03,0.266-0.04,0.4 C42.747,14.163,44,15.934,44,18c0,0.629-0.129,1.225-0.341,1.78C42.939,21.658,41.129,23,39,23c-0.552,0-1,0.447-1,1s0.448,1,1,1 c2.67,0,4.997-1.515,6.177-3.718C45.692,22.064,46,22.993,46,24C46,24.915,45.736,25.762,45.307,26.5z M20,10c0-0.553-0.448-1-1-1 s-1,0.447-1,1c0,3.859-4.486,7-10,7c-0.552,0-1,0.447-1,1s0.448,1,1,1C14.617,19,20,14.963,20,10z M27,18c0-0.553-0.448-1-1-1 s-1,0.447-1,1c0,1.654-1.346,3-3,3c-2.757,0-5,2.243-5,5c0,0.553,0.448,1,1,1s1-0.447,1-1c0-1.654,1.346-3,3-3 C24.757,23,27,20.757,27,18z M38,15c0-0.553-0.448-1-1-1c-4.486,0-8,5.71-8,13c0,0.553,0.448,1,1,1s1-0.447,1-1 c0-5.963,2.748-11,6-11C37.552,16,38,15.553,38,15z"/><text x="0" y="63" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by AbtoCreative</text><text x="0" y="68" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg> \ No newline at end of file diff --git a/_static/images/icons/registration.svg b/_static/images/icons/registration.svg new file mode 100644 index 00000000..8579166a --- /dev/null +++ b/_static/images/icons/registration.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 62.5" x="0px" y="0px"><g><path d="M47,26a1,1,0,0,0,0-2H45V9.858A3.99156,3.99156,0,1,0,40.142,5H26V3a1,1,0,0,0-2,0V5H9.858A3.99156,3.99156,0,1,0,5,9.858V24H3a1,1,0,0,0,0,2H5V40.142A3.99156,3.99156,0,1,0,9.858,45H24v2a1,1,0,0,0,2,0V45H40.142A3.99156,3.99156,0,1,0,45,40.142V26ZM40.142,43H9.858A3.99375,3.99375,0,0,0,7,40.142V9.858A3.99375,3.99375,0,0,0,9.858,7H40.142A3.99375,3.99375,0,0,0,43,9.858V40.142A3.99375,3.99375,0,0,0,40.142,43ZM44,4a2,2,0,1,1-2,2A2.00233,2.00233,0,0,1,44,4ZM4,6A2,2,0,1,1,6,8,2.00233,2.00233,0,0,1,4,6ZM6,46a2,2,0,1,1,2-2A2.00233,2.00233,0,0,1,6,46Zm40-2a2,2,0,1,1-2-2A2.00233,2.00233,0,0,1,46,44Z"/><path d="M15.8276,13.7813c-.0238.0014-.0457.0092-.0695.0109a.9757.9757,0,0,1,.0603.2986,3.10692,3.10692,0,0,0,1.5463,2.6787A.9998.9998,0,1,1,16.3628,18.5a5.10427,5.10427,0,0,1-2.5281-4.1647,5.07812,5.07812,0,0,0-2.4504,6.3571,5.08332,5.08332,0,0,0,0,8.6152,5.07812,5.07812,0,0,0,2.4504,6.3571A5.10427,5.10427,0,0,1,16.3628,31.5a.9998.9998,0,1,1,1.0019,1.7305,3.10692,3.10692,0,0,0-1.5463,2.6787.97867.97867,0,0,1-.0603.2986c.0238.0017.0457.0095.0695.011A5.0976,5.0976,0,0,0,20.9092,41,5.01018,5.01018,0,0,0,24,39.9266V10.0734A5.01018,5.01018,0,0,0,20.9092,9,5.09761,5.09761,0,0,0,15.8276,13.7813Z"/><path d="M38.6157,20.6924a5.07812,5.07812,0,0,0-2.4504-6.3571A5.10427,5.10427,0,0,1,33.6372,18.5a.9998.9998,0,0,1-1.0019-1.7305,3.10692,3.10692,0,0,0,1.5463-2.6787.9757.9757,0,0,1,.0603-.2986c-.0238-.0017-.0457-.0095-.0695-.0109A5.09761,5.09761,0,0,0,29.0908,9,5.01018,5.01018,0,0,0,26,10.0734V39.9266A5.01018,5.01018,0,0,0,29.0908,41a5.0976,5.0976,0,0,0,5.0816-4.7812c.0238-.0015.0457-.0093.0695-.011a.97867.97867,0,0,1-.0603-.2986,3.10692,3.10692,0,0,0-1.5463-2.6787A.9998.9998,0,0,1,33.6372,31.5a5.10427,5.10427,0,0,1,2.5281,4.1647,5.07812,5.07812,0,0,0,2.4504-6.3571,5.08332,5.08332,0,0,0,0-8.6152Z"/></g><text x="0" y="65" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Zulfa Mahendra</text><text x="0" y="70" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg> \ No newline at end of file diff --git a/_static/images/icons/stat.svg b/_static/images/icons/stat.svg new file mode 100644 index 00000000..b7a23fa8 --- /dev/null +++ b/_static/images/icons/stat.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 40" x="0px" y="0px"><title>Artboard 38Created by Anggara Putrafrom the Noun Project \ No newline at end of file diff --git a/_static/images/icons/tractography.svg b/_static/images/icons/tractography.svg new file mode 100644 index 00000000..2ab1dee5 --- /dev/null +++ b/_static/images/icons/tractography.svg @@ -0,0 +1,5 @@ +Created by Kartika Sholehatinfrom the Noun Project \ No newline at end of file diff --git a/_templates/components/carousel.html b/_templates/components/carousel.html index f9a6e855..76ed15ef 100644 --- a/_templates/components/carousel.html +++ b/_templates/components/carousel.html @@ -1,34 +1,24 @@