Greetings :-)
tl;dr
https://github.com/social-snippet/social-snippet
0. Introduction to the Social Snippet
I'm starting a new software project, "The Social Snippet Project", to manage the snippet libraries for the online judges (e.g. watashi's library, marioyc's library and etc...). As its name implies, it's made possible to share and retrieve your snippet libraries around the world through GitHub and other hosting services.
The social snippet project provides several things:
- Command-line interface to use and manage the snippet libraries and its dependencies
- Registry system to find the snippet libraries
- Editor plugins to use the snippets actually (e.g. Vim, Emacs and etc...)
The mission of the project is to create the snippet system which you can use on any programming languages, any editor softwares and any operating systems.
1. How It Works
Inserting Snippet
Let's assume that we are tackling some graph shortest path problems, and then we decide to solve the problems by using find_shortest() function from our graph library. Here is a pseudo C++ program code for that:
// solution.cpp
#include <iostream>
using namespace std;
// @snip <graph-lib:algorithm/find_shortest.cpp>
void solve(Graph graph, Vertex start, Vertex goal) {
cout << "The Answer = " << find_shortest(graph, start, goal) << endl;
}
The @snip
/ @snippet
annotation tags
The social snippet specifies the snippet code by putting annotation tags on the comment line.
// @snip <graph-lib:algorithm/find_shortest.cpp>
In order to insert a snippet, we can use a @snip
annotation tag. After inserting a snippet, the tagged line will be replaced by a snippet code such as follow:
// @snippet <graph-lib:algorithm/find_shortest.cpp>
int find_shortest(Graph graph, Vertex start, Vertex goal) {
... some implementation ...
}
The @snippet
annotation tag shows that the snippet code is already inserted in the program code. Finally, the first program code will be translated as the follows:
// solution.cpp
#include <iostream>
using namespace std;
// @snippet <graph-lib:algorithm/find_shortest.cpp>
int find_shortest(Graph graph, Vertex start, Vertex goal) {
... some implementation ...
}
void solve(Graph graph, Vertex start, Vertex goal) {
cout << "Answer is " << find_shortest(graph, start, goal) << endl;
}
Dependency Management
One more thing, the social snippet can resolve the dependencies among the snippets. For example, not deeply thinking, if the previous snippet depends on the dijkstra's algorithm, then a replaced snippet code will be:
// @snippet <graph-lib:algorithm/find-min/dijkstra.cpp>
vector<int> find_min(Graph graph, Vertex start) {
vector<int> min_dist;
... some implementation ...
return min_dist;
}
// @snippet <graph-lib:algorithm/find_shortest.cpp>
int find_shortest(Graph graph, Vertex start, Vertex goal) {
vector<int> dist = find_min(graph, start);
return dist[goal.id];
}
like above. The depended snippets are also inserted into the program code automatically.
Usage Example
Here is my last submission for Codeforces Round #268. I was using the social-snippet as a template code manager.
http://mirror.codeforces.com/contest/501/submission/9413315
Installation Guide
Core utilities (including command-line interfaces) are available on RubyGems.org. First, you need to install Ruby, and then type:
$ gem install social_snippet
And next, you need to install your editor's plugin for the social snippet. In the case of social_snippet.vim (Vim plugin), you should install plugins first as follow:
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
And then, write the followings to your configuration file (~/.vimrc
):
set runtimepath+=~/.vim/bundle/neobundle.vim/
call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundle "Shougo/neocomplete.vim"
NeoBundle "social-snippet/vim-social-snippet"
NeoBundleCheck
call neobundle#end()
let g:neocomplete#enable_at_startup = 1
let g:social_snippet#complete#enable = 1
The Command-line Interface
The sspm
command is to manage the snippet libraries. It has several sub-commands. If you are finding some libraries, then you should type the below command to search:
$ sspm search <keyword>
And if you find the expected library, then you should type the below command to install:
$ sspm install <name>
You can view the available sub-commands by typing:
$ sspm
or
$ sspm --help
You can also view the usage of the sub-command by typing:
$ sspm {sub-command} --help
2. Publish Your Libraries on the Registry System
The social snippet reigistry system is currently supported only the libraries publishing on the GitHub. If you have a GitHub repository, you can publish it by putting snippet.json
file into the repository. The snippet.json
's format is as follow:
{
"name": "your-lib-name",
"desc": "the description",
"languages": ["C", "C++"],
"license": "MIT",
"main": "path/to/src"
}
The repository will be registered to the registry system as the name written in the snippet.json
. In order to publish the repository, you should type the below command:
$ sspm publish {The URL of repository}
For example:
$ sspm publish git://github.com/social-snippet/example-repo
Here are the examples, please check them out:
- https://github.com/social-snippet/example-repo
- https://github.com/sh19910711/contest-base-simple
- https://github.com/sh19910711/ruby-contest-lib
3. Welcome Patches
Why don't you contribute this project. The project is under the terms of MIT License, and the project is still in the development phase. So welcome patches and pull-requests (Now I'm writing the documents for the developers). Feel free to contribute to the project, it's fine if you do just the ones you understand. There is a heavy context switching in the development. My hope is to focus me to a single task as possible. Help me:
- Core Utilities — CLI / API (social_snippet gem)
- Languages: Ruby
- The Back-end of the Registry System
- The Front-end of the Registry System
- Languages: CoffeeScript (for JavaScript) / Sass (for CSS)
- Frameworks: Marionette.js, Backbone.js
- Vim Plugin
- Languages: Vim script, Ruby
- Project Ideas Page
Thanks