{ "info": { "author": "Peter A. Donis", "author_email": "peterdonis@alum.mit.edu", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Programming Language :: Python" ], "description": "Simpleblog is a simple Python blogging system. I use it to write\nand publish my own blog at http://blog.peterdonis.com. I wrote\nit because I couldn't find an existing blogging system that made\nit sufficiently easy to write, format, and publish my blog.\n\nMy chief goal with ``simpleblog`` is for the system to stay out\nof my way; I want to be able to add features easily, but other\nthan when I'm actually doing that, I want simpleblog to \"just\nwork\", so I don't even have to think about it at all. That way\nI can think about what I'm writing instead. With the existing\nsystems I've tried, I have ended up spending too much time\nfiguring out the internals of the system in order to get things\nthe way I want them. Admittedly, I have not tried many existing\nsystems; but what I have read about the ones I haven't tried\nhas not encouraged me that any of them would work any better\nfor me. So here we are.\n\nIf you just want to start using ``simpleblog``, without digging\ninto its internal details, then once you've installed it, you can\ncopy the contents of one of the example blogs to a directory of\nyour choice, and start writing your blog there. The layout of\nthe example blogs, and the files in them, will give you a start.\nBefore writing any entries, you will want to at least edit the\n``blog.json`` or ``blog.yaml`` file to customize your blog's\nmetadata, and the template files in the ``templates``\nsubdirectory, which give extremely plain HTML pages by default.\n\nNote that in order to use ``simpleblog``, you will need to have\ninstalled ``plib.stdlib`` (my library of useful Python stuff,\nwhich is used in a number of places in ``simpleblog``). It is\navailable at http://pypi.org/project/plib.stdlib. If you\nwant to use YAML instead of JSON for your config and blog\nmetadata files (I certainly find YAML much easier to type since\nI hate typing delimiters, as you will know if you read my blog),\nyou will also need to have installed PyYAML, the YAML parsing\nlibrary for Python (which in my opinion should be in the Python\nstandard library).\n\nNote: ``simpleblog`` works with Python 2. If you are using Python\n3, see https://pypi.org/project/simpleblog3.\n\nSimpleblog's Architecture\n-------------------------\n\nThe structure of ``simpleblog`` is simple (no, that wasn't intended\nto be humor, it's just the way it naturally came out). There\nare five core object types: the config, the blog, pages, containers,\nand entries. The config lets you define or customize the internal\nbehavior of the code, and all the other objects have a reference\nto it. The other object types fall into a simple hierarchy:\n\n- The blog contains one or more pages, plus metadata which can be\n specified in a separate file from the config file; the default\n filenames are ``blog.yaml`` (or ``blog.json``) and ``config.yaml``\n (or ``config.json``), but other filenames can be passed on the\n command line to the ``simpleblog-run`` script--see below;\n\n- Each page wraps a \"source\", which can be either a single entry,\n or a container;\n\n- A container contains one or more entries that have something in\n common;\n\n- An entry is the actual content.\n\nIt's important to note that the above is *all* that the core\nobjects implement, and it is completely general. Everything\nspecific, such as what actual \"sources\" there are, which entries\nare in which containers, etc., is all defined in extensions.\n(Strictly speaking, there is one default container in every blog,\nwhich simply contains all its entries, and every blog has an\nindex page, which uses that container as its \"source\", plus a\npage for every individual entry. But that's *all* that is in\nthe blog by default. Of course, that by itself is enough to\nhave a simple blog, which is part of the point.)\n\nTemplates\n~~~~~~~~~\n\nSimpleblog uses Python's built-in string templating and formatting\nto render entries and pages. The example blogs illustrate the\nbasics of how this works. This is one area where I do *not* have\nany items on my To Do list; the various fancy templating engines\nout there have their uses for highly dynamic web applications,\nbut for a simple blog they are, in my opinion, extreme overkill.\nBut the extension mechanism is there for anyone who disagrees\nand wants to use their favorite templating engine.\n\nExtensions\n~~~~~~~~~~\n\nExtensions allow pretty much every behavior of the four blog\nobject types--everything above except the config--to be changed,\nand even allow new behaviors to be added. (I say \"pretty much\"\nonly because I can't be absolutely positive I have allowed for\nevery possibility; but that's my goal.) This is done with a\nsimple (yes, you'll see that word cropping up a lot...) but\npowerful mechanism. You write a Python module that contains a\nsubclass of the ``BlogExtension`` class, and implements your\ndesired changed or added behaviors, and add its name to the\nlist of extensions in your config file. That's it. Or, of\ncourse, you can use one of the extensions that come with\nsimpleblog, listed below. I use all of them for my blog. They\ngive good examples of how the extension mechanism can be used.\n\n(Note: Strictly speaking, since extension names will be looked\nup as Python module names, they must be valid identifiers,\nwhich means they can't include hyphens. However, ``simpleblog``\nallows you to use hyphens when referring to extensions, as in\nthe ``render-markdown`` extension; it converts the hyphens to\nunderscores before looking up the module name. Command names\nare handled the same way--see below.)\n\n- The ``archives`` extension adds containers for entries that\n were published during specific time periods--years, months,\n and/or days, depending on the config settings--and adds\n archive pages to the blog for each container.\n\n- The ``categories`` extension allows you to classify entries\n by category, and adds a container and an index page for each\n category.\n\n- The ``copyright`` extension automatically generates copyright\n metadata based on the starting and ending year of blog entries.\n\n- The ``feed`` extension generates feeds for your blog's index\n page. Both RSS 2.0 and Atom feeds are supported. This extension\n also supports archived feeds per RFC 5005 (this only works for\n Atom feeds since the RSS spec does not appear to support\n this), which lets you limit the size of your syndication\n feed file by archiving old entries.\n\n- The ``folding`` extension allows your entries to have \"short\"\n versions that can appear in index pages, with links to the\n entry page that shows the entire entry (including the part\n \"below the fold\").\n\n- The ``grouping`` extension allows entries on index pages to\n be grouped, so that group headers and footers can appear in\n addition to the entries themselves. The default is to group\n by date, which goes along with the default sorting of entries\n in all containers, which is reverse chronological; but these\n can be changed by config settings (of course they should both\n be changed consistently).\n\n- The ``indexes`` extension adds index pages to your blog that\n give links to all entries in either alphabetical (by title),\n chronological, or \"key\" (meaning the unique key assigned to\n each entry) order.\n\n- The ``links`` extension allows you to add links to the previous\n and next entries in your blog's containers to each entry. By\n default it only does this on single-entry pages, but this can\n be configured; also, which links actually appear on the page\n is controlled by a template you provide.\n\n- The ``localize`` extension is currently experimental; all it\n does is add a \"locale\" config setting if certain other config\n settings are present. More localization functionality is\n on the To Do list; currently simpleblog is only tested with\n English ASCII text.\n\n- The ``paginate`` extension allows splitting sources with many\n entries into multiple pages.\n\n- The ``quote`` extension adds quoted versions of all URLS\n found in the blog's metadata. I added this because I link to\n the W3C HTML validator for my blog's index page, which wants\n quoted URLs, and this was an easy way to avoid having to type\n them into my blog metadata by hand. :)\n\n- The ``render-markdown`` extension allows your entry source\n to be plain text using Markdown syntax; the extension then\n renders it into HTML. (Without any extension changing the\n rendering, simpleblog just uses your entry source unchanged\n as its rendered HTML.) There are config options to specify\n the output format for Markdown (the default is HTML 4) and\n to \"pretty print\" the output.\n\n- The ``tags`` extension allows you to add tags to your entries,\n and adds a container and index page for each tag. This extension\n uses the caching mechanism for entry metadata (see below).\n\n- The ``timestamps`` extension uses the caching mechanism to\n store immutable file timestamps. (Without any extension, an\n entry's timestamp is the last modified time of its source\n file, but this means if you make any change at all to an entry\n once it is published, its time stamp changes, which may change\n where it appears in index pages.)\n\n- The ``timezone`` extension makes entry timestamps timezone-aware\n (without this extension they are \"naive\" ``datetime`` objects).\n The ``timezone_name`` config setting lets you explicitly declare\n your blog's timezone; otherwise your system's local time zone\n setting will be used (note, however, that the ``utc_timestamps``\n config setting can force the timezone to UTC; see notes in the\n change log). This extension requires the ``pytz`` library.\n\n- The ``title`` extension allows you to specify a title for each\n entry in the entry's source file. (Without any extension, the\n title of an entry is the same as its relative file name or URL\n path, which is probably not what you want.) It also supports\n very simple italics and bold formatting in the title.\n\nNote that in some cases the order in which extensions are declared\nin your config file matters. The order in which extensions are\nlisted in the config determines the order in which they are loaded,\nwhich determines the order in which they get to process whatever\ndata they are processing, which can obviously make a difference\nif multiple extensions process the same data. The cases you are\nmost likely to encounter are extensions that process the raw\nentry source data (the ``title``, ``tags``, and ``folding``\nextensions all do, and the ordering that is known to work is the\norder in which I just gave them), and extensions that add sources\nin the form of new containers (the ``archives``, ``categories``,\nand ``tags`` extensions) vs. extensions that need to know all the\ncontainers in the blog (the ``links`` extension is the key one,\nand needs to be loaded after the ones listed just now).\n\nEntry Metadata Caching\n~~~~~~~~~~~~~~~~~~~~~~\n\nEntry metadata is often useful for putting entries into containers\nand ordering them properly. It is nice to be able to do this without\nhaving to actually ask the filesystem for any data on individual\nentries, by either statting or opening and reading the entry source\nfiles. Simpleblog provides a caching mechanism for entry metadata\nto make this simple. Just use the ``cached`` decorator on any\nproperty that represents metadata you want cached, and provide the\nname of the file the cache should be stored in.\n\nCommands\n~~~~~~~~\n\nAll of the above is nice, but in order to actually use it, you have\nto have some kind of front end. The ``simpleblog-run`` script provides\none. If run without any command at all, the script simply puts you\ninto the Python interactive shell, with the ``simpleblog`` package\nloaded; I find this extremely useful for testing and debugging. But\nthe script can also be enhanced with commands, by a mechanism similar\nto the extension mechanism.\n\n(Note: As with extension names, hyphens in command names are converted\nto underscores before looking up the module, so you can use hyphens,\nas is done below, if you find them easier to type, as I do.)\n\n- The ``publish`` command publishes your statically rendered blog via\n SSH to a remote host that will serve it. By default it uses the\n ``rsync`` command, but a config setting allows you to change the\n command name (though it must be a command that uses the same\n command-line syntax as ``rsync``, such as ``scp``). You can also\n configure the command options and the SSH user, the remote hostname,\n and the path on the remote host to publish to.\n\n- The ``render-static`` command renders static versions of all the\n pages in your blog. A config setting controls the directory that\n the files are rendered to. For my blog, this is currently sufficient,\n since I publish it as static files.\n\n- The ``serve-local`` command serves your statically rendered blog on\n localhost for testing. You can use command-line options to change\n the host name (or IP address) and port used (the defaults are\n ``localhost`` on port 8000), for example to allow testing on a LAN.\n Since the built-in Python ``SimpleHTTPServer`` is used, it is *not*\n recommended to try to serve your blog to the Internet using this\n command.\n\nFor quick help on usage, use the ``--help`` option to the ``simpleblog-run``\nscript. If a command name is provided, help specific to that command will\nbe shown; otherwise, general help will be shown.\n\nUser-Defined Commands and Extensions\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSimpleblog supports defining your own commands or extensions,\nseparate from the ones supplied with ``simpleblog`` itself. All you\nhave to do is set the ``command_dir`` or ``extension_dir`` config\nand supply Python modules that match the command or extension name\nyou want to use. The command and extension loading mechanism will\nlook in your user-defined directories first, so you can even define a\ncommand or extension with the same name as a pre-packaged one, and it\nwill take precedence.\n\nTo Do\n-----\n\nAdd fancier example blogs to show how the various extensions work.\n\nAdd documentation other than this README file, both for users and\nfor developers.\n\nAdd support for comments while still allowing the blog to be\nstatically generated.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.org/project/simpleblog", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "simpleblog", "package_url": "https://pypi.org/project/simpleblog/", "platform": "", "project_url": "https://pypi.org/project/simpleblog/", "project_urls": { "Homepage": "http://pypi.org/project/simpleblog" }, "release_url": "https://pypi.org/project/simpleblog/0.9.6/", "requires_dist": null, "requires_python": "", "summary": "A simple Python blogging system.", "version": "0.9.6" }, "last_serial": 5866977, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "e4db0502411684a243bf5d294e2f78a4", "sha256": "2c135125a3c9ce6d26a7a184f2318149df563d33ad206675c5d15aeebe09e532" }, "downloads": -1, "filename": "simpleblog-0.1.tar.gz", "has_sig": false, "md5_digest": "e4db0502411684a243bf5d294e2f78a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28143, "upload_time": "2012-09-10T23:37:02", "url": "https://files.pythonhosted.org/packages/db/dd/a618069d8fa3991dcbe87049c2fe43a93d4b7283d149cf5e296bb8521868/simpleblog-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "f3235ed84402bc13ca576d067e2b6507", "sha256": "f4d7e0547df00c19d031c664ba8d77ce18f4f435d2cbf7b06ebf01adce3fbb28" }, "downloads": -1, "filename": "simpleblog-0.2.tar.gz", "has_sig": false, "md5_digest": "f3235ed84402bc13ca576d067e2b6507", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32079, "upload_time": "2012-09-17T02:41:17", "url": "https://files.pythonhosted.org/packages/ed/00/221917057d74d045616d26e3356ffe1e29c6843bf0ab84f56e4e70bb675f/simpleblog-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "8d1441034051ed527f65e4ec50797509", "sha256": "5839672358b9492ff3f549bbbd8edfacecfc132b42a1a49cf4ef0cb1b4a07825" }, "downloads": -1, "filename": "simpleblog-0.3.tar.gz", "has_sig": false, "md5_digest": "8d1441034051ed527f65e4ec50797509", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43551, "upload_time": "2012-09-27T21:18:37", "url": "https://files.pythonhosted.org/packages/72/0f/a6dfdd7fe70a913890af5af97b602ffe7ced3c342085cb2c44cc873c8b60/simpleblog-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "93b7b11f5966ee8fc08d035f2221ae41", "sha256": "cc90a677fc79f13719a84ae46cf38d0ea75c6e98f9885ef75eb7517b867bee2e" }, "downloads": -1, "filename": "simpleblog-0.4.tar.gz", "has_sig": false, "md5_digest": "93b7b11f5966ee8fc08d035f2221ae41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44662, "upload_time": "2012-10-02T23:47:24", "url": "https://files.pythonhosted.org/packages/55/29/849ed6f55b4a45a5d63299f26999ace25a5dfa00220b8cf42ba0ee9dcb5a/simpleblog-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "d4a33ba7a731c99a679e5fce4464f2f2", "sha256": "1998b4de152081aa31eea165057f9aa490a05320087d2b5d0983d3729ef4f25c" }, "downloads": -1, "filename": "simpleblog-0.5.tar.gz", "has_sig": false, "md5_digest": "d4a33ba7a731c99a679e5fce4464f2f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47951, "upload_time": "2012-10-07T17:27:42", "url": "https://files.pythonhosted.org/packages/75/55/5552f0f9495eaa288d8cd7e6f852419b632edc962b2e6d8427e18a4b56d2/simpleblog-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "154e94040debe88e46de5d8378629bd6", "sha256": "438a3b3351f68c1e740ad17459cc9766ef52745042a35c8394bbbaad4ca6497b" }, "downloads": -1, "filename": "simpleblog-0.6.tar.gz", "has_sig": false, "md5_digest": "154e94040debe88e46de5d8378629bd6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51430, "upload_time": "2012-10-13T19:05:21", "url": "https://files.pythonhosted.org/packages/9d/28/98bd1f305c08a9cc668e433ac324044f08b95c7b2fce8ce577ab2e61b3f9/simpleblog-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "97b552f5d5770548f06426b0bd24e3d5", "sha256": "7ca071e0d4e33a1cff84e01107f018fb70f5c10b360ae1e9aee0a4bf75dfde6d" }, "downloads": -1, "filename": "simpleblog-0.7.tar.gz", "has_sig": false, "md5_digest": "97b552f5d5770548f06426b0bd24e3d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52372, "upload_time": "2012-10-26T04:23:32", "url": "https://files.pythonhosted.org/packages/32/1e/84cde0e57321c49b2324923e3630f421b0f048524687adca348c4de39733/simpleblog-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "96d23705f3b14398205bb241bd93065d", "sha256": "1870973eb8fa68b9980f570b4affb373f96387519bdb7f04e99290552e11f469" }, "downloads": -1, "filename": "simpleblog-0.8.tar.gz", "has_sig": false, "md5_digest": "96d23705f3b14398205bb241bd93065d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53907, "upload_time": "2013-02-13T02:11:39", "url": "https://files.pythonhosted.org/packages/7d/bb/7b87102c7c0eeacce71cbf4ed46806bc14b6a117d6b4d48211b992b029cc/simpleblog-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "023c50ad9b51c50047dd59ed51f5f161", "sha256": "626ce017a85eefb1241a41be66fa7c14f2d04e511174b8c2e4481d43e90e53a7" }, "downloads": -1, "filename": "simpleblog-0.9.tar.gz", "has_sig": false, "md5_digest": "023c50ad9b51c50047dd59ed51f5f161", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53584, "upload_time": "2013-05-07T21:14:55", "url": "https://files.pythonhosted.org/packages/56/90/584cf70c71277f4f94a22a7f2d58edecdbe7c518e95bba129077c6546876/simpleblog-0.9.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "78498e85fee44d107e3993e6b0d00bb7", "sha256": "82560b1bfa19b8229c95fcfd702546817c9728f5921d4aa1e47ba33accaca4de" }, "downloads": -1, "filename": "simpleblog-0.9.1.tar.gz", "has_sig": false, "md5_digest": "78498e85fee44d107e3993e6b0d00bb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49448, "upload_time": "2013-05-27T22:06:50", "url": "https://files.pythonhosted.org/packages/cc/fd/a7b2caa7d99888c0b5bac3fad0fbc2a1a5296b83d1acb33251d940fa40ee/simpleblog-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "47f172b346f3bd19ced4a5c09fd92316", "sha256": "2f5d10b17ac508522351097b7a953d4a2b831faa9aa445551bd0245d242cd7ef" }, "downloads": -1, "filename": "simpleblog-0.9.2.tar.gz", "has_sig": false, "md5_digest": "47f172b346f3bd19ced4a5c09fd92316", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49412, "upload_time": "2013-06-09T01:24:27", "url": "https://files.pythonhosted.org/packages/70/8b/5536073fdbd5e7564109ccefb6ef7979c8cdac29d21aa8be12eef49cb1e2/simpleblog-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "5d32e8b655535ff776ba2c5271b22d3e", "sha256": "6939bdcb9e65eb6c695bc98edea4db40895cb92dfc3c182ee4932f5daf952514" }, "downloads": -1, "filename": "simpleblog-0.9.3.tar.gz", "has_sig": false, "md5_digest": "5d32e8b655535ff776ba2c5271b22d3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53888, "upload_time": "2013-06-09T20:38:15", "url": "https://files.pythonhosted.org/packages/d9/75/dfc7539e644dc8810adb2a6e7392afc271b39da061a5745a718d1f4a431a/simpleblog-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "770a016b4deab70a90b5c1db684a44b9", "sha256": "0d93428af92291e5ad066b6e4ef0423cca2394b1b21ec39488693431a1aee941" }, "downloads": -1, "filename": "simpleblog-0.9.4.tar.gz", "has_sig": false, "md5_digest": "770a016b4deab70a90b5c1db684a44b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49905, "upload_time": "2013-06-20T23:15:59", "url": "https://files.pythonhosted.org/packages/77/5e/6c74a9f4fe35904c317fb2e1834b40b33828d4a24e407d62d9ad1f6e2789/simpleblog-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "709eb8da7515e52ae1e6efa209d129a4", "sha256": "6f4124e26cd0538b5932a8706355aa8989a5a3bb093877ab76af402ba1387985" }, "downloads": -1, "filename": "simpleblog-0.9.5.tar.gz", "has_sig": false, "md5_digest": "709eb8da7515e52ae1e6efa209d129a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50634, "upload_time": "2013-08-11T04:21:48", "url": "https://files.pythonhosted.org/packages/42/3b/6d30b4b42056ab1726e5a50e5c46fd630cfbc62ee0bee8641b700c3192bd/simpleblog-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "c0fe4d8b544a939d62e163a1b9ee3a87", "sha256": "e9bb214601b394124a7e4888e90d032b99ccd4747bfd8987bf1135fc1336a892" }, "downloads": -1, "filename": "simpleblog-0.9.6.tar.gz", "has_sig": false, "md5_digest": "c0fe4d8b544a939d62e163a1b9ee3a87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54407, "upload_time": "2019-09-21T19:34:56", "url": "https://files.pythonhosted.org/packages/35/03/fa22340e450e7eab7847e6429650aec07aede0525d753917b155faff0c93/simpleblog-0.9.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c0fe4d8b544a939d62e163a1b9ee3a87", "sha256": "e9bb214601b394124a7e4888e90d032b99ccd4747bfd8987bf1135fc1336a892" }, "downloads": -1, "filename": "simpleblog-0.9.6.tar.gz", "has_sig": false, "md5_digest": "c0fe4d8b544a939d62e163a1b9ee3a87", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54407, "upload_time": "2019-09-21T19:34:56", "url": "https://files.pythonhosted.org/packages/35/03/fa22340e450e7eab7847e6429650aec07aede0525d753917b155faff0c93/simpleblog-0.9.6.tar.gz" } ] }