mirror of
https://github.com/formax68/memoChron.git
synced 2026-07-22 05:45:44 +00:00
new license and readme
This commit is contained in:
parent
f28b0c1225
commit
ff1ceaef77
5 changed files with 102 additions and 109 deletions
8
LICENSE
8
LICENSE
|
|
@ -1,5 +1,7 @@
|
|||
Copyright (C) 2020-2025 by Dynalist Inc.
|
||||
Copyright 2025 Michalis Efstratiadis.
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
|
||||
|
|
|
|||
133
README.md
133
README.md
|
|
@ -1,94 +1,87 @@
|
|||
# Obsidian Sample Plugin
|
||||
# MemoChron
|
||||
|
||||
This is a sample plugin for Obsidian (https://obsidian.md).
|
||||
MemoChron is an Obsidian plugin that bridges the gap between personal knowledge management and time management.
|
||||
It showcases a list of your calendar events. When you click on an event, it creates a note for this event.
|
||||
|
||||
This project uses TypeScript to provide type checking and documentation.
|
||||
The repo depends on the latest plugin API (obsidian.d.ts) in TypeScript Definition format, which contains TSDoc comments describing what it does.
|
||||

|
||||
|
||||
This sample plugin demonstrates some of the basic functionality the plugin API can do.
|
||||
- Adds a ribbon icon, which shows a Notice when clicked.
|
||||
- Adds a command "Open Sample Modal" which opens a Modal.
|
||||
- Adds a plugin setting tab to the settings page.
|
||||
- Registers a global click event and output 'click' to the console.
|
||||
- Registers a global interval which logs 'setInterval' to the console.
|
||||
## Features
|
||||
|
||||
## First time developing plugins?
|
||||
- 📅 **Calendar Integration**: Import and display events from public iCalendar (.ics) URLs
|
||||
- 👀 **Visual Calendar**: View your schedule in a clean, native-looking calendar interface in Obsidian's sidebar
|
||||
- 📋 **Daily Agenda View**: See a detailed list of events for any selected day
|
||||
- ✨ **Automatic Note Creation**: Create notes for events with customizable templates
|
||||
- 🔄 **Auto-Refresh**: Keep your calendar data up to date with configurable refresh intervals
|
||||
- 🎨 **Customizable**: Configure note templates, locations, and naming conventions
|
||||
|
||||
Quick starting guide for new plugin devs:
|
||||

|
||||
|
||||
- Check if [someone already developed a plugin for what you want](https://obsidian.md/plugins)! There might be an existing plugin similar enough that you can partner up with.
|
||||
- Make a copy of this repo as a template with the "Use this template" button (login to GitHub if you don't see it).
|
||||
- Clone your repo to a local development folder. For convenience, you can place this folder in your `.obsidian/plugins/your-plugin-name` folder.
|
||||
- Install NodeJS, then run `npm i` in the command line under your repo folder.
|
||||
- Run `npm run dev` to compile your plugin from `main.ts` to `main.js`.
|
||||
- Make changes to `main.ts` (or create new `.ts` files). Those changes should be automatically compiled into `main.js`.
|
||||
- Reload Obsidian to load the new version of your plugin.
|
||||
- Enable plugin in settings window.
|
||||
- For updates to the Obsidian API run `npm update` in the command line under your repo folder.
|
||||
## Installation
|
||||
|
||||
## Releasing new releases
|
||||
1. Open Obsidian Settings
|
||||
2. Go to Community Plugins and disable Safe Mode
|
||||
3. Click Browse and search for "MemoChron"
|
||||
4. Install the plugin and enable it
|
||||
|
||||
- Update your `manifest.json` with your new version number, such as `1.0.1`, and the minimum Obsidian version required for your latest release.
|
||||
- Update your `versions.json` file with `"new-plugin-version": "minimum-obsidian-version"` so older versions of Obsidian can download an older version of your plugin that's compatible.
|
||||
- Create new GitHub release using your new version number as the "Tag version". Use the exact version number, don't include a prefix `v`. See here for an example: https://github.com/obsidianmd/obsidian-sample-plugin/releases
|
||||
- Upload the files `manifest.json`, `main.js`, `styles.css` as binary attachments. Note: The manifest.json file must be in two places, first the root path of your repository and also in the release.
|
||||
- Publish the release.
|
||||
## Usage
|
||||
|
||||
> You can simplify the version bump process by running `npm version patch`, `npm version minor` or `npm version major` after updating `minAppVersion` manually in `manifest.json`.
|
||||
> The command will bump version in `manifest.json` and `package.json`, and add the entry for the new version to `versions.json`
|
||||
### Adding Calendar Sources
|
||||
|
||||
## Adding your plugin to the community plugin list
|
||||
1. Go to Settings > MemoChron
|
||||
2. Click "Add Calendar"
|
||||
3. Enter your public iCalendar (ICS) URL
|
||||
4. Give your calendar a name and optional tags
|
||||
5. Enable/disable calendars as needed
|
||||
|
||||
- Check the [plugin guidelines](https://docs.obsidian.md/Plugins/Releasing/Plugin+guidelines).
|
||||
- Publish an initial version.
|
||||
- Make sure you have a `README.md` file in the root of your repo.
|
||||
- Make a pull request at https://github.com/obsidianmd/obsidian-releases to add your plugin.
|
||||
### Viewing Your Calendar
|
||||
|
||||
## How to use
|
||||
- The calendar will appear in the right sidebar by default
|
||||
- Navigate between months using the arrows
|
||||
- Click on any day to see the agenda for that day
|
||||
- Hover over events to see more details
|
||||
|
||||
- Clone this repo.
|
||||
- Make sure your NodeJS is at least v16 (`node --version`).
|
||||
- `npm i` or `yarn` to install dependencies.
|
||||
- `npm run dev` to start compilation in watch mode.
|
||||
### Creating Notes from Events
|
||||
|
||||
## Manually installing the plugin
|
||||
1. Click on any event in the calendar or agenda view
|
||||
2. A new note will be created automatically using your template
|
||||
3. The note will include event details like title, time, description, and location
|
||||
|
||||
- Copy over `main.js`, `styles.css`, `manifest.json` to your vault `VaultFolder/.obsidian/plugins/your-plugin-id/`.
|
||||
### Customizing Templates
|
||||
|
||||
## Improve code quality with eslint (optional)
|
||||
- [ESLint](https://eslint.org/) is a tool that analyzes your code to quickly find problems. You can run ESLint against your plugin to find common bugs and ways to improve your code.
|
||||
- To use eslint with this project, make sure to install eslint from terminal:
|
||||
- `npm install -g eslint`
|
||||
- To use eslint to analyze this project use this command:
|
||||
- `eslint main.ts`
|
||||
- eslint will then create a report with suggestions for code improvement by file and line number.
|
||||
- If your source code is in a folder, such as `src`, you can use eslint with this command to analyze all files in that folder:
|
||||
- `eslint .\src\`
|
||||
In the plugin settings, you can customize:
|
||||
|
||||
## Funding URL
|
||||
- Note location in your vault
|
||||
- Note title format
|
||||
- Default template with variables like:
|
||||
- {{event_title}}
|
||||
- {{date}}
|
||||
- {{start_time}}
|
||||
- {{end_time}}
|
||||
- {{description}}
|
||||
- {{location}}
|
||||
- {{source}}
|
||||
|
||||
You can include funding URLs where people who use your plugin can financially support it.
|
||||
## Configuration
|
||||
|
||||
The simple way is to set the `fundingUrl` field to your link in your `manifest.json` file:
|
||||
### Settings
|
||||
|
||||
```json
|
||||
{
|
||||
"fundingUrl": "https://buymeacoffee.com"
|
||||
}
|
||||
```
|
||||
- **Calendar Sources**: Add, remove, or toggle calendars
|
||||
- **Note Location**: Set the default folder for event notes
|
||||
- **Note Title Format**: Customize how note titles are generated
|
||||
- **Refresh Interval**: Set how often calendar data updates
|
||||
- **Template**: Customize the default note template
|
||||
- **Tags**: Set default tags for event notes
|
||||
|
||||
If you have multiple URLs, you can also do:
|
||||
## Current Limitations
|
||||
|
||||
```json
|
||||
{
|
||||
"fundingUrl": {
|
||||
"Buy Me a Coffee": "https://buymeacoffee.com",
|
||||
"GitHub Sponsor": "https://github.com/sponsors",
|
||||
"Patreon": "https://www.patreon.com/"
|
||||
}
|
||||
}
|
||||
```
|
||||
- Only supports public iCalendar URLs (no authentication)
|
||||
- No bi-directional sync (changes in notes don't update calendar events)
|
||||
- Basic calendar views (monthly with agenda)
|
||||
|
||||
## API Documentation
|
||||
## Support
|
||||
|
||||
See https://github.com/obsidianmd/obsidian-api
|
||||
If you encounter any issues or have suggestions, please visit our [GitHub repository](https://github.com/formax68/memoChron) and create an issue.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the LICENSE file for details.
|
||||
|
|
|
|||
15
main.js
15
main.js
File diff suppressed because one or more lines are too long
|
|
@ -25,28 +25,35 @@ export class CalendarService {
|
|||
|
||||
async fetchCalendars(sources: CalendarSource[]): Promise<CalendarEvent[]> {
|
||||
const now = Date.now();
|
||||
|
||||
// Lazy load: Only fetch if it's been longer than refresh interval since last fetch
|
||||
if (
|
||||
this.events.length > 0 &&
|
||||
now - this.lastFetch < this.refreshMinutes * 60 * 1000
|
||||
) {
|
||||
return this.events;
|
||||
}
|
||||
|
||||
const enabledSources = sources.filter((source) => source.enabled);
|
||||
|
||||
// Lazy load: Fetch only when sources are enabled
|
||||
// First check if we have any enabled sources
|
||||
if (enabledSources.length === 0) {
|
||||
this.events = [];
|
||||
console.warn("No enabled calendar sources to fetch.");
|
||||
return [];
|
||||
}
|
||||
|
||||
const fetchPromises = enabledSources.map((source) =>
|
||||
this.fetchCalendar(source)
|
||||
);
|
||||
// Force a refresh if the number of enabled calendars changed
|
||||
const needsRefresh =
|
||||
this.events.length === 0 || // No events yet
|
||||
now - this.lastFetch >= this.refreshMinutes * 60 * 1000 || // Cache expired
|
||||
this.events.some(
|
||||
(event) =>
|
||||
!enabledSources.find((source) => source.name === event.source)
|
||||
) || // Has events from now-disabled calendars
|
||||
enabledSources.some(
|
||||
(source) => !this.events.find((event) => event.source === source.name)
|
||||
); // Has newly enabled calendars
|
||||
|
||||
if (!needsRefresh) {
|
||||
return this.events;
|
||||
}
|
||||
|
||||
try {
|
||||
const fetchPromises = enabledSources.map((source) =>
|
||||
this.fetchCalendar(source)
|
||||
);
|
||||
const results = await Promise.all(fetchPromises);
|
||||
this.events = results.flat();
|
||||
this.lastFetch = now;
|
||||
|
|
|
|||
|
|
@ -127,22 +127,14 @@ export class NoteService {
|
|||
locationText = `${locationEmoji} ${event.location}`;
|
||||
}
|
||||
|
||||
// Create the frontmatter section and handle tags
|
||||
let frontmatter =
|
||||
this.settings.defaultFrontmatter ||
|
||||
"---\ntype: event\nstatus: scheduled\n---";
|
||||
// Create frontmatter with proper YAML formatting
|
||||
const frontmatterContent = [
|
||||
"type: meeting",
|
||||
`date: "${dateStr}"`,
|
||||
tagsYaml
|
||||
].filter(line => line).join("\n");
|
||||
|
||||
// Insert tags into frontmatter before the closing marker
|
||||
if (tags.length > 0) {
|
||||
const frontmatterEnd = frontmatter.indexOf("---", 4);
|
||||
if (frontmatterEnd !== -1) {
|
||||
frontmatter =
|
||||
frontmatter.slice(0, frontmatterEnd) +
|
||||
tagsYaml +
|
||||
"\n" +
|
||||
frontmatter.slice(frontmatterEnd);
|
||||
}
|
||||
}
|
||||
const frontmatter = `---\n${frontmatterContent}\n---`;
|
||||
|
||||
// Get the template and replace variables
|
||||
const cleanedDescription = this.cleanTeamsDescription(
|
||||
|
|
|
|||
Loading…
Reference in a new issue