-
{{ site.name }}
-
+
+ {% include navbar.html %}
+
+ {{content}}
-
-
{{ content }}
-
+ {% include footer.html %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/_layouts/prompt.html b/_layouts/prompt.html
new file mode 100644
index 0000000..e4258a0
--- /dev/null
+++ b/_layouts/prompt.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
{{ page.title }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ content }}
+
+
+
+
+
diff --git a/_news/2022-lorem.md b/_news/2022-lorem.md
new file mode 100644
index 0000000..6259e3e
--- /dev/null
+++ b/_news/2022-lorem.md
@@ -0,0 +1,4 @@
+---
+title: Lorem ipsum sit amet, consectetur adipiscing elit, sed do eiusmod tempor
+date: 2022-01-12 00:01:00 +0800
+---
\ No newline at end of file
diff --git a/_news/2023-news1.md b/_news/2023-news1.md
new file mode 100644
index 0000000..12b6d8c
--- /dev/null
+++ b/_news/2023-news1.md
@@ -0,0 +1,4 @@
+---
+title: "Scientists Discover New Species of Bioluminescent Fish in Mariana Trench"
+date: 2023-11-28 08:15:00 -0500
+---
\ No newline at end of file
diff --git a/_news/2023-news2.md b/_news/2023-news2.md
new file mode 100644
index 0000000..8545a5f
--- /dev/null
+++ b/_news/2023-news2.md
@@ -0,0 +1,6 @@
+---
+title: >-
+ AI-Powered Robot Chef Wins International Culinary Competition
+
Featured
+date: 2023-09-05 18:30:00 +0200
+---
\ No newline at end of file
diff --git a/_news/2024-news1.md b/_news/2024-news1.md
new file mode 100644
index 0000000..f355630
--- /dev/null
+++ b/_news/2024-news1.md
@@ -0,0 +1,6 @@
+---
+title: >-
+ First Human Settlement Established on Mars, Marking New Era of Space Exploration.
+
Read more
+date: 2024-01-30 10:00:00 -0800
+---
\ No newline at end of file
diff --git a/_news/2024-news2.md b/_news/2024-news2.md
new file mode 100644
index 0000000..1bd2375
--- /dev/null
+++ b/_news/2024-news2.md
@@ -0,0 +1,4 @@
+---
+title: "Virtual Reality Theme Park Opens, Redefining Entertainment Industry"
+date: 2024-03-22 17:30:00 UTC
+---
\ No newline at end of file
diff --git a/_news/2024-news3.md b/_news/2024-news3.md
new file mode 100644
index 0000000..e0ee04d
--- /dev/null
+++ b/_news/2024-news3.md
@@ -0,0 +1,4 @@
+---
+title: "AI Transforms Music Industry:
First AI-Composed Symphony Debuts in New York"
+date: 2024-10-18 20:45:00 -0400
+---
\ No newline at end of file
diff --git a/_posts/2024-01-01-blog-post-1.md b/_posts/2024-01-01-blog-post-1.md
new file mode 100644
index 0000000..8185b8b
--- /dev/null
+++ b/_posts/2024-01-01-blog-post-1.md
@@ -0,0 +1,624 @@
+---
+layout: blog_post
+title: 'This is the title of the blog post'
+date: 2024-01-01
+tags:
+ - Blog
+ - Post
+ - Tag
+---
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem.
+
+# Headers
+
+```
+# h1 Heading 8-)
+## h2 Heading
+### h3 Heading
+#### h4 Heading
+##### h5 Heading
+###### h6 Heading
+
+Alternatively, for H1 and H2, an underline-ish style:
+
+Alt-H1
+======
+
+Alt-H2
+------
+```
+
+# h1 Heading 8-)
+## h2 Heading
+### h3 Heading
+#### h4 Heading
+##### h5 Heading
+###### h6 Heading
+
+Alternatively, for H1 and H2, an underline-ish style:
+
+Alt-H1
+======
+
+Alt-H2
+------
+
+------
+
+# Emphasis
+
+```
+Emphasis, aka italics, with *asterisks* or _underscores_.
+
+Strong emphasis, aka bold, with **asterisks** or __underscores__.
+
+Combined emphasis with **asterisks and _underscores_**.
+
+Strikethrough uses two tildes. ~~Scratch this.~~
+
+**This is bold text**
+
+__This is bold text__
+
+*This is italic text*
+
+_This is italic text_
+
+~~Strikethrough~~
+```
+
+Emphasis, aka italics, with *asterisks* or _underscores_.
+
+Strong emphasis, aka bold, with **asterisks** or __underscores__.
+
+Combined emphasis with **asterisks and _underscores_**.
+
+Strikethrough uses two tildes. ~~Scratch this.~~
+
+**This is bold text**
+
+__This is bold text__
+
+*This is italic text*
+
+_This is italic text_
+
+~~Strikethrough~~
+
+------
+
+# Lists
+
+```
+1. First ordered list item
+2. Another item
+⋅⋅* Unordered sub-list.
+1. Actual numbers don't matter, just that it's a number
+⋅⋅1. Ordered sub-list
+4. And another item.
+
+⋅⋅⋅You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).
+
+⋅⋅⋅To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅
+⋅⋅⋅Note that this line is separate, but within the same paragraph.⋅⋅
+⋅⋅⋅(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)
+
+* Unordered list can use asterisks
+- Or minuses
++ Or pluses
+
+1. Make my changes
+ 1. Fix bug
+ 2. Improve formatting
+ - Make the headings bigger
+2. Push my commits to GitHub
+3. Open a pull request
+ * Describe my changes
+ * Mention all the members of my team
+ * Ask for feedback
+
++ Create a list by starting a line with `+`, `-`, or `*`
++ Sub-lists are made by indenting 2 spaces:
+ - Marker character change forces new list start:
+ * Ac tristique libero volutpat at
+ + Facilisis in pretium nisl aliquet
+ - Nulla volutpat aliquam velit
++ Very easy!
+```
+
+1. First ordered list item
+2. Another item
+⋅⋅* Unordered sub-list.
+1. Actual numbers don't matter, just that it's a number
+⋅⋅1. Ordered sub-list
+4. And another item.
+
+⋅⋅⋅You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).
+
+⋅⋅⋅To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅
+⋅⋅⋅Note that this line is separate, but within the same paragraph.⋅⋅
+⋅⋅⋅(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)
+
+* Unordered list can use asterisks
+- Or minuses
++ Or pluses
+
+1. Make my changes
+ 1. Fix bug
+ 2. Improve formatting
+ - Make the headings bigger
+2. Push my commits to GitHub
+3. Open a pull request
+ * Describe my changes
+ * Mention all the members of my team
+ * Ask for feedback
+
++ Create a list by starting a line with `+`, `-`, or `*`
++ Sub-lists are made by indenting 2 spaces:
+ - Marker character change forces new list start:
+ * Ac tristique libero volutpat at
+ + Facilisis in pretium nisl aliquet
+ - Nulla volutpat aliquam velit
++ Very easy!
+
+------
+
+# Task lists
+
+```
+- [x] Finish my changes
+- [ ] Push my commits to GitHub
+- [ ] Open a pull request
+- [x] @mentions, #refs, [links](), **formatting**, and
tags supported
+- [x] list syntax required (any unordered or ordered list supported)
+- [x] this is a complete item
+- [ ] this is an incomplete item
+```
+
+- [x] Finish my changes
+- [ ] Push my commits to GitHub
+- [ ] Open a pull request
+- [x] @mentions, #refs, [links](), **formatting**, and
tags supported
+- [x] list syntax required (any unordered or ordered list supported)
+- [ ] this is a complete item
+- [ ] this is an incomplete item
+
+------
+
+# Ignoring Markdown formatting
+
+You can tell GitHub to ignore (or escape) Markdown formatting by using \ before the Markdown character.
+
+```
+Let's rename \*our-new-project\* to \*our-old-project\*.
+```
+
+Let's rename \*our-new-project\* to \*our-old-project\*.
+
+------
+
+# Links
+
+```
+[I'm an inline-style link](https://www.google.com)
+
+[I'm an inline-style link with title](https://www.google.com "Google's Homepage")
+
+[I'm a reference-style link][Arbitrary case-insensitive reference text]
+
+[I'm a relative reference to a repository file](../blob/master/LICENSE)
+
+[You can use numbers for reference-style link definitions][1]
+
+Or leave it empty and use the [link text itself].
+
+URLs and URLs in angle brackets will automatically get turned into links.
+http://www.example.com or
and sometimes
+example.com (but not on Github, for example).
+
+Some text to show that the reference links can follow later.
+
+[arbitrary case-insensitive reference text]: https://www.mozilla.org
+[1]: http://slashdot.org
+[link text itself]: http://www.reddit.com
+```
+
+[I'm an inline-style link](https://www.google.com)
+
+[I'm an inline-style link with title](https://www.google.com "Google's Homepage")
+
+[I'm a reference-style link][Arbitrary case-insensitive reference text]
+
+[I'm a relative reference to a repository file](../blob/master/LICENSE)
+
+[You can use numbers for reference-style link definitions][1]
+
+Or leave it empty and use the [link text itself].
+
+URLs and URLs in angle brackets will automatically get turned into links.
+http://www.example.com or and sometimes
+example.com (but not on Github, for example).
+
+Some text to show that the reference links can follow later.
+
+[arbitrary case-insensitive reference text]: https://www.mozilla.org
+[1]: http://slashdot.org
+[link text itself]: http://www.reddit.com
+
+------
+
+# Images
+
+```
+Here's our logo (hover to see the title text):
+
+Inline-style:
+
+
+Reference-style:
+![alt text][logo]
+
+[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"
+
+
+
+
+Like links, Images also have a footnote style syntax
+
+![Alt text][id]
+
+With a reference later in the document defining the URL location:
+
+[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat"
+```
+
+Here's our logo (hover to see the title text):
+
+Inline-style:
+
+
+Reference-style:
+![alt text][logo]
+
+[logo]: {{ '/assets/images/etc/tim_the_beaver.png' | relative_url }} "Logo Title Text 2"
+
+
+
+Like links, Images also have a footnote style syntax
+
+![Alt text][id]
+
+With a reference later in the document defining the URL location:
+
+[id]: {{ '/assets/images/etc/cat2.jpg' | relative_url }} "Cat 2"
+
+------
+
+# [Footnotes](https://github.com/markdown-it/markdown-it-footnote)
+
+```
+Footnote 1 link[^first].
+
+Footnote 2 link[^second].
+
+Inline footnote^[Text of inline footnote] definition.
+
+Duplicated footnote reference[^second].
+
+[^first]: Footnote **can have markup**
+
+ and multiple paragraphs.
+
+[^second]: Footnote text.
+```
+
+Footnote 1 link[^first].
+
+Footnote 2 link[^second].
+
+Inline footnote^[Text of inline footnote] definition.
+
+Duplicated footnote reference[^second].
+
+[^first]: Footnote **can have markup**
+
+ and multiple paragraphs.
+
+[^second]: Footnote text.
+
+------
+
+# Code and Syntax Highlighting
+
+```
+Inline `code` has `back-ticks around` it.
+```
+
+Inline `code` has `back-ticks around` it.
+
+```c#
+using System.IO.Compression;
+
+#pragma warning disable 414, 3021
+
+namespace MyApplication
+{
+ [Obsolete("...")]
+ class Program : IInterface
+ {
+ public static List JustDoIt(int count)
+ {
+ Console.WriteLine($"Hello {Name}!");
+ return new List(new int[] { 1, 2, 3 })
+ }
+ }
+}
+```
+
+```css
+@font-face {
+ font-family: Chunkfive; src: url('Chunkfive.otf');
+}
+
+body, .usertext {
+ color: #F0F0F0; background: #600;
+ font-family: Chunkfive, sans;
+}
+
+@import url(print.css);
+@media print {
+ a[href^=http]::after {
+ content: attr(href)
+ }
+}
+```
+
+```javascript
+function $initHighlight(block, cls) {
+ try {
+ if (cls.search(/\bno\-highlight\b/) != -1)
+ return process(block, true, 0x0F) +
+ ` class="${cls}"`;
+ } catch (e) {
+ /* handle exception */
+ }
+ for (var i = 0 / 2; i < classes.length; i++) {
+ if (checkCondition(classes[i]) === undefined)
+ console.log('undefined');
+ }
+}
+
+export $initHighlight;
+```
+
+```php
+require_once 'Zend/Uri/Http.php';
+
+namespace Location\Web;
+
+interface Factory
+{
+ static function _factory();
+}
+
+abstract class URI extends BaseURI implements Factory
+{
+ abstract function test();
+
+ public static $st1 = 1;
+ const ME = "Yo";
+ var $list = NULL;
+ private $var;
+
+ /**
+ * Returns a URI
+ *
+ * @return URI
+ */
+ static public function _factory($stats = array(), $uri = 'http')
+ {
+ echo __METHOD__;
+ $uri = explode(':', $uri, 0b10);
+ $schemeSpecific = isset($uri[1]) ? $uri[1] : '';
+ $desc = 'Multi
+line description';
+
+ // Security check
+ if (!ctype_alnum($scheme)) {
+ throw new Zend_Uri_Exception('Illegal scheme');
+ }
+
+ $this->var = 0 - self::$st;
+ $this->list = list(Array("1"=> 2, 2=>self::ME, 3 => \Location\Web\URI::class));
+
+ return [
+ 'uri' => $uri,
+ 'value' => null,
+ ];
+ }
+}
+
+echo URI::ME . URI::$st1;
+
+__halt_compiler () ; datahere
+datahere
+datahere */
+datahere
+```
+
+------
+
+# Tables
+
+```
+Colons can be used to align columns.
+
+| Tables | Are | Cool |
+| ------------- |:-------------:| -----:|
+| col 3 is | right-aligned | $1600 |
+| col 2 is | centered | $12 |
+| zebra stripes | are neat | $1 |
+
+There must be at least 3 dashes separating each header cell.
+The outer pipes (|) are optional, and you don't need to make the
+raw Markdown line up prettily. You can also use inline Markdown.
+
+Markdown | Less | Pretty
+--- | --- | ---
+*Still* | `renders` | **nicely**
+1 | 2 | 3
+
+| First Header | Second Header |
+| ------------- | ------------- |
+| Content Cell | Content Cell |
+| Content Cell | Content Cell |
+
+| Command | Description |
+| --- | --- |
+| git status | List all new or modified files |
+| git diff | Show file differences that haven't been staged |
+
+| Command | Description |
+| --- | --- |
+| `git status` | List all *new or modified* files |
+| `git diff` | Show file differences that **haven't been** staged |
+
+| Left-aligned | Center-aligned | Right-aligned |
+| :--- | :---: | ---: |
+| git status | git status | git status |
+| git diff | git diff | git diff |
+
+| Name | Character |
+| --- | --- |
+| Backtick | ` |
+| Pipe | \| |
+```
+
+Colons can be used to align columns.
+
+| Tables | Are | Cool |
+| ------------- |:-------------:| -----:|
+| col 3 is | right-aligned | $1600 |
+| col 2 is | centered | $12 |
+| zebra stripes | are neat | $1 |
+
+There must be at least 3 dashes separating each header cell.
+The outer pipes (|) are optional, and you don't need to make the
+raw Markdown line up prettily. You can also use inline Markdown.
+
+Markdown | Less | Pretty
+--- | --- | ---
+*Still* | `renders` | **nicely**
+1 | 2 | 3
+
+| First Header | Second Header |
+| ------------- | ------------- |
+| Content Cell | Content Cell |
+| Content Cell | Content Cell |
+
+| Command | Description |
+| --- | --- |
+| git status | List all new or modified files |
+| git diff | Show file differences that haven't been staged |
+
+| Command | Description |
+| --- | --- |
+| `git status` | List all *new or modified* files |
+| `git diff` | Show file differences that **haven't been** staged |
+
+| Left-aligned | Center-aligned | Right-aligned |
+| :--- | :---: | ---: |
+| git status | git status | git status |
+| git diff | git diff | git diff |
+
+| Name | Character |
+| --- | --- |
+| Backtick | ` |
+| Pipe | \| |
+
+------
+
+# Blockquotes
+
+```
+> Blockquotes are very handy in email to emulate reply text.
+> This line is part of the same quote.
+
+Quote break.
+
+> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote.
+
+> Blockquotes can also be nested...
+>> ...by using additional greater-than signs right next to each other...
+> > > ...or with spaces between arrows.
+```
+
+> Blockquotes are very handy in email to emulate reply text.
+> This line is part of the same quote.
+
+Quote break.
+
+> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote.
+
+> Blockquotes can also be nested...
+>> ...by using additional greater-than signs right next to each other...
+> > > ...or with spaces between arrows.
+
+------
+
+# Inline HTML
+
+```
+
+ Definition list
+ Is something people use sometimes.
+
+ Markdown in HTML
+ Does *not* work **very** well. Use HTML tags .
+
+```
+
+
+ Definition list
+ Is something people use sometimes.
+
+ Markdown in HTML
+ Does *not* work **very** well. Use HTML tags .
+
+
+------
+
+# Horizontal Rules
+
+```
+Three or more...
+
+---
+
+Hyphens
+
+***
+
+Asterisks
+
+___
+
+Underscores
+```
+
+Three or more...
+
+---
+
+Hyphens
+
+***
+
+Asterisks
+
+___
+
+Underscores
+
+------
diff --git a/_posts/2025-01-01-blog-post-2.md b/_posts/2025-01-01-blog-post-2.md
new file mode 100644
index 0000000..96f3215
--- /dev/null
+++ b/_posts/2025-01-01-blog-post-2.md
@@ -0,0 +1,624 @@
+---
+layout: blog_post
+title: 'This is the title of the blog post'
+date: 2025-01-01
+tags:
+ - Blog
+ - Post
+ - Tag
+---
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem.
+
+# Headers
+
+```
+# h1 Heading 8-)
+## h2 Heading
+### h3 Heading
+#### h4 Heading
+##### h5 Heading
+###### h6 Heading
+
+Alternatively, for H1 and H2, an underline-ish style:
+
+Alt-H1
+======
+
+Alt-H2
+------
+```
+
+# h1 Heading 8-)
+## h2 Heading
+### h3 Heading
+#### h4 Heading
+##### h5 Heading
+###### h6 Heading
+
+Alternatively, for H1 and H2, an underline-ish style:
+
+Alt-H1
+======
+
+Alt-H2
+------
+
+------
+
+# Emphasis
+
+```
+Emphasis, aka italics, with *asterisks* or _underscores_.
+
+Strong emphasis, aka bold, with **asterisks** or __underscores__.
+
+Combined emphasis with **asterisks and _underscores_**.
+
+Strikethrough uses two tildes. ~~Scratch this.~~
+
+**This is bold text**
+
+__This is bold text__
+
+*This is italic text*
+
+_This is italic text_
+
+~~Strikethrough~~
+```
+
+Emphasis, aka italics, with *asterisks* or _underscores_.
+
+Strong emphasis, aka bold, with **asterisks** or __underscores__.
+
+Combined emphasis with **asterisks and _underscores_**.
+
+Strikethrough uses two tildes. ~~Scratch this.~~
+
+**This is bold text**
+
+__This is bold text__
+
+*This is italic text*
+
+_This is italic text_
+
+~~Strikethrough~~
+
+------
+
+# Lists
+
+```
+1. First ordered list item
+2. Another item
+⋅⋅* Unordered sub-list.
+1. Actual numbers don't matter, just that it's a number
+⋅⋅1. Ordered sub-list
+4. And another item.
+
+⋅⋅⋅You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).
+
+⋅⋅⋅To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅
+⋅⋅⋅Note that this line is separate, but within the same paragraph.⋅⋅
+⋅⋅⋅(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)
+
+* Unordered list can use asterisks
+- Or minuses
++ Or pluses
+
+1. Make my changes
+ 1. Fix bug
+ 2. Improve formatting
+ - Make the headings bigger
+2. Push my commits to GitHub
+3. Open a pull request
+ * Describe my changes
+ * Mention all the members of my team
+ * Ask for feedback
+
++ Create a list by starting a line with `+`, `-`, or `*`
++ Sub-lists are made by indenting 2 spaces:
+ - Marker character change forces new list start:
+ * Ac tristique libero volutpat at
+ + Facilisis in pretium nisl aliquet
+ - Nulla volutpat aliquam velit
++ Very easy!
+```
+
+1. First ordered list item
+2. Another item
+⋅⋅* Unordered sub-list.
+1. Actual numbers don't matter, just that it's a number
+⋅⋅1. Ordered sub-list
+4. And another item.
+
+⋅⋅⋅You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).
+
+⋅⋅⋅To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅
+⋅⋅⋅Note that this line is separate, but within the same paragraph.⋅⋅
+⋅⋅⋅(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)
+
+* Unordered list can use asterisks
+- Or minuses
++ Or pluses
+
+1. Make my changes
+ 1. Fix bug
+ 2. Improve formatting
+ - Make the headings bigger
+2. Push my commits to GitHub
+3. Open a pull request
+ * Describe my changes
+ * Mention all the members of my team
+ * Ask for feedback
+
++ Create a list by starting a line with `+`, `-`, or `*`
++ Sub-lists are made by indenting 2 spaces:
+ - Marker character change forces new list start:
+ * Ac tristique libero volutpat at
+ + Facilisis in pretium nisl aliquet
+ - Nulla volutpat aliquam velit
++ Very easy!
+
+------
+
+# Task lists
+
+```
+- [x] Finish my changes
+- [ ] Push my commits to GitHub
+- [ ] Open a pull request
+- [x] @mentions, #refs, [links](), **formatting**, and tags supported
+- [x] list syntax required (any unordered or ordered list supported)
+- [x] this is a complete item
+- [ ] this is an incomplete item
+```
+
+- [x] Finish my changes
+- [ ] Push my commits to GitHub
+- [ ] Open a pull request
+- [x] @mentions, #refs, [links](), **formatting**, and tags supported
+- [x] list syntax required (any unordered or ordered list supported)
+- [ ] this is a complete item
+- [ ] this is an incomplete item
+
+------
+
+# Ignoring Markdown formatting
+
+You can tell GitHub to ignore (or escape) Markdown formatting by using \ before the Markdown character.
+
+```
+Let's rename \*our-new-project\* to \*our-old-project\*.
+```
+
+Let's rename \*our-new-project\* to \*our-old-project\*.
+
+------
+
+# Links
+
+```
+[I'm an inline-style link](https://www.google.com)
+
+[I'm an inline-style link with title](https://www.google.com "Google's Homepage")
+
+[I'm a reference-style link][Arbitrary case-insensitive reference text]
+
+[I'm a relative reference to a repository file](../blob/master/LICENSE)
+
+[You can use numbers for reference-style link definitions][1]
+
+Or leave it empty and use the [link text itself].
+
+URLs and URLs in angle brackets will automatically get turned into links.
+http://www.example.com or and sometimes
+example.com (but not on Github, for example).
+
+Some text to show that the reference links can follow later.
+
+[arbitrary case-insensitive reference text]: https://www.mozilla.org
+[1]: http://slashdot.org
+[link text itself]: http://www.reddit.com
+```
+
+[I'm an inline-style link](https://www.google.com)
+
+[I'm an inline-style link with title](https://www.google.com "Google's Homepage")
+
+[I'm a reference-style link][Arbitrary case-insensitive reference text]
+
+[I'm a relative reference to a repository file](../blob/master/LICENSE)
+
+[You can use numbers for reference-style link definitions][1]
+
+Or leave it empty and use the [link text itself].
+
+URLs and URLs in angle brackets will automatically get turned into links.
+http://www.example.com or and sometimes
+example.com (but not on Github, for example).
+
+Some text to show that the reference links can follow later.
+
+[arbitrary case-insensitive reference text]: https://www.mozilla.org
+[1]: http://slashdot.org
+[link text itself]: http://www.reddit.com
+
+------
+
+# Images
+
+```
+Here's our logo (hover to see the title text):
+
+Inline-style:
+
+
+Reference-style:
+![alt text][logo]
+
+[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"
+
+
+
+
+Like links, Images also have a footnote style syntax
+
+![Alt text][id]
+
+With a reference later in the document defining the URL location:
+
+[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat"
+```
+
+Here's our logo (hover to see the title text):
+
+Inline-style:
+
+
+Reference-style:
+![alt text][logo]
+
+[logo]: {{ '/assets/images/etc/tim_the_beaver.png' | relative_url }} "Logo Title Text 2"
+
+
+
+Like links, Images also have a footnote style syntax
+
+![Alt text][id]
+
+With a reference later in the document defining the URL location:
+
+[id]: {{ '/assets/images/etc/cat2.jpg' | relative_url }} "Cat 2"
+
+------
+
+# [Footnotes](https://github.com/markdown-it/markdown-it-footnote)
+
+```
+Footnote 1 link[^first].
+
+Footnote 2 link[^second].
+
+Inline footnote^[Text of inline footnote] definition.
+
+Duplicated footnote reference[^second].
+
+[^first]: Footnote **can have markup**
+
+ and multiple paragraphs.
+
+[^second]: Footnote text.
+```
+
+Footnote 1 link[^first].
+
+Footnote 2 link[^second].
+
+Inline footnote^[Text of inline footnote] definition.
+
+Duplicated footnote reference[^second].
+
+[^first]: Footnote **can have markup**
+
+ and multiple paragraphs.
+
+[^second]: Footnote text.
+
+------
+
+# Code and Syntax Highlighting
+
+```
+Inline `code` has `back-ticks around` it.
+```
+
+Inline `code` has `back-ticks around` it.
+
+```c#
+using System.IO.Compression;
+
+#pragma warning disable 414, 3021
+
+namespace MyApplication
+{
+ [Obsolete("...")]
+ class Program : IInterface
+ {
+ public static List JustDoIt(int count)
+ {
+ Console.WriteLine($"Hello {Name}!");
+ return new List(new int[] { 1, 2, 3 })
+ }
+ }
+}
+```
+
+```css
+@font-face {
+ font-family: Chunkfive; src: url('Chunkfive.otf');
+}
+
+body, .usertext {
+ color: #F0F0F0; background: #600;
+ font-family: Chunkfive, sans;
+}
+
+@import url(print.css);
+@media print {
+ a[href^=http]::after {
+ content: attr(href)
+ }
+}
+```
+
+```javascript
+function $initHighlight(block, cls) {
+ try {
+ if (cls.search(/\bno\-highlight\b/) != -1)
+ return process(block, true, 0x0F) +
+ ` class="${cls}"`;
+ } catch (e) {
+ /* handle exception */
+ }
+ for (var i = 0 / 2; i < classes.length; i++) {
+ if (checkCondition(classes[i]) === undefined)
+ console.log('undefined');
+ }
+}
+
+export $initHighlight;
+```
+
+```php
+require_once 'Zend/Uri/Http.php';
+
+namespace Location\Web;
+
+interface Factory
+{
+ static function _factory();
+}
+
+abstract class URI extends BaseURI implements Factory
+{
+ abstract function test();
+
+ public static $st1 = 1;
+ const ME = "Yo";
+ var $list = NULL;
+ private $var;
+
+ /**
+ * Returns a URI
+ *
+ * @return URI
+ */
+ static public function _factory($stats = array(), $uri = 'http')
+ {
+ echo __METHOD__;
+ $uri = explode(':', $uri, 0b10);
+ $schemeSpecific = isset($uri[1]) ? $uri[1] : '';
+ $desc = 'Multi
+line description';
+
+ // Security check
+ if (!ctype_alnum($scheme)) {
+ throw new Zend_Uri_Exception('Illegal scheme');
+ }
+
+ $this->var = 0 - self::$st;
+ $this->list = list(Array("1"=> 2, 2=>self::ME, 3 => \Location\Web\URI::class));
+
+ return [
+ 'uri' => $uri,
+ 'value' => null,
+ ];
+ }
+}
+
+echo URI::ME . URI::$st1;
+
+__halt_compiler () ; datahere
+datahere
+datahere */
+datahere
+```
+
+------
+
+# Tables
+
+```
+Colons can be used to align columns.
+
+| Tables | Are | Cool |
+| ------------- |:-------------:| -----:|
+| col 3 is | right-aligned | $1600 |
+| col 2 is | centered | $12 |
+| zebra stripes | are neat | $1 |
+
+There must be at least 3 dashes separating each header cell.
+The outer pipes (|) are optional, and you don't need to make the
+raw Markdown line up prettily. You can also use inline Markdown.
+
+Markdown | Less | Pretty
+--- | --- | ---
+*Still* | `renders` | **nicely**
+1 | 2 | 3
+
+| First Header | Second Header |
+| ------------- | ------------- |
+| Content Cell | Content Cell |
+| Content Cell | Content Cell |
+
+| Command | Description |
+| --- | --- |
+| git status | List all new or modified files |
+| git diff | Show file differences that haven't been staged |
+
+| Command | Description |
+| --- | --- |
+| `git status` | List all *new or modified* files |
+| `git diff` | Show file differences that **haven't been** staged |
+
+| Left-aligned | Center-aligned | Right-aligned |
+| :--- | :---: | ---: |
+| git status | git status | git status |
+| git diff | git diff | git diff |
+
+| Name | Character |
+| --- | --- |
+| Backtick | ` |
+| Pipe | \| |
+```
+
+Colons can be used to align columns.
+
+| Tables | Are | Cool |
+| ------------- |:-------------:| -----:|
+| col 3 is | right-aligned | $1600 |
+| col 2 is | centered | $12 |
+| zebra stripes | are neat | $1 |
+
+There must be at least 3 dashes separating each header cell.
+The outer pipes (|) are optional, and you don't need to make the
+raw Markdown line up prettily. You can also use inline Markdown.
+
+Markdown | Less | Pretty
+--- | --- | ---
+*Still* | `renders` | **nicely**
+1 | 2 | 3
+
+| First Header | Second Header |
+| ------------- | ------------- |
+| Content Cell | Content Cell |
+| Content Cell | Content Cell |
+
+| Command | Description |
+| --- | --- |
+| git status | List all new or modified files |
+| git diff | Show file differences that haven't been staged |
+
+| Command | Description |
+| --- | --- |
+| `git status` | List all *new or modified* files |
+| `git diff` | Show file differences that **haven't been** staged |
+
+| Left-aligned | Center-aligned | Right-aligned |
+| :--- | :---: | ---: |
+| git status | git status | git status |
+| git diff | git diff | git diff |
+
+| Name | Character |
+| --- | --- |
+| Backtick | ` |
+| Pipe | \| |
+
+------
+
+# Blockquotes
+
+```
+> Blockquotes are very handy in email to emulate reply text.
+> This line is part of the same quote.
+
+Quote break.
+
+> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote.
+
+> Blockquotes can also be nested...
+>> ...by using additional greater-than signs right next to each other...
+> > > ...or with spaces between arrows.
+```
+
+> Blockquotes are very handy in email to emulate reply text.
+> This line is part of the same quote.
+
+Quote break.
+
+> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote.
+
+> Blockquotes can also be nested...
+>> ...by using additional greater-than signs right next to each other...
+> > > ...or with spaces between arrows.
+
+------
+
+# Inline HTML
+
+```
+
+ Definition list
+ Is something people use sometimes.
+
+ Markdown in HTML
+ Does *not* work **very** well. Use HTML tags .
+
+```
+
+
+ Definition list
+ Is something people use sometimes.
+
+ Markdown in HTML
+ Does *not* work **very** well. Use HTML tags .
+
+
+------
+
+# Horizontal Rules
+
+```
+Three or more...
+
+---
+
+Hyphens
+
+***
+
+Asterisks
+
+___
+
+Underscores
+```
+
+Three or more...
+
+---
+
+Hyphens
+
+***
+
+Asterisks
+
+___
+
+Underscores
+
+------
diff --git a/_posts/2026-03-17-acknowledgement.md b/_posts/2026-03-17-acknowledgement.md
new file mode 100644
index 0000000..20cb1fc
--- /dev/null
+++ b/_posts/2026-03-17-acknowledgement.md
@@ -0,0 +1,16 @@
+---
+layout: blog_post
+title: 'Acknowledgement'
+date: 2026-03-17
+tags:
+ - Blog
+ - Post
+ - Tag
+---
+
+
+Thanks to [Yuqing Xie](https://yqxie99.github.io/) and [Kun Chen](https://kwen-chen.github.io/) for the contributions of the blog feature!
+
+## Section 1
+
+
diff --git a/_publications/2023/2023-pub-example-1.md b/_publications/2023/2023-pub-example-1.md
new file mode 100644
index 0000000..7010923
--- /dev/null
+++ b/_publications/2023/2023-pub-example-1.md
@@ -0,0 +1,17 @@
+---
+title: "Lorem ipsum: Dolor sit amet, consectetur adipiscing elit"
+date: 2023-01-05 00:01:00 +0800
+selected: true
+pub: "Nature Communications"
+pub_date: "2023"
+abstract: >-
+ Cover image is a photo by Thomas Renaud on Unsplash. The abstract of the publication is meant to be a TLDR (very brief summary with 1~2 sentences) of your paper.
+cover: /assets/images/covers/cover1.jpg
+authors:
+- Your Name*
+- Robert White*
+- John Doe
+- Charles Green (Stanford)
+links:
+ Paper: https://www.cell.com
+---
\ No newline at end of file
diff --git a/_publications/2023/2023-pub-example-2.md b/_publications/2023/2023-pub-example-2.md
new file mode 100644
index 0000000..c2a374d
--- /dev/null
+++ b/_publications/2023/2023-pub-example-2.md
@@ -0,0 +1,24 @@
+---
+title: "Pharetra Massa Massa Ultricies Mi Nisl Tincidunt"
+date: 2023-01-21 00:01:00 +0800
+selected: false
+pub: "International Conference on Learning Representations (ICLR)"
+pub_date: "2023"
+semantic_scholar_id: 11ac0b5634a282f1a0da204b98e7473d8b480dfb # use this to retrieve citation count
+abstract: >-
+ Photo by Dessy Dimcheva on Unsplash. Please keep the description of your publication as brief as possible. 1~2 sentences is ideal. Otherwise, it will look too noisy. This is a counterexample to show how the publication will look like when the abstract is too long.
+ The tangerine is a type of citrus fruit that is orange in color, that is considered either a variety of Citrus reticulata, the mandarin orange, or a closely related species, under the name Citrus tangerina, or yet as a hybrid (Citrus × tangerina) of mandarin orange varieties, with some pomelo contribution.
+ According to the Oxford English Dictionary (OED), the word "tangerine" was originally an adjective meaning "Of or pertaining to, or native of Tangier, a seaport in Morocco, on the Strait of Gibraltar" and "a native of Tangier." The name was first used for fruit coming from Tangier, Morocco, described as a mandarin variety. The OED cites this usage from Addison's The Tatler in 1710 with similar uses from the 1800s. The adjective was applied to the fruit, once known scientifically as "Citrus nobilis var. tangeriana" which grew in the region of Tangiers. This usage appears in the 1800s.
+
+cover: /assets/images/covers/cover2.jpg
+authors:
+ - Charles Green (MIT)*
+ - John Doe*
+ - Robert White
+ - James Wang
+ - Your Name#
+links:
+ Paper: https://www.biorxiv.org
+ Code: https://github.com
+ Unsplash: https://unsplash.com/photos/orange-fruit-on-white-table-cloth-ISX_imp8t1o
+---
\ No newline at end of file
diff --git a/_publications/2023/2023-pub-example-no-cover.md b/_publications/2023/2023-pub-example-no-cover.md
new file mode 100644
index 0000000..0732dcd
--- /dev/null
+++ b/_publications/2023/2023-pub-example-no-cover.md
@@ -0,0 +1,22 @@
+---
+title: "Publication without cover image"
+date: 2023-01-1 00:01:00 +0800
+selected: false
+pub: "International Conference on Learning Representations (ICLR)"
+# pub_pre: "Submitted to "
+# pub_post: 'Under review.'
+# pub_last: ' Spotlight '
+pub_date: "2023"
+
+abstract: >-
+ When the cover image is not provided, it will generate a random colorful bubble images as the cover image using the bubble_visual_hash.js script.
+# cover: /assets/images/covers/cover3.jpg
+authors:
+ - Your Name*#
+ - James Wang*
+ - Some Other Name
+ - John Doe
+links:
+ Code: https://github.com/luost26/bubble-visual-hash
+ Demo: https://luost26.github.io/bubble-visual-hash
+---
diff --git a/_publications/2024/2024-pub-example-3.md b/_publications/2024/2024-pub-example-3.md
new file mode 100644
index 0000000..96a3299
--- /dev/null
+++ b/_publications/2024/2024-pub-example-3.md
@@ -0,0 +1,22 @@
+---
+title: "Convallis a cras semper auctor neque vitae rutrum quisque non tellus orci ac"
+date: 2024-05-12 00:01:00 +0800
+selected: true
+pub: "International Conference on Machine Learning (ICML)"
+# pub_pre: "Submitted to "
+# pub_post: 'Under review.'
+pub_last: ' Spotlight '
+pub_date: "2024"
+semantic_scholar_id: 204e3073870fae3d05bcbc2f6a8e263d9b72e776 # use this to retrieve citation count
+abstract: >-
+ Photo by Pineapple Supply Co. on Unsplash. Please put a tldr (too-long-didnt-read, 1~2 sentences) of your publication here. It is not recommended to put the actual abstract here because it is usually too long to fit in. $\LaTeX$ is supported. $a=b+c$.
+cover: /assets/images/covers/cover3.jpg
+authors:
+ - Your Name
+ - James Wang
+ - Some Other Name
+ - John Doe
+links:
+ Code: https://github.com/luost26/academic-homepage
+ Unsplash: https://unsplash.com/photos/sliced-in-half-pineapple--_PLJZmHZzk
+---
diff --git a/_showcase/cats/cat.md b/_showcase/cats/cat.md
new file mode 100644
index 0000000..13c2463
--- /dev/null
+++ b/_showcase/cats/cat.md
@@ -0,0 +1,9 @@
+---
+show: true
+width: 3
+date: 2020-01-12 00:01:00 +0800
+group: Cats
+---
+
+
+
\ No newline at end of file
diff --git a/_showcase/cats/cat2.md b/_showcase/cats/cat2.md
new file mode 100644
index 0000000..4f2d16d
--- /dev/null
+++ b/_showcase/cats/cat2.md
@@ -0,0 +1,9 @@
+---
+show: true
+width: 3
+date: 2020-01-12 00:01:00 +0800
+group: Cats
+---
+
+
+
diff --git a/_showcase/cats/cat3.md b/_showcase/cats/cat3.md
new file mode 100644
index 0000000..d7b278d
--- /dev/null
+++ b/_showcase/cats/cat3.md
@@ -0,0 +1,11 @@
+---
+show: true
+width: 3
+date: 2020-01-12 00:01:00 +0800
+group: Cats
+---
+
diff --git a/_showcase/cats/cat4.md b/_showcase/cats/cat4.md
new file mode 100644
index 0000000..b91c82e
--- /dev/null
+++ b/_showcase/cats/cat4.md
@@ -0,0 +1,14 @@
+---
+show: true
+width: 3
+date: 2020-01-10 00:01:00 +0800
+group: Cats
+---
+
+
+
+
+ Meow! I am a cat. Unsplash
+
+
+
diff --git a/_showcase/cats/cat_lazyload.md b/_showcase/cats/cat_lazyload.md
new file mode 100644
index 0000000..2135fa2
--- /dev/null
+++ b/_showcase/cats/cat_lazyload.md
@@ -0,0 +1,10 @@
+---
+show: true
+width: 3
+date: 2019-01-12 00:01:00 +0800
+group: Cats
+---
+
+
+
+
diff --git a/_showcase/default/badge1.md b/_showcase/default/badge1.md
new file mode 100644
index 0000000..b285211
--- /dev/null
+++ b/_showcase/default/badge1.md
@@ -0,0 +1,9 @@
+---
+show: true
+width: 1
+date: 2017-01-13 00:01:00 +0800
+class: "" # Override the default card style
+---
+
+
+
\ No newline at end of file
diff --git a/_showcase/default/badge2.md b/_showcase/default/badge2.md
new file mode 100644
index 0000000..4c5836a
--- /dev/null
+++ b/_showcase/default/badge2.md
@@ -0,0 +1,9 @@
+---
+show: true
+width: 1
+date: 2017-01-12 00:01:00 +0800
+class: "" # Override the default card style
+---
+
+
+
\ No newline at end of file
diff --git a/_showcase/default/badge3.md b/_showcase/default/badge3.md
new file mode 100644
index 0000000..3672e61
--- /dev/null
+++ b/_showcase/default/badge3.md
@@ -0,0 +1,9 @@
+---
+show: true
+width: 1
+date: 2017-01-11 00:01:00 +0800
+class: "" # Override the default card style
+---
+
+
+
\ No newline at end of file
diff --git a/_showcase/default/education.md b/_showcase/default/education.md
new file mode 100644
index 0000000..d10aad2
--- /dev/null
+++ b/_showcase/default/education.md
@@ -0,0 +1,23 @@
+---
+show: false
+width: 6
+date: 2020-01-12 00:01:00 +0800
+---
+
+
Education
+
+ {% for item in site.data.profile.education %}
+
+
+
+
{{ item.name }}
+
{{ item.dept }}
+
+
{{ item.position }}
+
{{ item.date }}
+
+
+
+ {% endfor %}
+
+
diff --git a/_showcase/default/formula.md b/_showcase/default/formula.md
new file mode 100644
index 0000000..198a9f7
--- /dev/null
+++ b/_showcase/default/formula.md
@@ -0,0 +1,8 @@
+---
+show: true
+width: 4
+date: 2017-01-14 00:01:00 +0800
+---
+
+$a^2 + b^2 = c^2$
+
\ No newline at end of file
diff --git a/_showcase/default/how_to_disable.md b/_showcase/default/how_to_disable.md
new file mode 100644
index 0000000..d2758a5
--- /dev/null
+++ b/_showcase/default/how_to_disable.md
@@ -0,0 +1,13 @@
+---
+show: true
+width: 4
+date: 2020-01-12 00:01:00 +0800
+---
+
+
+
Disable Showcase Page?
+
+
+ If you want to disable this showcase page, you can hide it from the navigation bar by removing the showcase in data/navigation.yml
+
+
\ No newline at end of file
diff --git a/_showcase/default/image_text_1.md b/_showcase/default/image_text_1.md
new file mode 100644
index 0000000..12c76a8
--- /dev/null
+++ b/_showcase/default/image_text_1.md
@@ -0,0 +1,21 @@
+---
+show: true
+width: 4
+date: 2020-01-12 00:01:00 +0800
+---
+
+
+
+
+
Image Lazyload
+
+ It is highly recommended to use lazyload for images to improve page loading speed, especially for pages with many images.
+ Example code snippet:
+
+
+ {% raw %}
+ <img data-src="[Image URL]" class="lazy w-100 rounded-xl" src="{{ '/assets/images/empty_300x200.png' | relative_url }}">
+ {% endraw %}
+
+
+
diff --git a/_showcase/default/image_text_2.md b/_showcase/default/image_text_2.md
new file mode 100644
index 0000000..e0ae08d
--- /dev/null
+++ b/_showcase/default/image_text_2.md
@@ -0,0 +1,15 @@
+---
+show: true
+width: 4
+date: 2020-01-12 00:01:00 +0800
+---
+
+
+
+
GitHub Star History
+
+ This image shows the star history of the GitHub repository of this website.
+
+
Give a star!
+
+
diff --git a/_showcase/default/photo_collection.md b/_showcase/default/photo_collection.md
new file mode 100644
index 0000000..fc74b1d
--- /dev/null
+++ b/_showcase/default/photo_collection.md
@@ -0,0 +1,17 @@
+---
+show: true
+width: 4
+date: 2021-09-12 00:01:00 +0800
+height: 295px
+images:
+- src: https://picsum.photos/seed/first1111/800/800
+ title: Photo 1
+ desc: Description 1.
+ link: https://picsum.photos/
+- src: https://picsum.photos/seed/second22/800/800
+ title: Photo 2
+ desc: Description 2
+- src: https://picsum.photos/seed/third33/800/800
+---
+
+{% include widgets/carousel.html id=page.id images=page.images height=page.height %}
diff --git a/_showcase/default/welcome.md b/_showcase/default/welcome.md
new file mode 100644
index 0000000..3e3971d
--- /dev/null
+++ b/_showcase/default/welcome.md
@@ -0,0 +1,23 @@
+---
+show: true
+width: 8
+date: 2024-01-12 00:01:00 +0800
+---
+
+
+
Welcome to Showcase!
+
+
+ Showcase is a page where you can show off almost anything you want. It can be the photo of your pets, your favorite books, your favorite projects, or anything else you want to show to the world.
+
+
+ You can create a new showcase item by creating a new file in the _showcase folder. It gives you the highest flexibility to customize the item using any HTML code.
+
+
+ Cards are ordered by the date field in the front matter in descending order. The width field is used to determine the width of the card, ranging from 1 to 12.
+ Layout is done by the Masonry library.
+
+
+ For a tidy layout, it is recommended to set the width of the cards to be either multiple of 3 or multiple of 4 for all cards, except for small badges that do not take up much space (width=1).
+
+
\ No newline at end of file
diff --git a/assets/css/blog.css b/assets/css/blog.css
new file mode 100644
index 0000000..8d9deff
--- /dev/null
+++ b/assets/css/blog.css
@@ -0,0 +1,266 @@
+.highlighter-rouge {
+ font-size: 0.875rem;
+}
+
+/* Blog content styling */
+.blog-content {
+ line-height: 1.7;
+}
+
+.blog-content h1,
+.blog-content h2,
+.blog-content h3,
+.blog-content h4,
+.blog-content h5,
+.blog-content h6 {
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+ font-weight: 500;
+}
+
+.blog-content h1 {
+ font-size: 2rem;
+ border-bottom: 2px solid #e9ecef;
+ padding-bottom: 0.5rem;
+}
+
+.blog-content h2 {
+ font-size: 1.5rem;
+ border-bottom: 1px solid #e9ecef;
+ padding-bottom: 0.25rem;
+}
+
+.blog-content h3 {
+ font-size: 1.25rem;
+}
+
+.blog-content p {
+ margin-bottom: 1rem;
+}
+
+.blog-content ul,
+.blog-content ol {
+ margin-bottom: 1rem;
+ padding-left: 2rem;
+}
+
+.blog-content li {
+ margin-bottom: 0.5rem;
+}
+
+.blog-content blockquote {
+ border-left: 3px solid #e0e0e0;
+ padding-left: 1rem;
+ margin: 1.5rem 0;
+ font-style: italic;
+ color: #6c757d;
+}
+
+.blog-content img {
+ max-width: 100%;
+ height: auto;
+ border-radius: 0.375rem;
+ margin: 1rem 0;
+}
+
+/* Multi-column image layouts */
+.blog-content .row img {
+ margin: 0.5rem 0;
+ transition: transform 0.2s ease-in-out;
+}
+
+.blog-content .row img:hover {
+ transform: scale(1.02);
+}
+
+/* Image gallery styles */
+.blog-content .img-fluid {
+ width: 100%;
+ height: auto;
+ object-fit: cover;
+}
+
+.blog-content .shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+/* Responsive image containers */
+.blog-content .col-md-6 img,
+.blog-content .col-md-4 img,
+.blog-content .col-lg-3 img {
+ width: 100%;
+ height: 200px;
+ object-fit: cover;
+ border-radius: 0.375rem;
+}
+
+/* Mixed content layouts */
+.blog-content .col-md-8 {
+ padding-right: 1rem;
+}
+
+.blog-content .col-md-4 {
+ padding-left: 1rem;
+}
+
+@media (max-width: 768px) {
+ .blog-content .col-md-8,
+ .blog-content .col-md-4 {
+ padding: 0;
+ margin-bottom: 1rem;
+ }
+
+ .blog-content .col-md-6 img,
+ .blog-content .col-md-4 img {
+ height: 150px;
+ }
+}
+
+.blog-content table {
+ width: 100%;
+ margin-bottom: 1rem;
+ border-collapse: collapse;
+}
+
+.blog-content table th,
+.blog-content table td {
+ padding: 0.75rem;
+ border: 1px solid #dee2e6;
+}
+
+.blog-content table th {
+ background-color: #f8f9fa;
+ font-weight: 600;
+}
+
+/* Math formula styling */
+.katex-display {
+ margin: 1.5rem 0;
+ text-align: center;
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+.katex {
+ font-size: 1.1em;
+}
+
+/* Ensure math formulas are properly displayed */
+.katex-display .katex {
+ display: inline-block;
+ white-space: nowrap;
+}
+
+/* Fix for math formula containers */
+.katex-display {
+ display: block;
+ width: 100%;
+}
+
+/* Ensure proper spacing around math formulas */
+.blog-content .katex-display {
+ margin: 2rem 0;
+ padding: 1rem 0;
+}
+
+/* Inline math styling */
+.katex-inline {
+ display: inline;
+ margin: 0 0.2em;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-weight: 600;
+}
+
+/* Blog layout — content preserves original width, TOC uses remaining space */
+.blog-layout-wrapper {
+ display: flex;
+ justify-content: center;
+ padding: 0 15px;
+ gap: 1.5rem;
+}
+
+.blog-main {
+ flex: 0 1 950px;
+ min-width: 0;
+}
+
+.blog-toc-sidebar {
+ flex: 0 0 auto;
+ width: clamp(160px, 18vw, 360px);
+ display: none;
+}
+
+@media (min-width: 992px) {
+ .blog-toc-sidebar {
+ display: block;
+ }
+}
+
+/* Blog Table of Contents */
+.blog-toc-nav {
+ position: sticky;
+ top: 6rem;
+ max-height: calc(100vh - 8rem);
+ overflow-y: auto;
+ padding-left: 0.75rem;
+ border-left: 2px solid #f0f0f0;
+}
+
+.blog-toc-title {
+ font-size: 0.875rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ color: #aaa;
+ margin-bottom: 0.75rem;
+}
+
+.blog-toc-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.blog-toc-list li {
+ margin-bottom: 0.25rem;
+}
+
+.blog-toc-list a {
+ display: block;
+ font-size: 0.8rem;
+ line-height: 1.4;
+ color: #999;
+ text-decoration: none;
+ padding: 0.15rem 0;
+ transition: color 0.2s ease;
+}
+
+.blog-toc-list a:hover {
+ color: #2d3436;
+ text-decoration: none;
+}
+
+.blog-toc-list a.toc-active {
+ color: #212529;
+ font-weight: 600;
+}
+
+.blog-toc-list .toc-h3 {
+ padding-left: 0.75rem;
+}
+
+.blog-toc-list .toc-h4 {
+ padding-left: 1.5rem;
+}
+
+/* Hide TOC scrollbar */
+.blog-toc-nav::-webkit-scrollbar {
+ width: 0;
+}
+
+.blog-toc-nav {
+ scrollbar-width: none;
+}
diff --git a/assets/css/global.css b/assets/css/global.css
new file mode 100644
index 0000000..0dae9cd
--- /dev/null
+++ b/assets/css/global.css
@@ -0,0 +1,93 @@
+@charset "utf-8";
+body {
+ font-family: "Lato", sans-serif;
+ font-weight: 400;
+ padding-top: 5.0rem;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-weight: 700;
+}
+
+.card {
+ border-radius: 0.8rem!important;
+}
+
+.card-img-overlay {
+ border-radius: 0.8rem!important;
+}
+
+.rounded-xl {
+ border-radius: 0.8rem!important;
+}
+
+.rounded-xl-bottom {
+ border-bottom-right-radius: 0.8rem !important;
+ border-bottom-left-radius: 0.8rem !important;
+}
+
+.rounded-xl-top {
+ border-top-left-radius: 0.8rem !important;
+ border-top-right-radius: 0.8rem !important;
+}
+
+
+.text-profile-position {
+ font-weight: 400;
+}
+
+.text-profile-bio {
+ /* font-family: "Raleway"; */
+ font-weight: 400;
+}
+
+.navbar {
+ background-color: rgba(255, 255, 255, 0.6) !important;
+ backdrop-filter: blur(16px);
+ -webkit-backdrop-filter: blur(16px);
+}
+
+.inline-badge {
+ height: 16px;
+ vertical-align: -10%;
+ margin-right: 2px;
+ line-break: unset;
+}
+
+.no-break {
+ white-space: nowrap;
+}
+
+.cover-image {
+ width: 180px;
+ max-height: 120px;
+}
+
+.abstract-body {
+ min-height: 100px;
+}
+
+img.lazy {
+ background-image: url('images/loading.gif');
+ background-repeat: no-repeat;
+ background-position: 50% 50%;
+ background-size: 50px 50px;
+ min-height: 80px;
+}
+
+div.lazy {
+ background-image: url('images/loading.gif');
+ background-repeat: no-repeat;
+ background-position: 50% 50%;
+ background-size: 50px 50px;
+ min-height: 80px;
+}
+
+.badge-publication {
+ font-size: 100%;
+}
+
+.email-text {
+ font-family: Source Code Pro, monospace;
+}
diff --git a/assets/css/images/loading.gif b/assets/css/images/loading.gif
new file mode 100644
index 0000000..1d13653
Binary files /dev/null and b/assets/css/images/loading.gif differ
diff --git a/assets/images/badges/MIT_Social_circle.png b/assets/images/badges/MIT_Social_circle.png
new file mode 100644
index 0000000..042d979
Binary files /dev/null and b/assets/images/badges/MIT_Social_circle.png differ
diff --git a/assets/images/badges/PKU_red.png b/assets/images/badges/PKU_red.png
new file mode 100755
index 0000000..6ada1ba
Binary files /dev/null and b/assets/images/badges/PKU_red.png differ
diff --git a/assets/images/covers/cover1.jpg b/assets/images/covers/cover1.jpg
new file mode 100644
index 0000000..9c2ac92
Binary files /dev/null and b/assets/images/covers/cover1.jpg differ
diff --git a/assets/images/covers/cover2.jpg b/assets/images/covers/cover2.jpg
new file mode 100644
index 0000000..4655c4a
Binary files /dev/null and b/assets/images/covers/cover2.jpg differ
diff --git a/assets/images/covers/cover3.jpg b/assets/images/covers/cover3.jpg
new file mode 100644
index 0000000..232740d
Binary files /dev/null and b/assets/images/covers/cover3.jpg differ
diff --git a/assets/images/empty_300x200.png b/assets/images/empty_300x200.png
new file mode 100644
index 0000000..943fda2
Binary files /dev/null and b/assets/images/empty_300x200.png differ
diff --git a/assets/images/etc/cat1.jpg b/assets/images/etc/cat1.jpg
new file mode 100644
index 0000000..e534adc
Binary files /dev/null and b/assets/images/etc/cat1.jpg differ
diff --git a/assets/images/etc/cat2.jpg b/assets/images/etc/cat2.jpg
new file mode 100644
index 0000000..5255e73
Binary files /dev/null and b/assets/images/etc/cat2.jpg differ
diff --git a/assets/images/etc/preview.png b/assets/images/etc/preview.png
new file mode 100644
index 0000000..f76e217
Binary files /dev/null and b/assets/images/etc/preview.png differ
diff --git a/assets/images/etc/tim_the_beaver.png b/assets/images/etc/tim_the_beaver.png
new file mode 100644
index 0000000..30c24d7
Binary files /dev/null and b/assets/images/etc/tim_the_beaver.png differ
diff --git a/assets/images/photos/portrait.jpg b/assets/images/photos/portrait.jpg
new file mode 100644
index 0000000..46e9b6e
Binary files /dev/null and b/assets/images/photos/portrait.jpg differ
diff --git a/assets/js/blog.js b/assets/js/blog.js
new file mode 100644
index 0000000..15b7365
--- /dev/null
+++ b/assets/js/blog.js
@@ -0,0 +1,57 @@
+(function () {
+ var tocList = document.querySelector('.blog-toc-list');
+ if (!tocList) return;
+
+ var content = document.querySelector('.blog-content');
+ var headings = content.querySelectorAll('h1, h2, h3');
+ var navbarHeight = 90;
+
+ if (headings.length === 0) {
+ document.getElementById('blog-toc').style.display = 'none';
+ return;
+ }
+
+ // Add scroll-margin to all headings so anchor links clear the navbar
+ headings.forEach(function (heading, i) {
+ if (!heading.id) {
+ heading.id = 'heading-' + i;
+ }
+ heading.style.scrollMarginTop = navbarHeight + 'px';
+
+ var li = document.createElement('li');
+ var a = document.createElement('a');
+ a.href = '#' + heading.id;
+ a.textContent = heading.textContent;
+ a.className = 'toc-' + heading.tagName.toLowerCase();
+ a.addEventListener('click', function (e) {
+ e.preventDefault();
+ var target = document.getElementById(heading.id);
+ if (target) {
+ window.scrollTo({
+ top: target.offsetTop - navbarHeight,
+ behavior: 'smooth'
+ });
+ history.pushState(null, null, '#' + heading.id);
+ }
+ });
+ li.appendChild(a);
+ tocList.appendChild(li);
+ });
+
+ // Highlight active heading on scroll
+ var tocLinks = tocList.querySelectorAll('a');
+ function updateActive() {
+ var scrollPos = window.scrollY + navbarHeight + 10;
+ var current = null;
+ headings.forEach(function (heading) {
+ if (heading.offsetTop <= scrollPos) {
+ current = heading.id;
+ }
+ });
+ tocLinks.forEach(function (link) {
+ link.classList.toggle('toc-active', link.getAttribute('href') === '#' + current);
+ });
+ }
+ window.addEventListener('scroll', updateActive, { passive: true });
+ updateActive();
+})();
diff --git a/assets/js/bubble_visual_hash.js b/assets/js/bubble_visual_hash.js
new file mode 100644
index 0000000..366e444
--- /dev/null
+++ b/assets/js/bubble_visual_hash.js
@@ -0,0 +1,122 @@
+// Formatted version of a popular md5 implementation
+// Original copyright (c) Paul Johnston & Greg Holt.
+function md5(inputString) {
+ var hc = "0123456789abcdef";
+ function rh(n) { var j, s = ""; for (j = 0; j <= 3; j++) s += hc.charAt((n >> (j * 8 + 4)) & 0x0F) + hc.charAt((n >> (j * 8)) & 0x0F); return s; }
+ function ad(x, y) { var l = (x & 0xFFFF) + (y & 0xFFFF); var m = (x >> 16) + (y >> 16) + (l >> 16); return (m << 16) | (l & 0xFFFF); }
+ function rl(n, c) { return (n << c) | (n >>> (32 - c)); }
+ function cm(q, a, b, x, s, t) { return ad(rl(ad(ad(a, q), ad(x, t)), s), b); }
+ function ff(a, b, c, d, x, s, t) { return cm((b & c) | ((~b) & d), a, b, x, s, t); }
+ function gg(a, b, c, d, x, s, t) { return cm((b & d) | (c & (~d)), a, b, x, s, t); }
+ function hh(a, b, c, d, x, s, t) { return cm(b ^ c ^ d, a, b, x, s, t); }
+ function ii(a, b, c, d, x, s, t) { return cm(c ^ (b | (~d)), a, b, x, s, t); }
+ function sb(x) {
+ var i; var nblk = ((x.length + 8) >> 6) + 1; var blks = new Array(nblk * 16); for (i = 0; i < nblk * 16; i++) blks[i] = 0;
+ for (i = 0; i < x.length; i++) blks[i >> 2] |= x.charCodeAt(i) << ((i % 4) * 8);
+ blks[i >> 2] |= 0x80 << ((i % 4) * 8); blks[nblk * 16 - 2] = x.length * 8; return blks;
+ }
+ var i, x = sb("" + inputString), a = 1732584193, b = -271733879, c = -1732584194, d = 271733878, olda, oldb, oldc, oldd;
+ for (i = 0; i < x.length; i += 16) {
+ olda = a; oldb = b; oldc = c; oldd = d;
+ a = ff(a, b, c, d, x[i + 0], 7, -680876936); d = ff(d, a, b, c, x[i + 1], 12, -389564586); c = ff(c, d, a, b, x[i + 2], 17, 606105819);
+ b = ff(b, c, d, a, x[i + 3], 22, -1044525330); a = ff(a, b, c, d, x[i + 4], 7, -176418897); d = ff(d, a, b, c, x[i + 5], 12, 1200080426);
+ c = ff(c, d, a, b, x[i + 6], 17, -1473231341); b = ff(b, c, d, a, x[i + 7], 22, -45705983); a = ff(a, b, c, d, x[i + 8], 7, 1770035416);
+ d = ff(d, a, b, c, x[i + 9], 12, -1958414417); c = ff(c, d, a, b, x[i + 10], 17, -42063); b = ff(b, c, d, a, x[i + 11], 22, -1990404162);
+ a = ff(a, b, c, d, x[i + 12], 7, 1804603682); d = ff(d, a, b, c, x[i + 13], 12, -40341101); c = ff(c, d, a, b, x[i + 14], 17, -1502002290);
+ b = ff(b, c, d, a, x[i + 15], 22, 1236535329); a = gg(a, b, c, d, x[i + 1], 5, -165796510); d = gg(d, a, b, c, x[i + 6], 9, -1069501632);
+ c = gg(c, d, a, b, x[i + 11], 14, 643717713); b = gg(b, c, d, a, x[i + 0], 20, -373897302); a = gg(a, b, c, d, x[i + 5], 5, -701558691);
+ d = gg(d, a, b, c, x[i + 10], 9, 38016083); c = gg(c, d, a, b, x[i + 15], 14, -660478335); b = gg(b, c, d, a, x[i + 4], 20, -405537848);
+ a = gg(a, b, c, d, x[i + 9], 5, 568446438); d = gg(d, a, b, c, x[i + 14], 9, -1019803690); c = gg(c, d, a, b, x[i + 3], 14, -187363961);
+ b = gg(b, c, d, a, x[i + 8], 20, 1163531501); a = gg(a, b, c, d, x[i + 13], 5, -1444681467); d = gg(d, a, b, c, x[i + 2], 9, -51403784);
+ c = gg(c, d, a, b, x[i + 7], 14, 1735328473); b = gg(b, c, d, a, x[i + 12], 20, -1926607734); a = hh(a, b, c, d, x[i + 5], 4, -378558);
+ d = hh(d, a, b, c, x[i + 8], 11, -2022574463); c = hh(c, d, a, b, x[i + 11], 16, 1839030562); b = hh(b, c, d, a, x[i + 14], 23, -35309556);
+ a = hh(a, b, c, d, x[i + 1], 4, -1530992060); d = hh(d, a, b, c, x[i + 4], 11, 1272893353); c = hh(c, d, a, b, x[i + 7], 16, -155497632);
+ b = hh(b, c, d, a, x[i + 10], 23, -1094730640); a = hh(a, b, c, d, x[i + 13], 4, 681279174); d = hh(d, a, b, c, x[i + 0], 11, -358537222);
+ c = hh(c, d, a, b, x[i + 3], 16, -722521979); b = hh(b, c, d, a, x[i + 6], 23, 76029189); a = hh(a, b, c, d, x[i + 9], 4, -640364487);
+ d = hh(d, a, b, c, x[i + 12], 11, -421815835); c = hh(c, d, a, b, x[i + 15], 16, 530742520); b = hh(b, c, d, a, x[i + 2], 23, -995338651);
+ a = ii(a, b, c, d, x[i + 0], 6, -198630844); d = ii(d, a, b, c, x[i + 7], 10, 1126891415); c = ii(c, d, a, b, x[i + 14], 15, -1416354905);
+ b = ii(b, c, d, a, x[i + 5], 21, -57434055); a = ii(a, b, c, d, x[i + 12], 6, 1700485571); d = ii(d, a, b, c, x[i + 3], 10, -1894986606);
+ c = ii(c, d, a, b, x[i + 10], 15, -1051523); b = ii(b, c, d, a, x[i + 1], 21, -2054922799); a = ii(a, b, c, d, x[i + 8], 6, 1873313359);
+ d = ii(d, a, b, c, x[i + 15], 10, -30611744); c = ii(c, d, a, b, x[i + 6], 15, -1560198380); b = ii(b, c, d, a, x[i + 13], 21, 1309151649);
+ a = ii(a, b, c, d, x[i + 4], 6, -145523070); d = ii(d, a, b, c, x[i + 11], 10, -1120210379); c = ii(c, d, a, b, x[i + 2], 15, 718787259);
+ b = ii(b, c, d, a, x[i + 9], 21, -343485551); a = ad(a, olda); b = ad(b, oldb); c = ad(c, oldc); d = ad(d, oldd);
+ }
+ return rh(a) + rh(b) + rh(c) + rh(d);
+}
+
+
+// This script is inspired by https://github.com/dakridge/identicon
+
+createHashGroupForString = function (str) {
+ var hashGroup = [];
+ var hash = md5(str);
+ for (var i = 0; i < hash.length; i += 1) {
+ var byte = parseInt(hash[i], 16);
+ hashGroup.push(byte);
+ }
+ return hashGroup;
+}
+
+createBubbleInfo = function (hashGroup, n, w, h) {
+ var maxN = hashGroup.length / 2;
+ n = n < maxN ? n : maxN;
+ var wh = w < h ? w : h;
+ var scaleX = function (v) { return (w / 16) * v; };
+ var scaleY = function (v) { return (h / 16) * v; };
+ var radius = function (v) { var min = 10; var max = wh / 2; return min + ((v / 16) * (max - min)); };
+ var color = function (i) {
+ var c = [
+ "#1f77b4", "#aec7e8", // blue
+ "#ff7f0e", "#ffbb78", // orange
+ "#2ca02c", "#98df8a", // green
+ "#d62728", "#ff9896", // red
+ "#9467bd", "#c5b0d5", // purple
+ "#8c564b", "#c49c94", // brown
+ // "#e377c2", "#f7b6d2", // pink
+ // "#7f7f7f", "#c7c7c7", // gray
+ "#bcbd22", "#dbdb8d", // yellow
+ "#17becf", "#9edae5", // cyan
+ ];
+ return c[i % c.length];
+ };
+
+ var bubbleInfo = [];
+ for (var i = 0; i < n; i++) {
+ var xRel = hashGroup[2 * i];
+ var yRel = hashGroup[2 * i + 1];
+ bubbleInfo.push({
+ x: scaleX(xRel),
+ y: scaleY(yRel),
+ radius: radius(hashGroup[(xRel * yRel) % hashGroup.length]),
+ color: color(xRel + yRel)
+ });
+ }
+ return bubbleInfo;
+}
+
+
+drawBubble = function (svg, bubbleInfo) {
+ // Sort bubbles by radius in descending order
+ bubbleInfo.sort(function (a, b) {
+ return b.radius - a.radius;
+ });
+ for (var i = 0; i < bubbleInfo.length; i++) {
+ var bubble = bubbleInfo[i];
+ var circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
+ circle.setAttribute("cx", bubble.x);
+ circle.setAttribute("cy", bubble.y);
+ circle.setAttribute("r", bubble.radius);
+ circle.setAttribute("fill", bubble.color);
+ circle.setAttribute("fill-opacity", 0.75);
+ svg.appendChild(circle);
+ }
+}
+
+var canvases = document.querySelectorAll(".bubble-visual-hash");
+canvases.forEach(function (canvas) {
+ var hash = canvas.getAttribute("data-bubble-visual-hash");
+ var width = canvas.viewBox.baseVal.width;
+ var height = canvas.viewBox.baseVal.height;
+ var bubbleInfo = createBubbleInfo(createHashGroupForString(hash), 8, width, height);
+ drawBubble(canvas, bubbleInfo);
+});
diff --git a/assets/js/common.js b/assets/js/common.js
new file mode 100644
index 0000000..61a54bd
--- /dev/null
+++ b/assets/js/common.js
@@ -0,0 +1,42 @@
+// aHR0cHM6Ly9naXRodWIuY29tL2x1b3N0MjYvYWNhZGVtaWMtaG9tZXBhZ2U=
+$(function () {
+ lazyLoadOptions = {
+ scrollDirection: 'vertical',
+ effect: 'fadeIn',
+ effectTime: 300,
+ placeholder: "",
+ onError: function(element) {
+ console.log('[lazyload] Error loading ' + element.data('src'));
+ },
+ afterLoad: function(element) {
+ if (element.is('img')) {
+ // remove background-image style
+ element.css('background-image', 'none');
+ element.css('min-height', '0');
+ } else if (element.is('div')) {
+ // set the style to background-size: cover;
+ element.css('background-size', 'cover');
+ element.css('background-position', 'center');
+ }
+ }
+ }
+
+ $('img.lazy, div.lazy:not(.always-load)').Lazy({visibleOnly: true, ...lazyLoadOptions});
+ $('div.lazy.always-load').Lazy({visibleOnly: false, ...lazyLoadOptions});
+
+ $('[data-toggle="tooltip"]').tooltip()
+
+ var $grid = $('.grid').masonry({
+ "percentPosition": true,
+ "itemSelector": ".grid-item",
+ "columnWidth": ".grid-sizer"
+ });
+ // layout Masonry after each image loads
+ $grid.imagesLoaded().progress(function () {
+ $grid.masonry('layout');
+ });
+
+ $(".lazy").on("load", function () {
+ $grid.masonry('layout');
+ });
+})
diff --git a/assets/js/semantic_scholar_citation_count.js b/assets/js/semantic_scholar_citation_count.js
new file mode 100644
index 0000000..6b1d565
--- /dev/null
+++ b/assets/js/semantic_scholar_citation_count.js
@@ -0,0 +1,68 @@
+const citationCountElements = document.querySelectorAll('[data-semantic-scholar-id]');
+citationCountElements.forEach(element => {
+ const id = element.getAttribute('data-semantic-scholar-id');
+ if (id) {
+ element.setAttribute('data-semantic-scholar-id', id.toLowerCase());
+ }
+});
+
+const semanticScholarIds = new Set(Array.from(citationCountElements).map(element => element.getAttribute('data-semantic-scholar-id')).filter(id => id));
+
+let uncachedSemanticScholarIds = [];
+semanticScholarIds.forEach(id => {
+ const cacheKey = `semanticScholarCitationCount:${id}`;
+ const cachedData = localStorage.getItem(cacheKey);
+ if (cachedData) {
+ const { _, timestamp } = JSON.parse(cachedData);
+ // If cached data is older than 1 hour, consider it uncached
+ if (Date.now() - timestamp > 1 * 60 * 60 * 1000) {
+ uncachedSemanticScholarIds.push(id);
+ }
+ } else {
+ uncachedSemanticScholarIds.push(id);
+ }
+});
+
+let showSemanticScholarCitationCount = () => {
+ // Update the DOM with the cached citation counts
+ semanticScholarIds.forEach(id => {
+ const cacheKey = `semanticScholarCitationCount:${id}`;
+ const cachedData = localStorage.getItem(cacheKey);
+ if (cachedData) {
+ const { citationCount } = JSON.parse(cachedData);
+ const elements = document.querySelectorAll(`[data-semantic-scholar-id="${id}"]`);
+ elements.forEach(element => {
+ element.innerHTML = ` ${parseInt(citationCount).toLocaleString()} citations `;
+ });
+ }
+ });
+};
+
+if (uncachedSemanticScholarIds.length > 0) {
+ fetch('https://api.semanticscholar.org/graph/v1/paper/batch?fields=citationCount', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ ids: Array.from(semanticScholarIds)
+ })
+ }).then(response => {
+ return response.json();
+ }).then(data => {
+ data.forEach(paper => {
+ console.log(paper);
+ // Cache citation count data
+ const cacheKey = `semanticScholarCitationCount:${paper.paperId}`;
+ const cacheData = {
+ citationCount: paper.citationCount,
+ timestamp: Date.now()
+ };
+ localStorage.setItem(cacheKey, JSON.stringify(cacheData));
+ });
+ }).catch(error => {
+ console.error('Error fetching Semantic Scholar data:', error);
+ }).finally(showSemanticScholarCitationCount);
+} else {
+ showSemanticScholarCitationCount();
+}
diff --git a/blog.html b/blog.html
new file mode 100644
index 0000000..31cd3d6
--- /dev/null
+++ b/blog.html
@@ -0,0 +1,32 @@
+---
+layout: default
+title : Blog
+navbar_title: Blog
+body_attr: >-
+ data-spy="scroll" data-target="#navbar-year" data-offset="100"
+---
+
+{% assign blogs_by_year = site.posts | sort: "date" | reverse | group_by_exp: "item", "item.date | date: '%Y'" %}
+
+
+
+ {% for year in blogs_by_year %}
+ {% assign num_blogs = year.items | size %}
+
{{ year.name }}
+
+ {% for item in year.items %}
+ {% include widgets/blog_card.html item=item hide_bottom_border=forloop.last first=forloop.first last=forloop.last %}
+ {% endfor %}
+
+ {% endfor %}
+
+
+
+
+
diff --git a/index.html b/index.html
index 4e2a3ee..7f69c4d 100644
--- a/index.html
+++ b/index.html
@@ -1,78 +1,39 @@
---
layout: default
-title: Home
-url: /
+title : Homepage
+navbar_title: Home
---
-
-
-
-
{{ site.name }}
-
-
{{ site.data.profile.bio }}
-
- {% if site.email %}
✉ Email {% endif %}
- {% if site.github %}
GitHub {% endif %}
- {% if site.linkedin %}
LinkedIn {% endif %}
- {% if site.google_scholar %}
Google Scholar {% endif %}
- {% if site.orcid %}
ORCID {% endif %}
+
+
+
+ {% include widgets/profile_card_mini.html %}
-
-
+
-
-
Actualités
-
- {% for item in site.news limit:5 %}
-
- {{ item.date | date: "%b %Y" }}
- {{ item.content | markdownify | remove: '' | remove: '
' }}
-
- {% endfor %}
-
-
+ {% include widgets/profile_card_bio_only.html %}
-
-
Publications sélectionnées
-
- {% assign selected = site.publications | where: "selected", true %}
- {% for pub in selected %}
-
-
-
{{ pub.title }}
-
{{ pub.authors }}
-
{{ pub.venue }}, {{ pub.year }}
-
- {% if pub.paper_url %}
Paper {% endif %}
- {% if pub.code_url %}
Code {% endif %}
-
-
+
+ {% include widgets/debug_repo_name.html %}
+ {% include widgets/debug_url.html %}
+
+ {% if site.data.display.homepage.show_experience %}
+ {% include widgets/experience_card.html %}
+ {% endif %}
+
+ {% if site.data.display.homepage.show_news %}
+ {% assign count_news = site.news | size %}
+ {% if count_news > 0 %}
+ {% include widgets/news_card.html limit=site.data.display.homepage.num_news %}
+ {% endif %}
+ {% endif %}
+
+ {% if site.data.display.homepage.show_selected_publications %}
+ {% assign pubs = site.publications | sort: "date" | reverse | where: "selected", true %}
+ {%
+ include widgets/publication_card.html
+ publications=pubs
+ title='
Selected Publications'
+ %}
+ {% endif %}
- {% endfor %}
-
-
-
-
-
Intérêts
-
- {% for interest in site.data.profile.interests %}
- {{ interest }}
- {% endfor %}
-
-
-
-
-
Formation
-
- {% for edu in site.data.profile.education %}
-
-
-
{{ edu.degree }}
-
{{ edu.institution }}
-
- {{ edu.year }}
-
- {% endfor %}
-
diff --git a/index_layout2.html b/index_layout2.html
new file mode 100644
index 0000000..30f3053
--- /dev/null
+++ b/index_layout2.html
@@ -0,0 +1,26 @@
+---
+layout: default
+title : Homepage
+navbar_title: Home (Layout 2)
+---
+{% include widgets/profile_card.html %}
+
+{% if site.data.display.homepage.show_experience %}
+ {% include widgets/experience_card.html %}
+{% endif %}
+
+{% if site.data.display.homepage.show_news %}
+ {% assign count_news = site.news | size %}
+ {% if count_news > 0 %}
+ {% include widgets/news_card.html limit=site.data.display.homepage.num_news %}
+ {% endif %}
+{% endif %}
+
+{% if site.data.display.homepage.show_selected_publications %}
+ {% assign pubs = site.publications | sort: "date" | reverse | where: "selected", true %}
+ {%
+ include widgets/publication_card.html
+ publications=pubs
+ title='
Selected Publications'
+ %}
+{% endif %}
diff --git a/publications.html b/publications.html
index 4b94cdf..14cd56f 100644
--- a/publications.html
+++ b/publications.html
@@ -1,27 +1,32 @@
---
layout: default
-title: Publications
-url: /publications
+title : Publications
+navbar_title: Publications
+body_attr: >-
+ data-spy="scroll" data-target="#navbar-year" data-offset="100"
---
-
Publications
-
- {% assign pubs_by_year = site.publications | group_by: "year" | sort: "name" | reverse %}
- {% for year_group in pubs_by_year %}
-
-
{{ year_group.name }}
- {% for pub in year_group.items %}
-
-
-
{{ pub.title }}
-
{{ pub.authors }}
-
{{ pub.venue }}
-
- {% if pub.paper_url %}
Paper {% endif %}
- {% if pub.code_url %}
Code {% endif %}
+
+{% assign pubs_by_year = site.publications | sort: "date" | reverse | group_by_exp: "item", "item.date | date: '%Y'" %}
+
+
+
+ {% for year in pubs_by_year %}
+ {% assign num_papers = year.items | size %}
+
{{ year.name }}
+
+ {% for item in year.items %}
+ {% include widgets/publication_item.html item=item hide_bottom_border=forloop.last first=forloop.first last=forloop.last %}
+ {% endfor %}
-
+ {% endfor %}
- {% endfor %}
-
- {% endfor %}
+
+
+
diff --git a/showcase.html b/showcase.html
index 40bed62..5be0d6d 100644
--- a/showcase.html
+++ b/showcase.html
@@ -1,19 +1,32 @@
---
layout: default
-title: Projets
-url: /showcase
+title : Showcase
+navbar_title: Showcase
+container_class: container-xl
---
-
Projets
-