diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b07dbf --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +output/ +__pycache__/ +*.py[cod] +*$py.class \ No newline at end of file diff --git a/web/__pycache__/pelicanconf.cpython-310.pyc b/web/__pycache__/pelicanconf.cpython-310.pyc deleted file mode 100644 index fc632d5..0000000 Binary files a/web/__pycache__/pelicanconf.cpython-310.pyc and /dev/null differ diff --git a/web/content/pages/home.md b/web/content/pages/home.md index 9ca25eb..fc3d839 100644 --- a/web/content/pages/home.md +++ b/web/content/pages/home.md @@ -1,4 +1,4 @@ -Title: +Title: juːmınəs /'fiɫd/ /kəm,junə'keıʃən/ URL: -Save_as: index.html - +Template: home +Save_as: index.html \ No newline at end of file diff --git a/web/content/tags/ein_hod_01.md b/web/content/tags/ein_hod_01.md index 3c6494b..fc2abf0 100644 --- a/web/content/tags/ein_hod_01.md +++ b/web/content/tags/ein_hod_01.md @@ -1,6 +1,6 @@ -Title: Journal Entry 1 +Title: Journal Entry 01 Date: 2023-04-12 Category: Blue Eyed Donkey Location: 32.70124169424201, 34.9805500394171 -I noticed a peculiar sensation in the air as soon as I arrived in town. It was as if an electric charge was coursing through the air beneath the pastoral tranquillity, making me nervous. I looked around, but there was no one to be found. The faint odor of decay lingered around me, mingled with the sweet fragrance of incense. The mix made me feel uneasy, like if I'd stepped into a strange, surreal dream. \ No newline at end of file +I noticed a peculiar sensation in the air as soon as I arrived in town. It was as if an electric charge was coursing through the air beneath the pastoral tranquillity. I looked around, but there was no one to be found. The faint odor of decay lingered around me, mingled with the sweet fragrance of incense. The mix made me feel uneasy, like if I'd stepped into a strange, surreal dream. \ No newline at end of file diff --git a/web/content/tags/ein_hod_02.md b/web/content/tags/ein_hod_02.md index 035f315..34636ca 100644 --- a/web/content/tags/ein_hod_02.md +++ b/web/content/tags/ein_hod_02.md @@ -1,6 +1,6 @@ -Title: Journal Entry 2 +Title: Journal Entry 02 Date: 2023-04-12 Category: Blue Eyed Donkey Location: 32.699615286072735, 34.98304356695975 -I spent the day exploring the town and stumbled upon an old, abandoned house. Inside, I found a collection of paintings that immediately caught my eye. They were unlike anything I had ever seen before, with bold colors and abstract shapes. I later learned that the artist who painted them was an Austrian painter who had worked as a traffic warden in the early days of the country. Her eccentricity was well-known among the locals, and it's said that she inspired Sunday, one of the founders of the town, in his own artistic pursuits. It's a shame that her work has been forgotten and left to decay in this abandoned house. \ No newline at end of file +I spent the day wandering around town and came across an old, abandoned house. Inside, I discovered a collection of paintings that immediately caught my eye. They were unlike anything I'd ever seen before, with bright colors and abstract shapes. I later discovered that the artist was an Austrian painter whose eccentricities were well-known among the people, and it is said that she influenced Sunday, one of the town's founders, in his own artistic pursuits. It's a shame her art has been forgotten and left to decay in this derelict property. \ No newline at end of file diff --git a/web/content/tags/ein_hod_03.md b/web/content/tags/ein_hod_03.md index 11c5652..da642be 100644 --- a/web/content/tags/ein_hod_03.md +++ b/web/content/tags/ein_hod_03.md @@ -1,6 +1,6 @@ -Title: Journal Entry 3 +Title: Journal Entry 03 Date: 2023-04-12 Category: Blue Eyed Donkey Location: 32.70003059472479, 34.985554114475526 -As I wandered through the museum today, I stumbled upon a hidden room tucked away in a corner. It was like nothing I'd ever seen before. The air was heavy with the scent of wood and brass, and strange instruments and machines filled the room. Pipes and horns seemed to sprout from the walls like metallic vines, and the organs were unlike any I'd ever laid eyes on, with keyboards sprouting in every direction. As I explored further, I found boxes adorned with mysterious levers and knobs that seemed to emit a cacophony of otherworldly sounds. It was as though I had stumbled into the secret workshop of a mad scientist. \ No newline at end of file +As I wandered through the museum today, I stumbled upon a hidden room tucked away behind a curtain in a corner. The air was heavy with the scent of wood and brass, and strange instruments and machines filled the room. Pipes and horns seemed to sprout from the walls like metallic vines in every direction. As I explored further, I found wooden boxes of all sizes and shapes adorned with mysterious levers and knobs. It was as though I had stumbled into the secret workshop of a mad scientist. \ No newline at end of file diff --git a/web/content/tags/ein_hod_04.md b/web/content/tags/ein_hod_04.md index a7f0297..66412e9 100644 --- a/web/content/tags/ein_hod_04.md +++ b/web/content/tags/ein_hod_04.md @@ -1,5 +1,6 @@ -Title: Journal Entry 4 +Title: Journal Entry 04 Date: 2023-04-12 Category: Blue Eyed Donkey +Location: 32.70124169424201, 34.9805500394171 -The festival of the Golden Calf is approaching, and the whole town is buzzing with anticipation. People are putting up decorations and practicing music for the big day. I can feel the excitement building, but I'm not sure what to expect. The cultists seem to be especially fervent this year, and they've been constructing an elaborate shrine in the town square. I can't help but wonder what it means for the town and its people. \ No newline at end of file +The festival of the Golden Calf is approaching, and the whole town is buzzing with anticipation. People are putting up decorations, building strange sculptures and practicing music for the big day. I can feel the excitement among the locals, but I'm not sure what to expect. I can't help but wonder that there might be more to this event than the obvious spectacle that tourists like myself are made to participate in. Maybe it is all a distraction from something else? \ No newline at end of file diff --git a/web/content/tags/ein_hod_05.md b/web/content/tags/ein_hod_05.md index dc28598..9b8c937 100644 --- a/web/content/tags/ein_hod_05.md +++ b/web/content/tags/ein_hod_05.md @@ -1,5 +1,6 @@ -Title: Journal Entry 5 +Title: Journal Entry 05 Date: 2023-04-12 Category: Blue Eyed Donkey +Location: 32.70124169424201, 34.9805500394171 -Last night I had a nightmare about a donkey with blue eyes. In the dream, he was leading me through a maze of underground caves, but every time I looked back, the tunnels had shifted and I couldn't find my way back. Suddenly, I woke up with a start, convinced that someone or something was in my room. But when I turned on the light, there was nothing there. Maybe it was just my mind playing tricks on me. \ No newline at end of file +Last night I had a nightmare about a donkey with blue eyes. In the dream, he was leading me through a maze of underground caves, but every time I looked back, the tunnels seemed to have shifted and I couldn't find my way back. Suddenly, I woke up in fear, convinced that someone or something was in my room. But when I turned on the light, there was nothing there. Maybe it was just my mind playing tricks on me. \ No newline at end of file diff --git a/web/content/tags/ein_hod_06.md b/web/content/tags/ein_hod_06.md index 079fb5b..645b122 100644 --- a/web/content/tags/ein_hod_06.md +++ b/web/content/tags/ein_hod_06.md @@ -1,5 +1,5 @@ -Title: Journal Entry 6 +Title: Journal Entry 06 Date: 2023-04-12 Category: Blue Eyed Donkey -I met Sunday today, and he's a strange fellow. He's fascinated by musical machines and their ability to manipulate reality. He spoke about how music can influence the world and change the way we perceive things. Although I couldn't follow everything he said, I found myself captivated by his words. There's something odd about him, though. I can't help feeling like he's not entirely human. \ No newline at end of file +I met Sunday today, and he's a strange fellow. He seems obsessed with musical machines and wouldn´t stop talking about how certain sounds and melodies can influence the world and change the way we perceive things. Although I couldn't follow everything he said, I found myself captivated by his enthusiasm. There's something odd about him, though. I can't help feeling like he's not entirely human. \ No newline at end of file diff --git a/web/content/tags/ein_hod_07.md b/web/content/tags/ein_hod_07.md index 2f8df05..f17b354 100644 --- a/web/content/tags/ein_hod_07.md +++ b/web/content/tags/ein_hod_07.md @@ -1,5 +1,5 @@ -Title: Journal Entry 7 +Title: Journal Entry 07 Date: 2023-04-12 Category: Blue Eyed Donkey -I ventured deep into one of the caves that dot this place. Its twisting tunnels and cavernous halls seem to have no end, and I feel like I've been wandering for hours. The musty air is thick with dust and the scent of damp earth, and the walls are slick with moss and lichen. It's as if the very rocks themselves are alive and breathing. As I explored further, I heard strange echoes and whispers, and the sound of footsteps coming from far away. I'm starting to wonder if I'm the only one down here, or if something else is lurking in the darkness. \ No newline at end of file +I ventured deep into one of the caves that dot this area. Its twisting tunnels and cavernous halls seem to have no end, and I feel like I've been wandering for hours. The musty air is thick with dust and the scent of damp earth, and the walls are slick with moss and lichen. It's as if the very rocks themselves are alive and breathing. As I explored further down one of the tunnels, I heard strange echoes and whispers. \ No newline at end of file diff --git a/web/content/tags/ein_hod_08.md b/web/content/tags/ein_hod_08.md index 8103915..10bf49a 100644 --- a/web/content/tags/ein_hod_08.md +++ b/web/content/tags/ein_hod_08.md @@ -1,5 +1,5 @@ -Title: Journal Entry 8 +Title: Journal Entry 08 Date: 2023-04-12 Category: Blue Eyed Donkey -I met a man today who calls himself the Blue-Eyed Donkey. He was cooking an omelet with a pigeon's egg on a British kerosene stove. He ate it with gusto, but he refused to speak to me. I could see the fear in his eyes. It's strange how guarded some people are in this town. The people here are peculiar. They act in mysterious ways, like they're hiding something. It's unsettling, but also intriguing. I can't help but wonder what secrets this place holds. \ No newline at end of file +I met a man today who calls himself the Blue-Eyed Donkey. He was cooking an omelet from a pigeon's egg on an old British kerosene stove. He ate it with gusto, but he refused to speak to me. I could see anxiety in his eyes. It's strange how guarded and peculiar some people are around here. Some act in suspicious ways, like they're hiding something. It's unsettling, but also intriguing. I can't help but wonder what secrets this place holds. \ No newline at end of file diff --git a/web/content/tags/ein_hod_09.md b/web/content/tags/ein_hod_09.md index 30d0958..8487681 100644 --- a/web/content/tags/ein_hod_09.md +++ b/web/content/tags/ein_hod_09.md @@ -1,5 +1,5 @@ -Title: Journal Entry 9 +Title: Journal Entry 09 Date: 2023-04-12 Category: Blue Eyed Donkey -As I delve deeper into the world of Dada, I can't help but notice the striking similarities between the movement and the strange occurrences in this town. The absurdity and chaos, the rejection of societal norms and values, the questioning of reality itself -- all of it seems to be reflected in the bizarre events that I've witnessed. It's almost as if the Dadaists were prophesying what was to come. And yet, I can't shake the feeling that there's something deeper, something more sinister at play. Is it possible that this is all part of a grand scheme, orchestrated by some unseen force? The more I learn, I'm starting to wonder if there's more to this than just my imagination. \ No newline at end of file +I delved deep into researching the world of Dada. The absurdity and chaos, the rejection of societal norms and values, the questioning of reality itself -- all of it seems to be reflected in what is happening around this town. Is it possible that this is all part of a grand scheme, orchestrated by some unseen force? The more I learn, I'm starting to wonder if it is just my imagination or if I am being manipulated. \ No newline at end of file diff --git a/web/content/tags/ein_hod_12.md b/web/content/tags/ein_hod_12.md index ffef02b..74af623 100644 --- a/web/content/tags/ein_hod_12.md +++ b/web/content/tags/ein_hod_12.md @@ -2,4 +2,4 @@ Title: Journal Entry 12 Date: 2023-04-12 Category: Blue Eyed Donkey -The paranoia is really starting to set in. I can't trust anyone, not even myself. I keep having these vivid nightmares and I'm starting to lose track of what's real and what's just my imagination. I'm afraid that if I stay here much longer, I'll never be able to leave. I've decided to leave the village tomorrow. I don't care if I never figure out what's really going on here. I just want to get as far away from this place as possible. I packed my bags this afternoon, and when I opened my door to leave, I found a blue-eyed donkey standing outside. It just stared at me with those piercing blue eyes... \ No newline at end of file +The paranoia is really starting to set in. I can't trust anyone, not even myself. I keep having these vivid nightmares and I'm starting to lose track of what's real and what's just my imagination. I'm afraid that if I stay here much longer, I'll never be able to leave. I've decided to take the bus tomorrow morning. I don't care if I never figure out what's really going on here. I just want to get as far away from this place as possible. I packed my bags already this afternoon, ready to leave. But when I opened my door, I found a blue-eyed donkey standing outside. It just stared at me with those piercing blue eyes... \ No newline at end of file diff --git a/web/content/tags/ein_hod_13.md b/web/content/tags/ein_hod_13.md index d8d76ef..a1e2efa 100644 --- a/web/content/tags/ein_hod_13.md +++ b/web/content/tags/ein_hod_13.md @@ -2,4 +2,4 @@ Title: Journal Entry 13 Date: 2023-04-12 Category: Blue Eyed Donkey -The Prophet's cave holds the key to unlocking the mysteries of this land. I can feel his presence all around me, a guiding force that leads me closer to my goal. The whispers of the wind seem to carry his words, and I know that I am on the right path. It was as if the very cave itself was a musical instrument, waiting to be played. The Prophet's words echoed off the walls like a symphony, and I couldn't help but feel like I was part of his grand composition. It was a tune that I couldn't get out of my head, a melody that danced through the caves and into my soul. \ No newline at end of file +The Prophet's cave holds the key to unlocking the mysteries of this land. I can feel his presence all around me, a guiding force that leads me closer to my goal. The whispers of the wind seem to carry his words, and I know that I am on the right path. It was as if the very caves themselves are parts of a musical instrument, waiting to be played. The Prophet's words echoed off the walls like a symphony, and I myself was part of his grand composition. It was a tune that I couldn't get out of my head, a melody that danced through the caves and into my soul. \ No newline at end of file diff --git a/web/content/tags/ein_hod_14.md b/web/content/tags/ein_hod_14.md index cca6afa..2c2a673 100644 --- a/web/content/tags/ein_hod_14.md +++ b/web/content/tags/ein_hod_14.md @@ -2,4 +2,4 @@ Title: Journal Entry 14 Date: 2023-04-12 Category: Blue Eyed Donkey -I delved deep into the thorn-laden thicket, my mind ablaze with the key that glimmered in my hand. The path twisted and turned like a demented serpent, the air grew thick and syrupy, like molasses infused with the scent of ancient secrets. And then, there he was. Sunday, the prophet of madness, stood before me, surrounded by his infernal machines and writhing in a fevered frenzy. I could feel the music coursing through my veins, like a thousand serpents uncoiling in a never-ending dance. It spoke to me in tongues unknown, and I felt my mind unraveling like a ball of yarn caught in a hurricane. And then, in a blinding flash of light and sound, the world was reborn in a symphony of chaos and destruction. \ No newline at end of file +I dove deep into the thorn-laden thicket, my mind ablaze with the key that glimmered in my hand. The path twisted and turned like a demented serpent, the air grew thick and syrupy, like molasses infused with the scent of ancient secrets. And then, there he was. Sunday, the prophet of madness, stood before me, surrounded by his infernal machines and writhing in a fevered frenzy. I could feel the music coursing through my veins, like a thousand squirming worms uncoiling in a never-ending dance. They spoke to me in tongues unknown, and I felt my mind unraveling like a ball of yarn caught in a hurricane. And then, in a blinding flash of light and sound, the world was reborn in a symphony of chaos and destruction. \ No newline at end of file diff --git a/web/content/tags/test_01.md b/web/content/tags/test_01.md deleted file mode 100644 index cf6e700..0000000 --- a/web/content/tags/test_01.md +++ /dev/null @@ -1,6 +0,0 @@ -Title: Test -Date: 2023-04-12 -Category: Testing -Location: 32.70194460092584, 34.972507850461874 - -As I wandered through the museum today, I stumbled upon a hidden room tucked away in a corner. It was like nothing I'd ever seen before. The air was heavy with the scent of wood and brass, and strange instruments and machines filled the room. Pipes and horns seemed to sprout from the walls like metallic vines, and the organs were unlike any I'd ever laid eyes on, with keyboards sprouting in every direction. As I explored further, I found boxes adorned with mysterious levers and knobs that seemed to emit a cacophony of otherworldly sounds. It was as though I had stumbled into the secret workshop of a mad scientist. \ No newline at end of file diff --git a/web/nfc-theme/static/local.css b/web/nfc-theme/static/local.css index 4d5de2d..aa18d81 100644 --- a/web/nfc-theme/static/local.css +++ b/web/nfc-theme/static/local.css @@ -32,9 +32,7 @@ body { line-height: 1.2em; text-align: left; color: #090A0E; - height: 100vh; overflow-x: hidden; - overflow-y: hidden; margin: auto; max-width: 40em; } @@ -56,7 +54,6 @@ ul li::before { /* Use a thin border around all images. */ img { - border: 1px solid; max-width: 40em; width: 100%; } diff --git a/web/nfc-theme/templates/base.html b/web/nfc-theme/templates/base.html index 0d234a6..7881858 100644 --- a/web/nfc-theme/templates/base.html +++ b/web/nfc-theme/templates/base.html @@ -1,6 +1,7 @@ + {% block title %}{{ SITENAME }}{% endblock title %} {% block head %} diff --git a/web/nfc-theme/templates/home.html b/web/nfc-theme/templates/home.html new file mode 100644 index 0000000..0e4849d --- /dev/null +++ b/web/nfc-theme/templates/home.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} +{% block title %}Numinous Field Communication{%endblock%} +{% block content %} +

{{ page.title }}

+ {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + + {{ page.content }} + + {% if page.modified %} +

+ Last updated: {{ page.locale_modified }} +

+ {% endif %} +{% endblock %} diff --git a/web/nfc-theme/templates/index.html b/web/nfc-theme/templates/index.html index 7cda289..07af2f4 100644 --- a/web/nfc-theme/templates/index.html +++ b/web/nfc-theme/templates/index.html @@ -5,15 +5,16 @@ {% endblock %} {% for article in articles_page.object_list %} +{% if article.metadata['geohash'] %}

- {{ article.metadata.geohash }} + {{ article.metadata['geohash'] }}

- {{ article.summary }}
+{% endif %} {% endfor %} {% include 'pagination.html' %} diff --git a/web/output/404.html b/web/output/404.html deleted file mode 100644 index 0d694fb..0000000 --- a/web/output/404.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - 404 - - - - - - -
-
Windows
-

An exception 404 has occurred. The page could not be found. It may be possible to continue normally.

- -
- - \ No newline at end of file diff --git a/web/output/geohash/index.html b/web/output/geohash/index.html deleted file mode 100644 index 55d65df..0000000 --- a/web/output/geohash/index.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - -
- - - \ No newline at end of file diff --git a/web/output/index.html b/web/output/index.html deleted file mode 100644 index 3ae4bae..0000000 --- a/web/output/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -

- - - - - - - - - \ No newline at end of file diff --git a/web/output/journal-entry-10/index.html b/web/output/journal-entry-10/index.html deleted file mode 100644 index 0901b63..0000000 --- a/web/output/journal-entry-10/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

The tunnels beckon me, their twisted paths leading deeper into the heart of the mountain. I know that I must follow, that the answers I seek are waiting for me in the darkness. The walls seem to whisper secrets, ancient knowledge that has been lost to time. I feel as though I am on the verge of a great discovery. I have seen things that cannot be explained, visions of a world beyond our own. The lines between reality and fantasy have become blurred, and I am not sure which is which anymore. But I do not fear the unknown, for I know that I am on the right path. The music guides me, and I will follow it wherever it leads.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-11/index.html b/web/output/journal-entry-11/index.html deleted file mode 100644 index a235364..0000000 --- a/web/output/journal-entry-11/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

As I fell asleep last night, the fragrance of the wildflowers filled my senses, and I found myself wandering in a beautiful valley full of olive trees. The sun was setting, casting the sky in hues of orange and red. As I wandered between the trees, I heard a faint tinkling sound, and soon it grew louder, forming a symphony of music. Suddenly, I was surrounded by strange mechanical creatures, their limbs moving in perfect sync with the melody. The music was like nothing I had ever heard before, ethereal and otherworldly. When I woke up, I felt like I had just returned from a far-off land. The music was still ringing in my ears, and I couldn't shake off the feeling that it was calling out to me.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-12/index.html b/web/output/journal-entry-12/index.html deleted file mode 100644 index 3b6c98f..0000000 --- a/web/output/journal-entry-12/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

The paranoia is really starting to set in. I can't trust anyone, not even myself. I keep having these vivid nightmares and I'm starting to lose track of what's real and what's just my imagination. I'm afraid that if I stay here much longer, I'll never be able to leave. I've decided to leave the village tomorrow. I don't care if I never figure out what's really going on here. I just want to get as far away from this place as possible. I packed my bags this afternoon, and when I opened my door to leave, I found a blue-eyed donkey standing outside. It just stared at me with those piercing blue eyes...

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-13/index.html b/web/output/journal-entry-13/index.html deleted file mode 100644 index 96dd2f9..0000000 --- a/web/output/journal-entry-13/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

The Prophet's cave holds the key to unlocking the mysteries of this land. I can feel his presence all around me, a guiding force that leads me closer to my goal. The whispers of the wind seem to carry his words, and I know that I am on the right path. It was as if the very cave itself was a musical instrument, waiting to be played. The Prophet's words echoed off the walls like a symphony, and I couldn't help but feel like I was part of his grand composition. It was a tune that I couldn't get out of my head, a melody that danced through the caves and into my soul.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-14/index.html b/web/output/journal-entry-14/index.html deleted file mode 100644 index 7687374..0000000 --- a/web/output/journal-entry-14/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

I delved deep into the thorn-laden thicket, my mind ablaze with the key that glimmered in my hand. The path twisted and turned like a demented serpent, the air grew thick and syrupy, like molasses infused with the scent of ancient secrets. And then, there he was. Sunday, the prophet of madness, stood before me, surrounded by his infernal machines and writhing in a fevered frenzy. I could feel the music coursing through my veins, like a thousand serpents uncoiling in a never-ending dance. It spoke to me in tongues unknown, and I felt my mind unraveling like a ball of yarn caught in a hurricane. And then, in a blinding flash of light and sound, the world was reborn in a symphony of chaos and destruction.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-15/index.html b/web/output/journal-entry-15/index.html deleted file mode 100644 index 33cc87b..0000000 --- a/web/output/journal-entry-15/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

I need to leave this place, but I fear I won't make it out alive. They are everywhere, and I don't know who I can trust. Even my own mind feels like it's turning against me, taunting me with visions of things I can't explain. I need to find a way out, but it feels like I'm trapped in a nightmare. I must leave. I must escape. I must run. I must forget. I must burn this journal. I must burn this memory. I must burn this music. I must burn this reality. I must burn myself. I must be reborn. I must be free.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-4/index.html b/web/output/journal-entry-4/index.html deleted file mode 100644 index 7a27aa1..0000000 --- a/web/output/journal-entry-4/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

The festival of the Golden Calf is approaching, and the whole town is buzzing with anticipation. People are putting up decorations and practicing music for the big day. I can feel the excitement building, but I'm not sure what to expect. The cultists seem to be especially fervent this year, and they've been constructing an elaborate shrine in the town square. I can't help but wonder what it means for the town and its people.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-5/index.html b/web/output/journal-entry-5/index.html deleted file mode 100644 index 7952304..0000000 --- a/web/output/journal-entry-5/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

Last night I had a nightmare about a donkey with blue eyes. In the dream, he was leading me through a maze of underground caves, but every time I looked back, the tunnels had shifted and I couldn't find my way back. Suddenly, I woke up with a start, convinced that someone or something was in my room. But when I turned on the light, there was nothing there. Maybe it was just my mind playing tricks on me.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-6/index.html b/web/output/journal-entry-6/index.html deleted file mode 100644 index 076dc55..0000000 --- a/web/output/journal-entry-6/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

I met Sunday today, and he's a strange fellow. He's fascinated by musical machines and their ability to manipulate reality. He spoke about how music can influence the world and change the way we perceive things. Although I couldn't follow everything he said, I found myself captivated by his words. There's something odd about him, though. I can't help feeling like he's not entirely human.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-7/index.html b/web/output/journal-entry-7/index.html deleted file mode 100644 index f52c62f..0000000 --- a/web/output/journal-entry-7/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

I ventured deep into one of the caves that dot this place. Its twisting tunnels and cavernous halls seem to have no end, and I feel like I've been wandering for hours. The musty air is thick with dust and the scent of damp earth, and the walls are slick with moss and lichen. It's as if the very rocks themselves are alive and breathing. As I explored further, I heard strange echoes and whispers, and the sound of footsteps coming from far away. I'm starting to wonder if I'm the only one down here, or if something else is lurking in the darkness.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-8/index.html b/web/output/journal-entry-8/index.html deleted file mode 100644 index d8e1a1e..0000000 --- a/web/output/journal-entry-8/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

I met a man today who calls himself the Blue-Eyed Donkey. He was cooking an omelet with a pigeon's egg on a British kerosene stove. He ate it with gusto, but he refused to speak to me. I could see the fear in his eyes. It's strange how guarded some people are in this town. The people here are peculiar. They act in mysterious ways, like they're hiding something. It's unsettling, but also intriguing. I can't help but wonder what secrets this place holds.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/journal-entry-9/index.html b/web/output/journal-entry-9/index.html deleted file mode 100644 index f4b374a..0000000 --- a/web/output/journal-entry-9/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - -
-
-

As I delve deeper into the world of Dada, I can't help but notice the striking similarities between the movement and the strange occurrences in this town. The absurdity and chaos, the rejection of societal norms and values, the questioning of reality itself -- all of it seems to be reflected in the bizarre events that I've witnessed. It's almost as if the Dadaists were prophesying what was to come. And yet, I can't shake the feeling that there's something deeper, something more sinister at play. Is it possible that this is all part of a grand scheme, orchestrated by some unseen force? The more I learn, I'm starting to wonder if there's more to this than just my imagination.

-
-
- - - - - \ No newline at end of file diff --git a/web/output/projects/blue-eyed-donkey.gpx b/web/output/projects/blue-eyed-donkey.gpx deleted file mode 100644 index ff53056..0000000 --- a/web/output/projects/blue-eyed-donkey.gpx +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - Journal Entry 1 - - - Journal Entry 2 - - - Journal Entry 3 - - diff --git a/web/output/projects/blue-eyed-donkey.kml b/web/output/projects/blue-eyed-donkey.kml deleted file mode 100644 index 142ff79..0000000 --- a/web/output/projects/blue-eyed-donkey.kml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Blue Eyed Donkey - - Journal Entry 1 - - 34.9805500394171,32.70124169424201 - - - - Journal Entry 2 - - 34.98304356695975,32.699615286072735 - - - - Journal Entry 3 - - 34.985554114475526,32.70003059472479 - - - - - diff --git a/web/output/projects/blue-eyed-donkey/index.html b/web/output/projects/blue-eyed-donkey/index.html deleted file mode 100644 index 7826d8a..0000000 --- a/web/output/projects/blue-eyed-donkey/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - Blue Eyed Donkey - - - - - - - - - - -
- - - \ No newline at end of file diff --git a/web/output/projects/index.html b/web/output/projects/index.html deleted file mode 100644 index 5dd8c41..0000000 --- a/web/output/projects/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/web/output/projects/testing.gpx b/web/output/projects/testing.gpx deleted file mode 100644 index 4b983db..0000000 --- a/web/output/projects/testing.gpx +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - Test - - diff --git a/web/output/projects/testing.kml b/web/output/projects/testing.kml deleted file mode 100644 index fa0eec1..0000000 --- a/web/output/projects/testing.kml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Testing - - Test - - 34.972507850461874,32.70194460092584 - - - - - diff --git a/web/output/projects/testing/index.html b/web/output/projects/testing/index.html deleted file mode 100644 index 165d00e..0000000 --- a/web/output/projects/testing/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - Testing - - - - - - - - - - -
- - - \ No newline at end of file diff --git a/web/output/svbf5c4nwkr/index.html b/web/output/svbf5c4nwkr/index.html deleted file mode 100644 index aa308fc..0000000 --- a/web/output/svbf5c4nwkr/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - -
-
-

As I wandered through the museum today, I stumbled upon a hidden room tucked away in a corner. It was like nothing I'd ever seen before. The air was heavy with the scent of wood and brass, and strange instruments and machines filled the room. Pipes and horns seemed to sprout from the walls like metallic vines, and the organs were unlike any I'd ever laid eyes on, with keyboards sprouting in every direction. As I explored further, I found boxes adorned with mysterious levers and knobs that seemed to emit a cacophony of otherworldly sounds. It was as though I had stumbled into the secret workshop of a mad scientist.

- Map -
-
- - - - - \ No newline at end of file diff --git a/web/output/svbfh0cc5fp/index.html b/web/output/svbfh0cc5fp/index.html deleted file mode 100644 index d64ec20..0000000 --- a/web/output/svbfh0cc5fp/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - -
-
-

I spent the day exploring the town and stumbled upon an old, abandoned house. Inside, I found a collection of paintings that immediately caught my eye. They were unlike anything I had ever seen before, with bold colors and abstract shapes. I later learned that the artist who painted them was an Austrian painter who had worked as a traffic warden in the early days of the country. Her eccentricity was well-known among the locals, and it's said that she inspired Sunday, one of the founders of the town, in his own artistic pursuits. It's a shame that her work has been forgotten and left to decay in this abandoned house.

- Map -
-
- - - - - \ No newline at end of file diff --git a/web/output/svbfh0geqrx/index.html b/web/output/svbfh0geqrx/index.html deleted file mode 100644 index 95a676f..0000000 --- a/web/output/svbfh0geqrx/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - -
-
-

As I wandered through the museum today, I stumbled upon a hidden room tucked away in a corner. It was like nothing I'd ever seen before. The air was heavy with the scent of wood and brass, and strange instruments and machines filled the room. Pipes and horns seemed to sprout from the walls like metallic vines, and the organs were unlike any I'd ever laid eyes on, with keyboards sprouting in every direction. As I explored further, I found boxes adorned with mysterious levers and knobs that seemed to emit a cacophony of otherworldly sounds. It was as though I had stumbled into the secret workshop of a mad scientist.

- Map -
-
- - - - - \ No newline at end of file diff --git a/web/output/svbfh1049ck/index.html b/web/output/svbfh1049ck/index.html deleted file mode 100644 index 76a6646..0000000 --- a/web/output/svbfh1049ck/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - -
-
-

I noticed a peculiar sensation in the air as soon as I arrived in town. It was as if an electric charge was coursing through the air beneath the pastoral tranquillity, making me nervous. I looked around, but there was no one to be found. The faint odor of decay lingered around me, mingled with the sweet fragrance of incense. The mix made me feel uneasy, like if I'd stepped into a strange, surreal dream.

- Map -
-
- - - - - \ No newline at end of file diff --git a/web/output/tags/index.html b/web/output/tags/index.html deleted file mode 100644 index 783fa5f..0000000 --- a/web/output/tags/index.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - -
- - -
-
-

- svbfh1049ck -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- svbfh0cc5fp -

- -
-
- -
-
-

- svbfh0geqrx -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- -

- -
-
- -
-
-

- svbf5c4nwkr -

- -
-
- -
- - - - - \ No newline at end of file diff --git a/web/output/tags/list.html b/web/output/tags/list.html deleted file mode 100644 index ae2ae2b..0000000 --- a/web/output/tags/list.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - -
- - -
-
-

- Blue Eyed Donkey: Journal Entry 1 - [svbfh1049ck] -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 10 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 11 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 12 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 13 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 14 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 15 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 2 - [svbfh0cc5fp] -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 3 - [svbfh0geqrx] -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 4 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 5 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 6 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 7 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 8 -

- -
-
- -
-
-

- Blue Eyed Donkey: Journal Entry 9 -

- -
-
- -
-
-

- Testing: Test - [svbf5c4nwkr] -

- -
-
- -
- - - - - \ No newline at end of file diff --git a/web/output/theme/DavidLibre-Regular.woff b/web/output/theme/DavidLibre-Regular.woff deleted file mode 100644 index 679b6a3..0000000 Binary files a/web/output/theme/DavidLibre-Regular.woff and /dev/null differ diff --git a/web/output/theme/bluedot.svg b/web/output/theme/bluedot.svg deleted file mode 100644 index 38bf264..0000000 --- a/web/output/theme/bluedot.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/web/output/theme/geo.js b/web/output/theme/geo.js deleted file mode 100644 index c074e1f..0000000 --- a/web/output/theme/geo.js +++ /dev/null @@ -1,19 +0,0 @@ -const ua = String(platform.os).toLowerCase(); -const android = ua.indexOf("android") > -1; -const ios = ua.indexOf("ios") > -1; -const windows = ua.indexOf("windows") > -1; -const linux = ua.indexOf("linux") > -1; -const mac = ua.indexOf("macos") > -1; -var hashlinks = document.querySelectorAll('[href*="geo:"]'); -var hasharray = [...hashlinks]; -if ( hasharray.length > 0 ) { - hasharray.forEach(hashlink => { - const geolink = hashlink.getAttribute("href").match(/(-?\d+(\.\d+)?),\s*(-?\d+(\.\d+)?)/g); - var latlon; - if ( geolink.length > 1 && geolink[0] == '0,0') latlon = geolink[1]; - else latlon = geolink[0]; - if ( windows || mac || linux ) hashlink.href = "https://maps.google.com/?q=" + latlon; - else if ( android ) hashlink.href = "geo:0,0?q=" + latlon; - else if ( ios ) hashlink.href = "http://maps.apple.com/?ll=" + latlon + "&q=" + hashlink.innerHTML; - }); -} \ No newline at end of file diff --git a/web/output/theme/local.css b/web/output/theme/local.css deleted file mode 100644 index 4d5de2d..0000000 --- a/web/output/theme/local.css +++ /dev/null @@ -1,172 +0,0 @@ -@font-face { - font-family: 'David Libre'; - src: local('David Libre'), local('DavidLibre'), - url('DavidLibre-Regular.woff') format('woff') -} - -/* CSS Reset */ -html { - margin: 0; - padding: 0; - text-align: left; - text-rendering: optimizeLegibility; -} - -/* HTML5 tag defaults. */ -header, footer, aside, nav, article -{ - display: block; -} - -h1, h2, h3, h4, h5 { - margin-block-start: 0; - font-weight: normal; - text-align: left; - font-size: 1em; -} - -body { - font-family: 'David Libre'; - padding: 1em; - font-size: 1.4em; - line-height: 1.2em; - text-align: left; - color: #090A0E; - height: 100vh; - overflow-x: hidden; - overflow-y: hidden; - margin: auto; - max-width: 40em; -} - -p { - margin-block-start: 0; -} - -ul, ul li { - margin:0; - padding:0; - list-style:none -} - -ul li::before { - content: '*\00a0'; -} - -/* Use a thin border around all images. */ -img -{ - border: 1px solid; - max-width: 40em; - width: 100%; -} - -/* Navigation bar. */ -nav -{ - padding-bottom: 1ex; - margin-bottom: 4em; -} - -nav::after { - clear:left; -} - -nav ul -{ - padding: 0; - margin-left: 0; - list-style: none; -} - -nav ul li -{ - display: inline; - float: left; - margin-right: .4em; /* How far between items. */ - margin-top: .3em; -} - -nav li::before { - content: none; -} - -nav ul li a -{ - display: inline; - margin: 0; -} - -/* - * Use a border around tables, but don't draw lines around individual - * cells. - */ -table -{ - border-style: solid; - border-collapse: collapse; - border-width: thin; - font-size: 100%; -} - -th, td -{ - border-style: solid; - border-width: thin; -} - -a { - border-bottom: 1px solid #090A0E; -} - -/* for unvisited links: blue */ -a:link -{ - text-decoration: none; -} - -/* for visited links: purple */ -a:visited -{ - text-decoration: none; -} - -/* when mouse is over link or the link is active*/ -a:hover, a:active -{ - text-decoration: none; -} - -blockquote { - border: 1px solid; - margin: 0; - padding-left: 1em; -} - -#map { - height: 100%; - width: 100vw; -} - -#map img { - border: none -} - -.info { - padding: 6px 8px; - background: white; - background: rgba(255,255,255,0.8); - box-shadow: 0 0 15px rgba(0,0,0,0.2); - border-radius: 5px; -} - -.info h4 { - font-size: 1.6em; - margin: 0 0 5px; - color: #777; -} - -.info span { - line-height: 18px; - vertical-align: top; -} \ No newline at end of file diff --git a/web/output/theme/map.js b/web/output/theme/map.js deleted file mode 100644 index aa1bcab..0000000 --- a/web/output/theme/map.js +++ /dev/null @@ -1,82 +0,0 @@ -var bluedot = L.icon({ - iconUrl: '/theme/bluedot.svg', - iconSize: [18, 18], - iconAnchor: [9, 9], - popupAnchor: [0, -10] -}); - -var nfctag = L.icon({ - iconUrl: '/theme/nfclogo.svg', - iconSize: [20, 20], - iconAnchor: [10, 10], - popupAnchor: [0, -12] -}); - -const showNfcTags = L.geoJSON(nfcTags, { - pointToLayer(feature, latlng) { return L.marker(latlng, { icon: nfctag });}, - onEachFeature -}); - -const map = L.map('map').fitBounds(showNfcTags.getBounds()); - -const tiles = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { - maxZoom: 19, - attribution: '© OpenStreetMap' -}).addTo(map); - -showNfcTags.addTo(map); -map.on('locationfound', onLocationFound); -map.on('locationerror', onLocationError); -map.locate({setView: false, watch: true}); - -function onEachFeature(feature, layer) { - let popupContent = ``; - - if (feature.properties && feature.properties.title) { - popupContent += feature.properties.title; - } - - layer.bindPopup(popupContent); -} - -var locationMarker, locationCircle; -pageload = true; - -function onLocationFound(e) { - if (locationMarker) { - map.removeLayer(locationMarker); - map.removeLayer(locationCircle); - } - const radius = e.accuracy / 2; - if ( pageload ) { - area = showNfcTags.getBounds(); - area.extend(e.latlng); - map.fitBounds(area); - map.zoomOut(1, {animate: false}); - pageload = false; - } - locationMarker = L.marker(e.latlng, {icon: bluedot}).addTo(map) - locationCircle = L.circle(e.latlng, radius).addTo(map); -} - -function onLocationError(e) { - alert(e.message); -} - -var info = L.control({position: 'topright'}); -var download = L.control({position: 'bottomleft'}); - -info.onAdd = function (map) { - this._div = L.DomUtil.create('div', 'info'); // create a div with a class "info" - this._div.innerHTML = '

' + nfcTags["title"] + '

' + ' NFC Tag Locations'; - return this._div; -}; - -download.onAdd = function (map) { - this._div = L.DomUtil.create('div', 'info'); // create a div with a class "info" - this._div.innerHTML = 'Download GPX KML'; - return this._div; -}; - -info.addTo(map); -download.addTo(map); \ No newline at end of file diff --git a/web/output/theme/nfclogo.svg b/web/output/theme/nfclogo.svg deleted file mode 100644 index 62be6ba..0000000 --- a/web/output/theme/nfclogo.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - diff --git a/web/output/theme/platform.js b/web/output/theme/platform.js deleted file mode 100644 index 0f2a9ad..0000000 --- a/web/output/theme/platform.js +++ /dev/null @@ -1,1260 +0,0 @@ -/*! - * Platform.js - * Copyright 2014-2020 Benjamin Tan - * Copyright 2011-2013 John-David Dalton - * Available under MIT license - */ -;(function() { - 'use strict'; - - /** Used to determine if values are of the language type `Object`. */ - var objectTypes = { - 'function': true, - 'object': true - }; - - /** Used as a reference to the global object. */ - var root = (objectTypes[typeof window] && window) || this; - - /** Backup possible global object. */ - var oldRoot = root; - - /** Detect free variable `exports`. */ - var freeExports = objectTypes[typeof exports] && exports; - - /** Detect free variable `module`. */ - var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; - - /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */ - var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; - if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) { - root = freeGlobal; - } - - /** - * Used as the maximum length of an array-like object. - * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength) - * for more details. - */ - var maxSafeInteger = Math.pow(2, 53) - 1; - - /** Regular expression to detect Opera. */ - var reOpera = /\bOpera/; - - /** Possible global object. */ - var thisBinding = this; - - /** Used for native method references. */ - var objectProto = Object.prototype; - - /** Used to check for own properties of an object. */ - var hasOwnProperty = objectProto.hasOwnProperty; - - /** Used to resolve the internal `[[Class]]` of values. */ - var toString = objectProto.toString; - - /*--------------------------------------------------------------------------*/ - - /** - * Capitalizes a string value. - * - * @private - * @param {string} string The string to capitalize. - * @returns {string} The capitalized string. - */ - function capitalize(string) { - string = String(string); - return string.charAt(0).toUpperCase() + string.slice(1); - } - - /** - * A utility function to clean up the OS name. - * - * @private - * @param {string} os The OS name to clean up. - * @param {string} [pattern] A `RegExp` pattern matching the OS name. - * @param {string} [label] A label for the OS. - */ - function cleanupOS(os, pattern, label) { - // Platform tokens are defined at: - // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx - // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx - var data = { - '10.0': '10', - '6.4': '10 Technical Preview', - '6.3': '8.1', - '6.2': '8', - '6.1': 'Server 2008 R2 / 7', - '6.0': 'Server 2008 / Vista', - '5.2': 'Server 2003 / XP 64-bit', - '5.1': 'XP', - '5.01': '2000 SP1', - '5.0': '2000', - '4.0': 'NT', - '4.90': 'ME' - }; - // Detect Windows version from platform tokens. - if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) && - (data = data[/[\d.]+$/.exec(os)])) { - os = 'Windows ' + data; - } - // Correct character case and cleanup string. - os = String(os); - - if (pattern && label) { - os = os.replace(RegExp(pattern, 'i'), label); - } - - os = format( - os.replace(/ ce$/i, ' CE') - .replace(/\bhpw/i, 'web') - .replace(/\bMacintosh\b/, 'Mac OS') - .replace(/_PowerPC\b/i, ' OS') - .replace(/\b(OS X) [^ \d]+/i, '$1') - .replace(/\bMac (OS X)\b/, '$1') - .replace(/\/(\d)/, ' $1') - .replace(/_/g, '.') - .replace(/(?: BePC|[ .]*fc[ \d.]+)$/i, '') - .replace(/\bx86\.64\b/gi, 'x86_64') - .replace(/\b(Windows Phone) OS\b/, '$1') - .replace(/\b(Chrome OS \w+) [\d.]+\b/, '$1') - .split(' on ')[0] - ); - - return os; - } - - /** - * An iteration utility for arrays and objects. - * - * @private - * @param {Array|Object} object The object to iterate over. - * @param {Function} callback The function called per iteration. - */ - function each(object, callback) { - var index = -1, - length = object ? object.length : 0; - - if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) { - while (++index < length) { - callback(object[index], index, object); - } - } else { - forOwn(object, callback); - } - } - - /** - * Trim and conditionally capitalize string values. - * - * @private - * @param {string} string The string to format. - * @returns {string} The formatted string. - */ - function format(string) { - string = trim(string); - return /^(?:webOS|i(?:OS|P))/.test(string) - ? string - : capitalize(string); - } - - /** - * Iterates over an object's own properties, executing the `callback` for each. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} callback The function executed per own property. - */ - function forOwn(object, callback) { - for (var key in object) { - if (hasOwnProperty.call(object, key)) { - callback(object[key], key, object); - } - } - } - - /** - * Gets the internal `[[Class]]` of a value. - * - * @private - * @param {*} value The value. - * @returns {string} The `[[Class]]`. - */ - function getClassOf(value) { - return value == null - ? capitalize(value) - : toString.call(value).slice(8, -1); - } - - /** - * Host objects can return type values that are different from their actual - * data type. The objects we are concerned with usually return non-primitive - * types of "object", "function", or "unknown". - * - * @private - * @param {*} object The owner of the property. - * @param {string} property The property to check. - * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`. - */ - function isHostType(object, property) { - var type = object != null ? typeof object[property] : 'number'; - return !/^(?:boolean|number|string|undefined)$/.test(type) && - (type == 'object' ? !!object[property] : true); - } - - /** - * Prepares a string for use in a `RegExp` by making hyphens and spaces optional. - * - * @private - * @param {string} string The string to qualify. - * @returns {string} The qualified string. - */ - function qualify(string) { - return String(string).replace(/([ -])(?!$)/g, '$1?'); - } - - /** - * A bare-bones `Array#reduce` like utility function. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} callback The function called per iteration. - * @returns {*} The accumulated result. - */ - function reduce(array, callback) { - var accumulator = null; - each(array, function(value, index) { - accumulator = callback(accumulator, value, index, array); - }); - return accumulator; - } - - /** - * Removes leading and trailing whitespace from a string. - * - * @private - * @param {string} string The string to trim. - * @returns {string} The trimmed string. - */ - function trim(string) { - return String(string).replace(/^ +| +$/g, ''); - } - - /*--------------------------------------------------------------------------*/ - - /** - * Creates a new platform object. - * - * @memberOf platform - * @param {Object|string} [ua=navigator.userAgent] The user agent string or - * context object. - * @returns {Object} A platform object. - */ - function parse(ua) { - - /** The environment context object. */ - var context = root; - - /** Used to flag when a custom context is provided. */ - var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String'; - - // Juggle arguments. - if (isCustomContext) { - context = ua; - ua = null; - } - - /** Browser navigator object. */ - var nav = context.navigator || {}; - - /** Browser user agent string. */ - var userAgent = nav.userAgent || ''; - - ua || (ua = userAgent); - - /** Used to flag when `thisBinding` is the [ModuleScope]. */ - var isModuleScope = isCustomContext || thisBinding == oldRoot; - - /** Used to detect if browser is like Chrome. */ - var likeChrome = isCustomContext - ? !!nav.likeChrome - : /\bChrome\b/.test(ua) && !/internal|\n/i.test(toString.toString()); - - /** Internal `[[Class]]` value shortcuts. */ - var objectClass = 'Object', - airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject', - enviroClass = isCustomContext ? objectClass : 'Environment', - javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java), - phantomClass = isCustomContext ? objectClass : 'RuntimeObject'; - - /** Detect Java environments. */ - var java = /\bJava/.test(javaClass) && context.java; - - /** Detect Rhino. */ - var rhino = java && getClassOf(context.environment) == enviroClass; - - /** A character to represent alpha. */ - var alpha = java ? 'a' : '\u03b1'; - - /** A character to represent beta. */ - var beta = java ? 'b' : '\u03b2'; - - /** Browser document object. */ - var doc = context.document || {}; - - /** - * Detect Opera browser (Presto-based). - * http://www.howtocreate.co.uk/operaStuff/operaObject.html - * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini - */ - var opera = context.operamini || context.opera; - - /** Opera `[[Class]]`. */ - var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera)) - ? operaClass - : (opera = null); - - /*------------------------------------------------------------------------*/ - - /** Temporary variable used over the script's lifetime. */ - var data; - - /** The CPU architecture. */ - var arch = ua; - - /** Platform description array. */ - var description = []; - - /** Platform alpha/beta indicator. */ - var prerelease = null; - - /** A flag to indicate that environment features should be used to resolve the platform. */ - var useFeatures = ua == userAgent; - - /** The browser/environment version. */ - var version = useFeatures && opera && typeof opera.version == 'function' && opera.version(); - - /** A flag to indicate if the OS ends with "/ Version" */ - var isSpecialCasedOS; - - /* Detectable layout engines (order is important). */ - var layout = getLayout([ - { 'label': 'EdgeHTML', 'pattern': 'Edge' }, - 'Trident', - { 'label': 'WebKit', 'pattern': 'AppleWebKit' }, - 'iCab', - 'Presto', - 'NetFront', - 'Tasman', - 'KHTML', - 'Gecko' - ]); - - /* Detectable browser names (order is important). */ - var name = getName([ - 'Adobe AIR', - 'Arora', - 'Avant Browser', - 'Breach', - 'Camino', - 'Electron', - 'Epiphany', - 'Fennec', - 'Flock', - 'Galeon', - 'GreenBrowser', - 'iCab', - 'Iceweasel', - 'K-Meleon', - 'Konqueror', - 'Lunascape', - 'Maxthon', - { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' }, - 'Midori', - 'Nook Browser', - 'PaleMoon', - 'PhantomJS', - 'Raven', - 'Rekonq', - 'RockMelt', - { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' }, - 'SeaMonkey', - { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, - 'Sleipnir', - 'SlimBrowser', - { 'label': 'SRWare Iron', 'pattern': 'Iron' }, - 'Sunrise', - 'Swiftfox', - 'Vivaldi', - 'Waterfox', - 'WebPositive', - { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' }, - { 'label': 'UC Browser', 'pattern': 'UCBrowser' }, - 'Opera Mini', - { 'label': 'Opera Mini', 'pattern': 'OPiOS' }, - 'Opera', - { 'label': 'Opera', 'pattern': 'OPR' }, - 'Chromium', - 'Chrome', - { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' }, - { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' }, - { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' }, - { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' }, - { 'label': 'IE', 'pattern': 'IEMobile' }, - { 'label': 'IE', 'pattern': 'MSIE' }, - 'Safari' - ]); - - /* Detectable products (order is important). */ - var product = getProduct([ - { 'label': 'BlackBerry', 'pattern': 'BB10' }, - 'BlackBerry', - { 'label': 'Galaxy S', 'pattern': 'GT-I9000' }, - { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' }, - { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' }, - { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' }, - { 'label': 'Galaxy S5', 'pattern': 'SM-G900' }, - { 'label': 'Galaxy S6', 'pattern': 'SM-G920' }, - { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' }, - { 'label': 'Galaxy S7', 'pattern': 'SM-G930' }, - { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' }, - 'Google TV', - 'Lumia', - 'iPad', - 'iPod', - 'iPhone', - 'Kindle', - { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, - 'Nexus', - 'Nook', - 'PlayBook', - 'PlayStation Vita', - 'PlayStation', - 'TouchPad', - 'Transformer', - { 'label': 'Wii U', 'pattern': 'WiiU' }, - 'Wii', - 'Xbox One', - { 'label': 'Xbox 360', 'pattern': 'Xbox' }, - 'Xoom' - ]); - - /* Detectable manufacturers. */ - var manufacturer = getManufacturer({ - 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 }, - 'Alcatel': {}, - 'Archos': {}, - 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 }, - 'Asus': { 'Transformer': 1 }, - 'Barnes & Noble': { 'Nook': 1 }, - 'BlackBerry': { 'PlayBook': 1 }, - 'Google': { 'Google TV': 1, 'Nexus': 1 }, - 'HP': { 'TouchPad': 1 }, - 'HTC': {}, - 'Huawei': {}, - 'Lenovo': {}, - 'LG': {}, - 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 }, - 'Motorola': { 'Xoom': 1 }, - 'Nintendo': { 'Wii U': 1, 'Wii': 1 }, - 'Nokia': { 'Lumia': 1 }, - 'Oppo': {}, - 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 }, - 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 }, - 'Xiaomi': { 'Mi': 1, 'Redmi': 1 } - }); - - /* Detectable operating systems (order is important). */ - var os = getOS([ - 'Windows Phone', - 'KaiOS', - 'Android', - 'CentOS', - { 'label': 'Chrome OS', 'pattern': 'CrOS' }, - 'Debian', - { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' }, - 'Fedora', - 'FreeBSD', - 'Gentoo', - 'Haiku', - 'Kubuntu', - 'Linux Mint', - 'OpenBSD', - 'Red Hat', - 'SuSE', - 'Ubuntu', - 'Xubuntu', - 'Cygwin', - 'Symbian OS', - 'hpwOS', - 'webOS ', - 'webOS', - 'Tablet OS', - 'Tizen', - 'Linux', - 'Mac OS X', - 'Macintosh', - 'Mac', - 'Windows 98;', - 'Windows ' - ]); - - /*------------------------------------------------------------------------*/ - - /** - * Picks the layout engine from an array of guesses. - * - * @private - * @param {Array} guesses An array of guesses. - * @returns {null|string} The detected layout engine. - */ - function getLayout(guesses) { - return reduce(guesses, function(result, guess) { - return result || RegExp('\\b' + ( - guess.pattern || qualify(guess) - ) + '\\b', 'i').exec(ua) && (guess.label || guess); - }); - } - - /** - * Picks the manufacturer from an array of guesses. - * - * @private - * @param {Array} guesses An object of guesses. - * @returns {null|string} The detected manufacturer. - */ - function getManufacturer(guesses) { - return reduce(guesses, function(result, value, key) { - // Lookup the manufacturer by product or scan the UA for the manufacturer. - return result || ( - value[product] || - value[/^[a-z]+(?: +[a-z]+\b)*/i.exec(product)] || - RegExp('\\b' + qualify(key) + '(?:\\b|\\w*\\d)', 'i').exec(ua) - ) && key; - }); - } - - /** - * Picks the browser name from an array of guesses. - * - * @private - * @param {Array} guesses An array of guesses. - * @returns {null|string} The detected browser name. - */ - function getName(guesses) { - return reduce(guesses, function(result, guess) { - return result || RegExp('\\b' + ( - guess.pattern || qualify(guess) - ) + '\\b', 'i').exec(ua) && (guess.label || guess); - }); - } - - /** - * Picks the OS name from an array of guesses. - * - * @private - * @param {Array} guesses An array of guesses. - * @returns {null|string} The detected OS name. - */ - function getOS(guesses) { - return reduce(guesses, function(result, guess) { - var pattern = guess.pattern || qualify(guess); - if (!result && (result = - RegExp('\\b' + pattern + '(?:/[\\d.]+|[ \\w.]*)', 'i').exec(ua) - )) { - result = cleanupOS(result, pattern, guess.label || guess); - } - return result; - }); - } - - /** - * Picks the product name from an array of guesses. - * - * @private - * @param {Array} guesses An array of guesses. - * @returns {null|string} The detected product name. - */ - function getProduct(guesses) { - return reduce(guesses, function(result, guess) { - var pattern = guess.pattern || qualify(guess); - if (!result && (result = - RegExp('\\b' + pattern + ' *\\d+[.\\w_]*', 'i').exec(ua) || - RegExp('\\b' + pattern + ' *\\w+-[\\w]*', 'i').exec(ua) || - RegExp('\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\d+|[^ ();-]*)', 'i').exec(ua) - )) { - // Split by forward slash and append product version if needed. - if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\d.]+/.test(result[0])) { - result[0] += ' ' + result[1]; - } - // Correct character case and cleanup string. - guess = guess.label || guess; - result = format(result[0] - .replace(RegExp(pattern, 'i'), guess) - .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ') - .replace(RegExp('(' + guess + ')[-_.]?(\\w)', 'i'), '$1 $2')); - } - return result; - }); - } - - /** - * Resolves the version using an array of UA patterns. - * - * @private - * @param {Array} patterns An array of UA patterns. - * @returns {null|string} The detected version. - */ - function getVersion(patterns) { - return reduce(patterns, function(result, pattern) { - return result || (RegExp(pattern + - '(?:-[\\d.]+/|(?: for [\\w-]+)?[ /-])([\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null; - }); - } - - /** - * Returns `platform.description` when the platform object is coerced to a string. - * - * @name toString - * @memberOf platform - * @returns {string} Returns `platform.description` if available, else an empty string. - */ - function toStringPlatform() { - return this.description || ''; - } - - /*------------------------------------------------------------------------*/ - - // Convert layout to an array so we can add extra details. - layout && (layout = [layout]); - - // Detect Android products. - // Browsers on Android devices typically provide their product IDS after "Android;" - // up to "Build" or ") AppleWebKit". - // Example: - // "Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36 - // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36" - if (/\bAndroid\b/.test(os) && !product && - (data = /\bAndroid[^;]*;(.*?)(?:Build|\) AppleWebKit)\b/i.exec(ua))) { - product = trim(data[1]) - // Replace any language codes (eg. "en-US"). - .replace(/^[a-z]{2}-[a-z]{2};\s*/i, '') - || null; - } - // Detect product names that contain their manufacturer's name. - if (manufacturer && !product) { - product = getProduct([manufacturer]); - } else if (manufacturer && product) { - product = product - .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\s]', 'i'), manufacturer + ' ') - .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\w)', 'i'), manufacturer + ' $2'); - } - // Clean up Google TV. - if ((data = /\bGoogle TV\b/.exec(product))) { - product = data[0]; - } - // Detect simulators. - if (/\bSimulator\b/i.test(ua)) { - product = (product ? product + ' ' : '') + 'Simulator'; - } - // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS. - if (name == 'Opera Mini' && /\bOPiOS\b/.test(ua)) { - description.push('running in Turbo/Uncompressed mode'); - } - // Detect IE Mobile 11. - if (name == 'IE' && /\blike iPhone OS\b/.test(ua)) { - data = parse(ua.replace(/like iPhone OS/, '')); - manufacturer = data.manufacturer; - product = data.product; - } - // Detect iOS. - else if (/^iP/.test(product)) { - name || (name = 'Safari'); - os = 'iOS' + ((data = / OS ([\d_]+)/i.exec(ua)) - ? ' ' + data[1].replace(/_/g, '.') - : ''); - } - // Detect Kubuntu. - else if (name == 'Konqueror' && /^Linux\b/i.test(os)) { - os = 'Kubuntu'; - } - // Detect Android browsers. - else if ((manufacturer && manufacturer != 'Google' && - ((/Chrome/.test(name) && !/\bMobile Safari\b/i.test(ua)) || /\bVita\b/.test(product))) || - (/\bAndroid\b/.test(os) && /^Chrome/.test(name) && /\bVersion\//i.test(ua))) { - name = 'Android Browser'; - os = /\bAndroid\b/.test(os) ? os : 'Android'; - } - // Detect Silk desktop/accelerated modes. - else if (name == 'Silk') { - if (!/\bMobi/i.test(ua)) { - os = 'Android'; - description.unshift('desktop mode'); - } - if (/Accelerated *= *true/i.test(ua)) { - description.unshift('accelerated'); - } - } - // Detect UC Browser speed mode. - else if (name == 'UC Browser' && /\bUCWEB\b/.test(ua)) { - description.push('speed mode'); - } - // Detect PaleMoon identifying as Firefox. - else if (name == 'PaleMoon' && (data = /\bFirefox\/([\d.]+)\b/.exec(ua))) { - description.push('identifying as Firefox ' + data[1]); - } - // Detect Firefox OS and products running Firefox. - else if (name == 'Firefox' && (data = /\b(Mobile|Tablet|TV)\b/i.exec(ua))) { - os || (os = 'Firefox OS'); - product || (product = data[1]); - } - // Detect false positives for Firefox/Safari. - else if (!name || (data = !/\bMinefield\b/i.test(ua) && /\b(?:Firefox|Safari)\b/.exec(name))) { - // Escape the `/` for Firefox 1. - if (name && !product && /[\/,]|^[^(]+?\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) { - // Clear name of false positives. - name = null; - } - // Reassign a generic name. - if ((data = product || manufacturer || os) && - (product || manufacturer || /\b(?:Android|Symbian OS|Tablet OS|webOS)\b/.test(os))) { - name = /[a-z]+(?: Hat)?/i.exec(/\bAndroid\b/.test(os) ? os : data) + ' Browser'; - } - } - // Add Chrome version to description for Electron. - else if (name == 'Electron' && (data = (/\bChrome\/([\d.]+)\b/.exec(ua) || 0)[1])) { - description.push('Chromium ' + data); - } - // Detect non-Opera (Presto-based) versions (order is important). - if (!version) { - version = getVersion([ - '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\d.]+$)|UCBrowser|YaBrowser)', - 'Version', - qualify(name), - '(?:Firefox|Minefield|NetFront)' - ]); - } - // Detect stubborn layout engines. - if ((data = - layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' || - /\bOpera\b/.test(name) && (/\bOPR\b/.test(ua) ? 'Blink' : 'Presto') || - /\b(?:Midori|Nook|Safari)\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' || - !layout && /\bMSIE\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') || - layout == 'WebKit' && /\bPlayStation\b(?! Vita\b)/i.test(name) && 'NetFront' - )) { - layout = [data]; - } - // Detect Windows Phone 7 desktop mode. - if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(ua) || 0)[1])) { - name += ' Mobile'; - os = 'Windows Phone ' + (/\+$/.test(data) ? data : data + '.x'); - description.unshift('desktop mode'); - } - // Detect Windows Phone 8.x desktop mode. - else if (/\bWPDesktop\b/i.test(ua)) { - name = 'IE Mobile'; - os = 'Windows Phone 8.x'; - description.unshift('desktop mode'); - version || (version = (/\brv:([\d.]+)/.exec(ua) || 0)[1]); - } - // Detect IE 11 identifying as other browsers. - else if (name != 'IE' && layout == 'Trident' && (data = /\brv:([\d.]+)/.exec(ua))) { - if (name) { - description.push('identifying as ' + name + (version ? ' ' + version : '')); - } - name = 'IE'; - version = data[1]; - } - // Leverage environment features. - if (useFeatures) { - // Detect server-side environments. - // Rhino has a global function while others have a global object. - if (isHostType(context, 'global')) { - if (java) { - data = java.lang.System; - arch = data.getProperty('os.arch'); - os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version'); - } - if (rhino) { - try { - version = context.require('ringo/engine').version.join('.'); - name = 'RingoJS'; - } catch(e) { - if ((data = context.system) && data.global.system == context.system) { - name = 'Narwhal'; - os || (os = data[0].os || null); - } - } - if (!name) { - name = 'Rhino'; - } - } - else if ( - typeof context.process == 'object' && !context.process.browser && - (data = context.process) - ) { - if (typeof data.versions == 'object') { - if (typeof data.versions.electron == 'string') { - description.push('Node ' + data.versions.node); - name = 'Electron'; - version = data.versions.electron; - } else if (typeof data.versions.nw == 'string') { - description.push('Chromium ' + version, 'Node ' + data.versions.node); - name = 'NW.js'; - version = data.versions.nw; - } - } - if (!name) { - name = 'Node.js'; - arch = data.arch; - os = data.platform; - version = /[\d.]+/.exec(data.version); - version = version ? version[0] : null; - } - } - } - // Detect Adobe AIR. - else if (getClassOf((data = context.runtime)) == airRuntimeClass) { - name = 'Adobe AIR'; - os = data.flash.system.Capabilities.os; - } - // Detect PhantomJS. - else if (getClassOf((data = context.phantom)) == phantomClass) { - name = 'PhantomJS'; - version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch); - } - // Detect IE compatibility modes. - else if (typeof doc.documentMode == 'number' && (data = /\bTrident\/(\d+)/i.exec(ua))) { - // We're in compatibility mode when the Trident version + 4 doesn't - // equal the document mode. - version = [version, doc.documentMode]; - if ((data = +data[1] + 4) != version[1]) { - description.push('IE ' + version[1] + ' mode'); - layout && (layout[1] = ''); - version[1] = data; - } - version = name == 'IE' ? String(version[1].toFixed(1)) : version[0]; - } - // Detect IE 11 masking as other browsers. - else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\b/.test(name)) { - description.push('masking as ' + name + ' ' + version); - name = 'IE'; - version = '11.0'; - layout = ['Trident']; - os = 'Windows'; - } - os = os && format(os); - } - // Detect prerelease phases. - if (version && (data = - /(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(version) || - /(?:alpha|beta)(?: ?\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) || - /\bMinefield\b/i.test(ua) && 'a' - )) { - prerelease = /b/i.test(data) ? 'beta' : 'alpha'; - version = version.replace(RegExp(data + '\\+?$'), '') + - (prerelease == 'beta' ? beta : alpha) + (/\d+\+?/.exec(data) || ''); - } - // Detect Firefox Mobile. - if (name == 'Fennec' || name == 'Firefox' && /\b(?:Android|Firefox OS|KaiOS)\b/.test(os)) { - name = 'Firefox Mobile'; - } - // Obscure Maxthon's unreliable version. - else if (name == 'Maxthon' && version) { - version = version.replace(/\.[\d.]+/, '.x'); - } - // Detect Xbox 360 and Xbox One. - else if (/\bXbox\b/i.test(product)) { - if (product == 'Xbox 360') { - os = null; - } - if (product == 'Xbox 360' && /\bIEMobile\b/.test(ua)) { - description.unshift('mobile mode'); - } - } - // Add mobile postfix. - else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) && - (os == 'Windows CE' || /Mobi/i.test(ua))) { - name += ' Mobile'; - } - // Detect IE platform preview. - else if (name == 'IE' && useFeatures) { - try { - if (context.external === null) { - description.unshift('platform preview'); - } - } catch(e) { - description.unshift('embedded'); - } - } - // Detect BlackBerry OS version. - // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp - else if ((/\bBlackBerry\b/.test(product) || /\bBB10\b/.test(ua)) && (data = - (RegExp(product.replace(/ +/g, ' *') + '/([.\\d]+)', 'i').exec(ua) || 0)[1] || - version - )) { - data = [data, /BB10/.test(ua)]; - os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0]; - version = null; - } - // Detect Opera identifying/masking itself as another browser. - // http://www.opera.com/support/kb/view/843/ - else if (this != forOwn && product != 'Wii' && ( - (useFeatures && opera) || - (/Opera/.test(name) && /\b(?:MSIE|Firefox)\b/i.test(ua)) || - (name == 'Firefox' && /\bOS X (?:\d+\.){2,}/.test(os)) || - (name == 'IE' && ( - (os && !/^Win/.test(os) && version > 5.5) || - /\bWindows XP\b/.test(os) && version > 8 || - version == 8 && !/\bTrident\b/.test(ua) - )) - ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) { - // When "identifying", the UA contains both Opera and the other browser's name. - data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : ''); - if (reOpera.test(name)) { - if (/\bIE\b/.test(data) && os == 'Mac OS') { - os = null; - } - data = 'identify' + data; - } - // When "masking", the UA contains only the other browser's name. - else { - data = 'mask' + data; - if (operaClass) { - name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2')); - } else { - name = 'Opera'; - } - if (/\bIE\b/.test(data)) { - os = null; - } - if (!useFeatures) { - version = null; - } - } - layout = ['Presto']; - description.push(data); - } - // Detect WebKit Nightly and approximate Chrome/Safari versions. - if ((data = (/\bAppleWebKit\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { - // Correct build number for numeric comparison. - // (e.g. "532.5" becomes "532.05") - data = [parseFloat(data.replace(/\.(\d)$/, '.0$1')), data]; - // Nightly builds are postfixed with a "+". - if (name == 'Safari' && data[1].slice(-1) == '+') { - name = 'WebKit Nightly'; - prerelease = 'alpha'; - version = data[1].slice(0, -1); - } - // Clear incorrect browser versions. - else if (version == data[1] || - version == (data[2] = (/\bSafari\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { - version = null; - } - // Use the full Chrome version when available. - data[1] = (/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(ua) || 0)[1]; - // Detect Blink layout engine. - if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') { - layout = ['Blink']; - } - // Detect JavaScriptCore. - // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi - if (!useFeatures || (!likeChrome && !data[1])) { - layout && (layout[1] = 'like Safari'); - data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12'); - } else { - layout && (layout[1] = 'like Chrome'); - data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28'); - } - // Add the postfix of ".x" or "+" for approximate versions. - layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+')); - // Obscure version for some Safari 1-2 releases. - if (name == 'Safari' && (!version || parseInt(version) > 45)) { - version = data; - } else if (name == 'Chrome' && /\bHeadlessChrome/i.test(ua)) { - description.unshift('headless'); - } - } - // Detect Opera desktop modes. - if (name == 'Opera' && (data = /\bzbov|zvav$/.exec(os))) { - name += ' '; - description.unshift('desktop mode'); - if (data == 'zvav') { - name += 'Mini'; - version = null; - } else { - name += 'Mobile'; - } - os = os.replace(RegExp(' *' + data + '$'), ''); - } - // Detect Chrome desktop mode. - else if (name == 'Safari' && /\bChrome\b/.exec(layout && layout[1])) { - description.unshift('desktop mode'); - name = 'Chrome Mobile'; - version = null; - - if (/\bOS X\b/.test(os)) { - manufacturer = 'Apple'; - os = 'iOS 4.3+'; - } else { - os = null; - } - } - // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number. - else if (/\bSRWare Iron\b/.test(name) && !version) { - version = getVersion('Chrome'); - } - // Strip incorrect OS versions. - if (version && version.indexOf((data = /[\d.]+$/.exec(os))) == 0 && - ua.indexOf('/' + data + '-') > -1) { - os = trim(os.replace(data, '')); - } - // Ensure OS does not include the browser name. - if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) { - os = os.replace(RegExp(' *' + qualify(name) + ' *'), ''); - } - // Add layout engine. - if (layout && !/\b(?:Avant|Nook)\b/.test(name) && ( - /Browser|Lunascape|Maxthon/.test(name) || - name != 'Safari' && /^iOS/.test(os) && /\bSafari\b/.test(layout[1]) || - /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) { - // Don't add layout details to description if they are falsey. - (data = layout[layout.length - 1]) && description.push(data); - } - // Combine contextual information. - if (description.length) { - description = ['(' + description.join('; ') + ')']; - } - // Append manufacturer to description. - if (manufacturer && product && product.indexOf(manufacturer) < 0) { - description.push('on ' + manufacturer); - } - // Append product to description. - if (product) { - description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product); - } - // Parse the OS into an object. - if (os) { - data = / ([\d.+]+)$/.exec(os); - isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/'; - os = { - 'architecture': 32, - 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os, - 'version': data ? data[1] : null, - 'toString': function() { - var version = this.version; - return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : ''); - } - }; - } - // Add browser/OS architecture. - if ((data = /\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch)) && !/\bi686\b/i.test(arch)) { - if (os) { - os.architecture = 64; - os.family = os.family.replace(RegExp(' *' + data), ''); - } - if ( - name && (/\bWOW64\b/i.test(ua) || - (useFeatures && /\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\bWin64; x64\b/i.test(ua))) - ) { - description.unshift('32-bit'); - } - } - // Chrome 39 and above on OS X is always 64-bit. - else if ( - os && /^OS X/.test(os.family) && - name == 'Chrome' && parseFloat(version) >= 39 - ) { - os.architecture = 64; - } - - ua || (ua = null); - - /*------------------------------------------------------------------------*/ - - /** - * The platform object. - * - * @name platform - * @type Object - */ - var platform = {}; - - /** - * The platform description. - * - * @memberOf platform - * @type string|null - */ - platform.description = ua; - - /** - * The name of the browser's layout engine. - * - * The list of common layout engines include: - * "Blink", "EdgeHTML", "Gecko", "Trident" and "WebKit" - * - * @memberOf platform - * @type string|null - */ - platform.layout = layout && layout[0]; - - /** - * The name of the product's manufacturer. - * - * The list of manufacturers include: - * "Apple", "Archos", "Amazon", "Asus", "Barnes & Noble", "BlackBerry", - * "Google", "HP", "HTC", "LG", "Microsoft", "Motorola", "Nintendo", - * "Nokia", "Samsung" and "Sony" - * - * @memberOf platform - * @type string|null - */ - platform.manufacturer = manufacturer; - - /** - * The name of the browser/environment. - * - * The list of common browser names include: - * "Chrome", "Electron", "Firefox", "Firefox for iOS", "IE", - * "Microsoft Edge", "PhantomJS", "Safari", "SeaMonkey", "Silk", - * "Opera Mini" and "Opera" - * - * Mobile versions of some browsers have "Mobile" appended to their name: - * eg. "Chrome Mobile", "Firefox Mobile", "IE Mobile" and "Opera Mobile" - * - * @memberOf platform - * @type string|null - */ - platform.name = name; - - /** - * The alpha/beta release indicator. - * - * @memberOf platform - * @type string|null - */ - platform.prerelease = prerelease; - - /** - * The name of the product hosting the browser. - * - * The list of common products include: - * - * "BlackBerry", "Galaxy S4", "Lumia", "iPad", "iPod", "iPhone", "Kindle", - * "Kindle Fire", "Nexus", "Nook", "PlayBook", "TouchPad" and "Transformer" - * - * @memberOf platform - * @type string|null - */ - platform.product = product; - - /** - * The browser's user agent string. - * - * @memberOf platform - * @type string|null - */ - platform.ua = ua; - - /** - * The browser/environment version. - * - * @memberOf platform - * @type string|null - */ - platform.version = name && version; - - /** - * The name of the operating system. - * - * @memberOf platform - * @type Object - */ - platform.os = os || { - - /** - * The CPU architecture the OS is built for. - * - * @memberOf platform.os - * @type number|null - */ - 'architecture': null, - - /** - * The family of the OS. - * - * Common values include: - * "Windows", "Windows Server 2008 R2 / 7", "Windows Server 2008 / Vista", - * "Windows XP", "OS X", "Linux", "Ubuntu", "Debian", "Fedora", "Red Hat", - * "SuSE", "Android", "iOS" and "Windows Phone" - * - * @memberOf platform.os - * @type string|null - */ - 'family': null, - - /** - * The version of the OS. - * - * @memberOf platform.os - * @type string|null - */ - 'version': null, - - /** - * Returns the OS string. - * - * @memberOf platform.os - * @returns {string} The OS string. - */ - 'toString': function() { return 'null'; } - }; - - platform.parse = parse; - platform.toString = toStringPlatform; - - if (platform.version) { - description.unshift(version); - } - if (platform.name) { - description.unshift(name); - } - if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) { - description.push(product ? '(' + os + ')' : 'on ' + os); - } - if (description.length) { - platform.description = description.join(' '); - } - return platform; - } - - /*--------------------------------------------------------------------------*/ - - // Export platform. - var platform = parse(); - - // Some AMD build optimizers, like r.js, check for condition patterns like the following: - if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { - // Expose platform on the global object to prevent errors when platform is - // loaded by a script tag in the presence of an AMD loader. - // See http://requirejs.org/docs/errors.html#mismatch for more details. - root.platform = platform; - - // Define as an anonymous module so platform can be aliased through path mapping. - define(function() { - return platform; - }); - } - // Check for `exports` after `define` in case a build optimizer adds an `exports` object. - else if (freeExports && freeModule) { - // Export for CommonJS support. - forOwn(platform, function(value, key) { - freeExports[key] = value; - }); - } - else { - // Export to the global object. - root.platform = platform; - } - }.call(this)); \ No newline at end of file diff --git a/web/plugins/geodata/__pycache__/__init__.cpython-310.pyc b/web/plugins/geodata/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 51dbda6..0000000 Binary files a/web/plugins/geodata/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/web/plugins/geodata/__pycache__/geodata.cpython-310.pyc b/web/plugins/geodata/__pycache__/geodata.cpython-310.pyc deleted file mode 100644 index ad93af2..0000000 Binary files a/web/plugins/geodata/__pycache__/geodata.cpython-310.pyc and /dev/null differ diff --git a/web/plugins/geodata/__pycache__/map.cpython-310.pyc b/web/plugins/geodata/__pycache__/map.cpython-310.pyc deleted file mode 100644 index 84ac92a..0000000 Binary files a/web/plugins/geodata/__pycache__/map.cpython-310.pyc and /dev/null differ diff --git a/web/plugins/geohash/__pycache__/__init__.cpython-310.pyc b/web/plugins/geohash/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 3f07bf7..0000000 Binary files a/web/plugins/geohash/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/web/plugins/geohash/__pycache__/geohash.cpython-310.pyc b/web/plugins/geohash/__pycache__/geohash.cpython-310.pyc deleted file mode 100644 index e594a1a..0000000 Binary files a/web/plugins/geohash/__pycache__/geohash.cpython-310.pyc and /dev/null differ diff --git a/web/plugins/geohash/geohash.py b/web/plugins/geohash/geohash.py index 00793a7..115d0a0 100644 --- a/web/plugins/geohash/geohash.py +++ b/web/plugins/geohash/geohash.py @@ -1,6 +1,8 @@ from pelican import signals import geohash_tools as gh +hashes = [] + def generate_geohash(generator): for article in generator.articles: if "location" in article.metadata: @@ -8,7 +10,9 @@ def generate_geohash(generator): article.metadata['lat'] = lat article.metadata['lon'] = lon article.metadata['geohash'] = gh.encode(lat, lon, 11) - article.slug = gh.encode(lat, lon, 11) + if article.metadata['geohash'] not in hashes: + article.slug = gh.encode(lat, lon, 11) + hashes.append(article.metadata['geohash']) def register(): signals.article_generator_finalized.connect(generate_geohash) \ No newline at end of file