diff options
-rw-r--r-- | doc/about/about_hubzilla.html | 24 | ||||
-rw-r--r-- | doc/admin/administrator_guide.html | 346 | ||||
-rw-r--r-- | doc/developer/developer_guide.html | 473 | ||||
-rw-r--r-- | doc/member/member_guide.html | 18 | ||||
-rw-r--r-- | doc/member/toc.html | 25 | ||||
-rw-r--r-- | doc/toc.html | 110 |
6 files changed, 965 insertions, 31 deletions
diff --git a/doc/about/about_hubzilla.html b/doc/about/about_hubzilla.html new file mode 100644 index 000000000..ec3c69307 --- /dev/null +++ b/doc/about/about_hubzilla.html @@ -0,0 +1,24 @@ +<p><strong>Table of Contents</strong></p> + +<ul id="about-hubzilla-toc"> + <li><a href="/help/about/about_hubzilla#project">Project</a></li> + <li><a href="/help/about/about_hubzilla#features">Features</a></li> + <li><a href="/help/about/about_hubzilla#zot">Zot protocol</a></li> +</ul> + +<hr> + +<h1 id="project">Project</h1> +<p> + Hubzilla is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web. <br><br>Hubzilla is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more.<br><br>Hubzilla aims to be skill and resource agnostic. It is easy to use by everyday computer users, as well as by systems administrators and developers. <br><br>How you use it depends on how you want to use it. <br><br>It is written in the PHP scripting language, thus making it trivial to install on any hosting platform in use today. This includes self-hosting at home, at hosting providers such as <a href="http://mediatemple.com/">Media Temple</a> and <a href="http://www.dreamhost.com/">Dreamhost</a>, or on virtual and dedicated servers, offered by the likes of <a href="https://www.linode.com">Linode</a>, <a href="http://greenqloud.com">GreenQloud</a> or <a href="https://aws.amazon.com">Amazon AWS</a>.<br><br>In other words, Hubzilla can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language. <br><br>Along the way, Hubzilla offers a number of unique goodies: <br><br><strong>Single-click user identification:</strong> meaning you can access sites on Hubzilla simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.<br><br><strong>Cloning:</strong> of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in Hubzilla). Now, should your primary hub go down, no worries, your contacts, posts<em>*</em>, and messages<em>*</em> will automagically continue to be available and accessible under your cloned channel. <em>(*: only posts and messages as from the moment you cloned your channel)</em><br><br><strong>Privacy:</strong> Hubzilla identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss. +</p> + +<h1 id="features">Features</h1> +<p> + <strong><span style="font-size: 24px;">Hubzilla in a Nutshell</span></strong><br><br>TL;DR <br><br>Hubzilla provides distributed web publishing and social communications with <strong>decentralised permissions</strong>.<br><br>So what exactly are "decentralised permissions"? They give me the ability to share something on my website (photos, media, files, webpages, etc.) with specific people on completely different websites - but not necessarily <em>everybody</em> on those websites; and they do not need a password on my website and do not need to login to my website to view the things I've shared with them. They have one password on their own website and "magic authentication" between affiliated websites in the network. Also, as it is decentralised, there is no third party which has the ability to bypass permissions and see everything in the network.<br><br>Hubzilla combines many features of traditional blogs, social networking and media, content management systems, and personal cloud storage into an easy to use framework. Each node in the grid can operate standalone or link with other nodes to create a super-network; leaving privacy under the control of the original publisher. <br><br>Hubzilla is an open source webserver application written originally in PHP/MySQL and is easily installable by those with basic website administration skills. It is also easily extended via plugins and themes and other third-party tools. <br><br><strong><span style="font-size: 24px;">Hubzilla Features</span></strong><br><br><br>Hubzilla is a general-purpose web publishing and communication network, with several unique features. It is designed to be used by the widest range of people on the web, from non-technical bloggers, to expert PHP programmers and seasoned systems administrators.<br><br>This page lists some of the core features of Hubzilla that are bundled with the official release. As with most free and open source software, there may be many other extensions, additions, plugins, themes and configurations that are limited only by the needs and imagination of the members.<br><br><strong><span style="font-size: 20px;">Built for Privacy and Freedom</span></strong><br><br>One of the design goals of Hubzilla is to enable easy communication on the web, while preserving privacy, if so desired by members. To achieve this goal, Hubzilla includes a number of features allowing arbitrary levels of privacy:<br><br><strong>Affinity Slider</strong><br><br>When adding connnections in Hubzilla, members have the option of assigning "affinity" levels (how close your friendship is) to the new connection. For example, when adding someone who happens to be a person whose blog you follow, you could assign their channel an affinity level of "Acquaintances". <br><br>On the other hand, when adding a friend's channel, they could be placed under the affinity level of "Friends".<br><br>At this point, Hubzilla <em>Affinity Slider</em> tool, which usually appears at the top of your "Matrix" page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them.<br><br>The Affinity Slider allows instantaneous filtering of large amounts of content, grouped by levels of closeness.<br><br><strong>Connection Filtering</strong><br><br>You have the ability to control precisely what appears in your stream using the optional "Connection Filter". When enabled, the Connection Editor provides inputs for selecting criteria which needs to be matched in order to include or exclude a specific post from a specific channel. Once a post has been allowed, all comments to that post are allowed regardless of whether they match the selection criteria. You may select words that if present block the post or ensure it is included in your stream. Regular expressions may be used for even finer control, as well as hashtags or even the detected language of the post. <br><br><strong>Access Control Lists</strong><br><br>When sharing content, members have the option of restricting who sees the content. By clicking on the padlock underneath the sharing box, one may choose desired recipients of the post, by clicking on their names.<br><br>Once sent, the message will be viewable only by the sender and the selected recipients. In other words, the message will not appear on any public walls.<br><br>Access Control Lists may be applied to content and posts, photos, events, webpages, chatrooms and files. <br><br><strong>Single Sign-on</strong><br><br>Access Control Lists work for all channels in the grid due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other Hubzilla sites and used to control access to private resources. You login once to your home hub. After that, authentication to all Hubzilla resources is "magic".<br><br><br><strong>WebDAV enabled File Storage</strong><br><br>Files may be uploaded to your personal storage area using your operating system utilities (drag and drop in most cases). You may protect these files with Access Control Lists to any combination of Hubzilla members (including some third party network members) or make them public.<br><br><strong>Photo Albums</strong><br><br>Store photos in albums. All your photos may be protected by Access Control Lists.<br><br><strong>Events Calendar</strong><br><br>Create and manage events and tasks, which may also be protected with Access Control Lists. Events can be imported/exported to other software using the industry standard vcalendar/iCal format and shared in posts with others. Birthday events are automatically added from your friends and converted to your correct timezone so that you will know precisely when the birthday occurs - no matter where you are located in the world in relation to the birthday person. Events are normally created with attendance counters so your friends and connections can RSVP instantly. <br><br><strong>Chatrooms</strong><br><br>You may create any number of personal chatrooms and allow access via Access Control Lists. These are typically more secure than XMPP, IRC, and other Instant Messaging transports, though we also allow using these other services via plugins. <br><br><strong>Webpage Building</strong><br><br>Hubzilla has many "Content Management" creation tools for building webpages, including layout editing, menus, blocks, widgets, and page/content regions. All of these may be access controlled so that the resulting pages are private to their intended audience. <br><br><strong>Apps</strong><br><br>Apps may be built and distributed by members. These are different from traditional "vendor lockin" apps because they are controlled completely by the author - who can provide access control on the destination app pages and charge accordingly for this access. Most apps in Hubzilla are free and can be created easily by those with no programming skills. <br><br><strong>Layout</strong><br><br>Page layout is based on a description language called Comanche. Hubzilla is itself written in Comanche layouts which you can change. This allows a level of customisation you won't typically find in so-called "multi-user environments".<br><br><strong>Bookmarks</strong><br><br>Share and save/manage bookmarks from links provided in conversations. <br> <br> <br><strong>Private Message Encryption and Privacy Concerns</strong><br><br>Private mail is stored in an obscured format. While this is not bullet-proof it typically prevents casual snooping by the site administrator or ISP. <br><br>Each Hubzilla channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created. This is used to protect private messages and posts in transit.<br><br>Additionally, messages may be created utilising "end-to-end encryption" which cannot be read by Hubzilla operators or ISPs or anybody who does not know the passcode. <br><br>Public messages are generally not encrypted in transit or in storage. <br><br>Private messages may be retracted (unsent) although there is no guarantee the recipient hasn't read it yet.<br><br>Posts and messages may be created with an expiration date, at which time they will be deleted/removed on the recipient's site. <br><br><br><strong>Service Federation</strong><br><br>In addition to addon "cross-post connectors" to a variety of alternate networks, there is native support for importation of content from RSS/Atom feeds and using this to create special channels. Also, an experimental but working implementation of the Diaspora protocol allows communication with people on the Friendica and Diaspora decentralised social networks. This is currently marked experimental because these networks do not have the same level of privacy and encryption features and abilities as Hubzilla and may present privacy risks.<br><br>There is also experimental support for OpenID authentication which may be used in Access Control Lists. This is a work in progress. Your Hubzilla hub may be used as an OpenID provider to authenticate you to external services which use this technology. <br><br>Channels may have permissions to become "derivative channels" where two or more existing channels combine to create a new topical channel. <br><br><strong>Privacy Groups</strong><br><br>Our implementation of privacy groups is similar to Google "Circles" and Diaspora "Aspects". This allows you to filter your incoming stream by selected groups, and automatically set the outbound Access Control List to only those in that privacy group when you post. You may over-ride this at any time (prior to sending the post). <br><br><br><strong>Directory Services</strong><br><br>We provide easy access to a directory of members and provide decentralised tools capable of providing friend "suggestions". The directories are normal Hubzilla sites which have chosen to accept the directory server role. This requires more resources than most typical sites so is not the default. Directories are synchronised and mirrored so that they all contain up-to-date information on the entire network (subject to normal propagation delays). <br> <br><br><strong>TLS/SSL</strong><br><br>For Hubzilla hubs that use TLS/SSL, client to server communications are encrypted via TLS/SSL. Given recent disclosures in the media regarding widespread, global surveillance and encryption circumvention by the NSA and GCHQ, it is reasonable to assume that HTTPS-protected communications may be compromised in various ways. Private communications are consequently encrypted at a higher level before sending offsite.<br><br><strong>Channel Settings</strong><br><br>When a channel is created, a role is chosen which applies a number of pre-configured security and privacy settings. These are chosen for best practives to maintain privacy at the requested levels. <br><br>If you choose a "custom" privacy role, each channel allows fine-grained permissions to be set for various aspects of communication. For example, under the "Security and Privacy Settings" heading, each aspect on the left side of the page, has six (6) possible viewing/access options, that can be selected by clicking on the dropdown menu. There are also a number of other privacy settings you may edit. <br><br>The options are:<br><br> - Nobody except yourself.<br> - Only those you specifically allow.<br> - Anybody in your address book.<br> - Anybody on this website.<br> - Anybody in this network.<br> - Anybody authenticated.<br> - Specific people you provide a Guest Access Token to in order to access a specific item.<br> - Anybody on the Internet.<br><br><br><strong>Public and Private Forums</strong><br><br>Forums are typically channels which may be open to participation from multiple authors. There are currently two mechanisms to post to forums: 1) "wall-to-wall" posts and 2) via forum @mention tags. Forums can be created by anybody and used for any purpose. The directory contains an option to search for public forums. Private forums can only be posted to and often only seen by members.<br><br><br><strong>Account Cloning</strong><br><br>Accounts in Hubzilla are referred to as <em>nomadic identities</em>, because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com. <br><br>By contrast, say you've created a Hubzilla identity called <strong>tina@Hubzillahub.com</strong>. You can clone it to another Hubzilla hub by choosing the same, or a different name: <strong>liveForever@SomeHubzillaHub.info</strong><br><br>Both channels are now synchronized, which means all your contacts and preferences will be duplicated on your clone. It doesn't matter whether you send a post from your original hub, or the new hub. Posts will be mirrored on both accounts.<br><br>This is a rather revolutionary feature, if we consider some scenarios:<br><br> - What happens if the hub where an identity is based suddenly goes offline? Without cloning, a member will not be able to communicate until that hub comes back online (no doubt many of you have seen and cursed the Twitter "Fail Whale"). With cloning, you just log into your cloned account, and life goes on happily ever after. <br><br> - The administrator of your hub can no longer afford to pay for his free and public Hubzilla hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve yourHubzilla relationships, friends and content.<br><br> - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, Hubzilla offers <strong>censorship resistance</strong>. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet. <br><br>Hubzilla offers interesting new possibilities for privacy. You can read more at the <<Private Communications Best Practices>> page.<br><br>Some caveats apply. For a full explanation of identity cloning, read the <HOW TO CLONE MY IDENTITY>.<br><br><strong>Multiple Profiles</strong><br><br>Any number of profiles may be created containing different information and these may be made visible to certain of your connections/friends. A "default" profile can be seen by anybody and may contain limited information, with more information available to select groups or people. This means that the profile (and site content) your beer-drinking buddies see may be different than what your co-workers see, and also completely different from what is visible to the general public. <br><br><strong>Account Backup</strong><br><br>Red offers a simple, one-click account backup, where you can download a complete backup of your profile(s). <br><br>Backups can then be used to clone or restore a profile.<br><br><strong>Account Deletion</strong><br><br>Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the grid (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical.<br><br><strong><span style="font-size: 20px;">Content Creation</span></strong><br><br><strong>Writing Posts</strong><br><br>Hubzilla supports a number of different ways of adding rich-text content. The default is a custom variant of BBcode, tailored for use in Hubzilla. You may also enable the use of Markdown if you find that easier to work with. A visual editor may also be used. The traditional visual editor for Hubzilla had some serious issues and has since been removed. We are currently looking for a replacement. <br><br>When creating "Websites", content may be entered in HTML, Markdown, BBcode, and/or plain text.<br><br><strong>Deletion of content</strong><br>Any content created in Hubzilla remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot (Hubzilla communication and authentication protocol).<br><br><strong>Media</strong><br>Similar to any other modern blogging system, social network, or a micro-blogging service, Hubzilla supports the uploading of files, embedding of videos, linking web pages.<br><br><strong>Previewing/Editing</strong> <br>Post can be previewed prior to sending and edited after sending.<br><br><strong>Voting/Consensus</strong><br>Posts can be turned into "consensus" items which allows readers to offer feedback, which is collated into "agree", "disagree", and "abstain" counters. This lets you gauge interest for ideas and create informal surveys. <br><br><br><strong>Extending Hubzilla</strong><br><br>Hubzilla can be extended in a number of ways, through site customisation, personal customisation, option setting, themes, and addons/plugins. <br><br><strong>API</strong><br><br>An API is available for use by third-party services. This is based originally on the early Twitter API (for which hundreds of third-party tools exist). It is currently being extended to provide access to facilities and abilities which are specific to Hubzilla. Access may be provided by login/password or OAuth and client registration of OAuth applications is provided. +</p> + +<h1 id="zot">Zot protocol</h1> +<p> + <strong>What is Zot?</strong><br><br>Zot is the protocol that powers Hubzilla, providing three core capabilities: Communications, Identity, and Access Control.<br><br>The functionality it provides can also be described as follows: <br><br> - a relationship online is just a bunch of permissions<br> - the internet is just another folder<br><br><strong><span style="font-size: 20px;">Communications</span></strong><br><br>Zot is a revolutionary protocol which provides <em>decentralised communications</em> and <em>identity management</em> across the grid. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues, insatiable profit drive, and walled-garden mentality.<br><br>Communications and social networking are an integral part of the grid. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers. <br><br>Zot allows a wide array of background services in the grid, from offering friend suggestions, to directory services. You can also perform other things which would typically only be possibly on a centralized provider - such as "Wall to Wall" posts. Private/multiple profiles can be easily created, and web content can be tailored to the viewer via the <em>Affinity Slider</em>. <br><br>You won't find these features at all on other decentralized communication services. In addition to providing hub (server) decentralization, perhaps the most innovative and interesting Zot feature is its provision of <em>decentralized identity</em> services.<br><br><strong><span style="font-size: 20px;">Identity</span></strong> <br><br>Zot's identity layer is unique. It provides <em>invisible single sign-on</em> across all sites in the grid. <br><br>It also provides <em>nomadic identity</em>, so that your communications with friends, family, and or anyone else you're communicating with won't be affected by the loss of your primary communication node - either temporarily or permanently. <br><br>The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the grid at any time - with all your friends and preferences intact. <br><br>Crucially, these nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation or censorship. <br><br>Nomadic identity, single sign-on, and Hubzilla's decentralization of hubs, we believe, introduce a high degree of degree of <em>resiliency</em> and <em>persistence</em> in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.<br><br>As you browse the grid, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit. <br><br>How does Zot do that? We call it <em>magic-auth</em>, because Hubzilla hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the grid. This is one of the design goals of Hubzilla: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and user names for every different sight that someone might visit online.<br><br>You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the grid - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.<br><br>You cannot be silenced. You cannot be removed from the grid, unless you yourself choose to exit it.<br><br><strong><span style="font-size: 20px;">Access Control</span></strong><br><br>Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across Hubzilla. This is like having one super huge website made up of an army of small individual websites - and where each channel in the grid can completely control their privacy and sharing preferences for any web resources they create. <br><br>Currently, the grid supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities, such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely under your control.<br><br>This type of control is available on large corporate providers such as Facebook and Google, because they own the user database. Within the grid, there is no need for a huge user databaseon your machine - because the grid <em>is</em> your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers. <br><br>Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the grid. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub. Your private photos cannot be viewed, because permission really work; they are not an addon that was added as an afterthought. If you aren't on the list of allowed viewers for a particular photo, you aren't going to look at it. <br><br><strong><span style="font-size: 18px;">Additional Resources and Links</span></strong><br><br>For more detailed, technical information about Zot, check out the following links: <br><br> - <a href="https://github.com/friendica/red/wiki/Zot---A-High-Level-Overview">A high level overview</a><br><br> - <a href="https://github.com/friendica/red/wiki/zot">Zot development specification</a><br><br> - <a href="https://github.com/redmatrix/hubzilla/blob/master/include/zot.php">Zot reference implementation in PHP</a> +</p>
\ No newline at end of file diff --git a/doc/admin/administrator_guide.html b/doc/admin/administrator_guide.html new file mode 100644 index 000000000..c0a5212ec --- /dev/null +++ b/doc/admin/administrator_guide.html @@ -0,0 +1,346 @@ +<p><strong>Table of Contents</strong></p> + +<p></p><ul id="admin-guide-toc"><li><a href="/help/admin/administrator_guide#Overview">Overview</a></li><li><a href="/help/admin/administrator_guide#Where_to_find_more_help">Where to find more help</a></li><li><a href="/help/admin/administrator_guide#Before_you_begin">Before you begin</a><ul><li><a href="/help/admin/administrator_guide#Choose_a_domain_name_or_subdomain_name_for_your_server">Choose a domain name or subdomain name for your server</a></li><li><a href="/help/admin/administrator_guide#Decide_if_you_will_use_SSL_and_obtain_an_SSL_certificate_before_software_installation">Decide if you will use SSL and obtain an SSL certificate before software installation</a></li></ul></li><li><a href="/help/admin/administrator_guide#Deployment">Deployment</a></li><li><a href="/help/admin/administrator_guide#Requirements">Requirements</a></li><li><a href="/help/admin/administrator_guide#Manual_Installation">Manual Installation</a><ul><li><a href="/help/admin/administrator_guide#Unpack_the_Hubzilla_files_into_the_root_of_your_web_server_document_area">Unpack the Hubzilla files into the root of your web server document area</a></li><li><a href="/help/admin/administrator_guide#Official_addons">Official addons</a><ul><li><a href="/help/admin/administrator_guide#Installation">Installation</a></li><li><a href="/help/admin/administrator_guide#Updating">Updating</a></li></ul></li></ul></li><li><a href="/help/admin/administrator_guide#Automated_installation_via_the_homeinstall_shell_script">Automated installation via the .homeinstall shell script</a><ul><li><a href="/help/admin/administrator_guide#Requirements">Requirements</a></li><li><a href="/help/admin/administrator_guide#Overview_of_installation_steps">Overview of installation steps</a></li></ul></li><li><a href="/help/admin/administrator_guide#Service_Classes">Service Classes</a></li><li><a href="/help/admin/administrator_guide#Theme_management">Theme management</a><ul><li><a href="/help/admin/administrator_guide#Repo_management_example">Repo management example</a></li></ul></li><li><a href="/help/admin/administrator_guide#Channel_Directory">Channel Directory</a><ul><li><a href="/help/admin/administrator_guide#Keywords">Keywords</a></li></ul></li><li><a href="/help/admin/administrator_guide#Upgrading_from_RedMatrix_to_Hubzilla">Upgrading from RedMatrix to Hubzilla</a><ul><li><a href="/help/admin/administrator_guide#How_to_migrate_an_individual_channel_from_RedMatrix_to_Hubzilla">How to migrate an individual channel from RedMatrix to Hubzilla</a></li></ul></li><li><a href="/help/admin/administrator_guide#Troubleshooting">Troubleshooting</a><ul><li><a href="/help/admin/administrator_guide#Log_files">Log files</a><ul><li><a href="/help/admin/administrator_guide#Rotating_log_files">Rotating log files</a></li></ul></li></ul></li></ul><p></p> + +<hr><h1 id="Overview">Overview</h1> + +<p>Hubzilla is more than a simple web application. It is a +complex communications system which more closely resembles an email server +than a web server. For reliability and performance, messages are delivered in +the background and are queued for later delivery when sites are down. This +kind of functionality requires a bit more of the host system than the typical +blog. Not every PHP/MySQL hosting provider will be able to support +Hubzilla. Many will but please review the requirements and confirm these +with your hosting provider prior to installation.</p> + +<p>We've tried very hard to ensure that Hubzilla will run on commodity +hosting platforms such as those used to host Wordpress blogs and Drupal +websites. It will run on most any Linux VPS system. Windows LAMP platforms +such as XAMPP and WAMP are not officially supported at this time however +we welcome patches if you manage to get it working.</p> + +<h1 id="Where_to_find_more_help">Where to find more help</h1> + +<p>If you encounter problems or have issues not addressed in this documentation, +please let us know via the <a href="https://github.com/redmatrix/hubzilla/issues">Github issue +tracker</a>. Please be as clear as you +can about your operating environment and provide as much detail as possible +about any error messages you may see, so that we can prevent it from happening +in the future. Due to the large variety of operating systems and PHP platforms +in existence we may have only limited ability to debug your PHP installation or +acquire any missing modules * but we will do our best to solve any general code +issues.</p> + +<h1 id="Before_you_begin">Before you begin</h1> + +<h2 id="Choose_a_domain_name_or_subdomain_name_for_your_server">Choose a domain name or subdomain name for your server</h2> + +<p>Hubzilla can only be installed into the root of a domain or sub-domain, and can +not be installed using alternate TCP ports.</p> + +<h2 id="Decide_if_you_will_use_SSL_and_obtain_an_SSL_certificate_before_software_installation">Decide if you will use SSL and obtain an SSL certificate before software installation</h2> + +<p>You SHOULD use SSL. If you use SSL, you MUST use a "browser-valid" certificate.<br><em>You MUST NOT use self-signed certificates!</em></p> + +<p>Please test your certificate prior to installation. A web tool for testing your +certificate is available at "http://www.digicert.com/help/". When visiting your +site for the first time, please use the SSL ("https://") URL if SSL is available. +This will avoid problems later. The installation routine will not allow you to +use a non browser-valid certificate.</p> + +<p>This restriction is incorporated because public posts from you may contain +references to images on your own hub. Other members viewing their stream on +other hubs will get warnings if your certificate is not trusted by their web +browser. This will confuse many people because this is a decentralised network +and they will get the warning about your hub while viewing their own hub and may +think their own hub has an issue. These warnings are very technical and scary to +some folks, many of whom will not know how to proceed except to follow the browser +advice. This is disruptive to the community. That said, we recognise the issues +surrounding the current certificate infrastructure and agree there are many +problems, but that doesn't change the requirement.</p> + +<p>Free "browser-valid" certificates are available from providers such as StartSSL +and LetsEncrypt.</p> + +<p>If you do NOT use SSL, there may be a delay of up to a minute for the initial +install script * while we check the SSL port to see if anything responds there. +When communicating with new sites, Hubzilla always attempts connection on the +SSL port first, before falling back to a less secure connection. If you do not +use SSL, your webserver MUST NOT listen on port 443 at all.</p> + +<p>If you use LetsEncrypt to provide certificates and create a file under +.well-known/acme-challenge so that LetsEncrypt can verify your domain ownership, +please remove or rename the .well-known directory as soon as the certificate is +generated. Hubzilla will provide its own handler for ".well-known" services when +it is installed, and an existing directory in this location may prevent some of +these services from working correctly. This should not be a problem with Apache, +but may be an issue with nginx or other web server platforms.</p> + +<h1 id="Deployment">Deployment</h1> + +<p>There are several ways to deploy a new hub.</p> + +<ul><li>Manual installation on an existing server</li> +<li>Automated installation on an existing server using a shell script</li> +<li>Automated deployment using an OpenShift virtual private server (VPS)</li> +</ul><h1 id="Requirements">Requirements</h1> + +<ul><li><p>Apache with mod-rewrite enabled and "AllowOverride All" so you can use a +local .htaccess file. Some folks have successfully used nginx and lighttpd. +Example config scripts are available for these platforms in doc/install. +Apache and nginx have the most support.</p></li> +<li><p>PHP 5.5 or later.</p> + +<ul><li>Note that on some shared hosting environments, the <em>command line</em> version of +PHP might differ from the <em>webserver</em> version</li> +</ul></li> +<li><p>PHP <em>command line</em> access with register_argc_argv set to true in the +php.ini file * and with no hosting provider restrictions on the use of +exec() and proc_open().</p></li> +<li><p>curl, gd (with at least jpeg and png support), mysqli, mbstring, mcrypt, +and openssl extensions. The imagick extension is not required but desirable.</p></li> +<li><p>xml extension is required if you want webdav to work.</p></li> +<li><p>some form of email server or email gateway such that PHP mail() works.</p></li> +<li><p>Mysql 5.x or MariaDB or postgres database server.</p></li> +<li><p>ability to schedule jobs with cron.</p></li> +<li><p>Installation into a top-level domain or sub-domain (without a +directory/path component in the URL) is REQUIRED.</p></li> +</ul><h1 id="Manual_Installation">Manual Installation</h1> + +<h2 id="Unpack_the_Hubzilla_files_into_the_root_of_your_web_server_document_area">Unpack the Hubzilla files into the root of your web server document area</h2> + +<p>If you copy the directory tree to your webserver, make sure that you include the +hidden files like .htaccess.</p> + +<p>If you are able to do so, we recommend using git to clone the source +repository rather than to use a packaged tar or zip file. This makes the +software much easier to update. The Linux command to clone the repository +into a directory "mywebsite" would be:</p> + +<pre><code>git clone https://github.com/redmatrix/hubzilla.git mywebsite +</code></pre> + +<p>and then you can pick up the latest changes at any time with:</p> + +<pre><code>git pull +</code></pre> + +<p>make sure folders <code class="inline-code">store/[data]/smarty3</code> and <code class="inline-code">store</code> exist and are +writable by the webserver:</p> + +<pre><code>mkdir -p "store/[data]/smarty3" +chmod -R 777 store + +This permission (777) is very dangerous and if you have sufficient +privilege and knowledge you should make these directories writeable +only by the webserver and, if different, the user that will run the +cron job (see below). In many shared hosting environments this may be +difficult without opening a trouble ticket with your provider. The +above permissions will allow the software to work, but are not +optimal. +</code></pre> + +<p>The following directories also need to be writable by the webserver in order for certain +web-based administrative tools to function:</p> + +<ul><li><code class="inline-code">addon</code></li> +<li><code class="inline-code">extend</code></li> +<li><code class="inline-code">view/theme</code></li> +<li><code class="inline-code">widget</code></li> +</ul><h2 id="Official_addons">Official addons</h2> + +<h3 id="Installation">Installation</h3> + +<p>Navigate to your webThen you should clone the addon repository (separately). We'll give this repository a nickname of 'hzaddons'. You can pull in other hubzilla addon repositories by giving them different nicknames::</p> + +<pre><code>cd mywebsite +util/add_addon_repo https://github.com/redmatrix/hubzilla-addons.git hzaddons +</code></pre> + +<h3 id="Updating">Updating</h3> + +<p>For keeping the addon tree updated, you should be on your top level website directory and issue an update command for that repository::</p> + +<pre><code>cd mywebsite +util/update_addon_repo hzaddons +</code></pre> + +<p>Create searchable representations of the online documentation. You may do this + any time that the documentation is updated :</p> + +<pre><code>cd mywebsite +util/importdoc +</code></pre> + +<h1 id="Automated_installation_via_the_homeinstall_shell_script">Automated installation via the .homeinstall shell script</h1> + +<p>There is a shell script in (<code class="inline-code">.homeinstall/hubzilla-setup.sh</code>) that will install Hubzilla and its dependencies on a fresh installation of Debian 8.3 stable (Jessie). It should work on similar Linux systems but your results may vary.</p> + +<h2 id="Requirements">Requirements</h2> + +<p>The installation script was originally designed for a small hardware server behind your home router. However, it has been tested on several systems running Debian 8.3:</p> + +<ul><li><p>Home-PC (Debian-8.3.0-amd64)</p> + +<ul><li>Internet connection and router at home</li> +<li>Mini-pc connected to your router</li> +<li>USB drive for backups</li> +<li>Fresh installation of Debian on your mini-pc</li> +<li>Router with open ports 80 and 443 for your Debian</li> +</ul></li> +<li><p>DigitalOcean droplet (Debian 8.3 x64 / 512 MB Memory / 20 GB Disk / NYC3)</p></li> +</ul><h2 id="Overview_of_installation_steps">Overview of installation steps</h2> + +<ol><li><code class="inline-code">apt-get install git</code></li> +<li><code class="inline-code">mkdir -p /var/www/html</code></li> +<li><code class="inline-code">cd /var/www/html</code></li> +<li><code class="inline-code">git clone https://github.com/redmatrix/hubzilla.git .</code></li> +<li><code class="inline-code">nano .homeinstall/hubzilla-config.txt</code></li> +<li><code class="inline-code">cd .homeinstall/</code></li> +<li><code class="inline-code">./hubzilla-setup.sh</code></li> +<li><code class="inline-code">sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 100M/g" /etc/php5/apache2/php.ini</code></li> +<li><code class="inline-code">sed -i "s/^post_max_size =.*/post_max_size = 100M/g" /etc/php5/apache2/php.ini</code></li> +<li><code class="inline-code">service apache2 reload</code></li> +<li>Open your domain with a browser and step throught the initial configuration of Hubzilla.</li> +</ol><h1 id="Service_Classes">Service Classes</h1> + +<p>Service classes allow you to set limits on system resources by limiting what individual +accounts can do, including file storage and top-level post limits. Define custom service +classes according to your needs in the <code class="inline-code">.htconfig.php</code> file. For example, create +a <em>standard</em> and <em>premium</em> class using the following lines:</p> + +<pre><code>// Service classes + +App::$config['system']['default_service_class']='standard'; // this is the default service class that is attached to every new account + +// configuration for parent service class +App::$config['service_class']['standard'] = +array('photo_upload_limit'=>2097152, // total photo storage limit per channel (here 2MB) +'total_identities' =>1, // number of channels an account can create +'total_items' =>0, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected +'total_pages' =>100, // number of pages a channel can create +'total_channels' =>100, // number of channels the user can add, other users can still add this channel, even if the limit is reached +'attach_upload_limit' =>2097152, // total attachment storage limit per channel (here 2MB) +'chatters_inroom' =>20); + +// configuration for teacher service class +App::$config['service_class']['premium'] = +array('photo_upload_limit'=>20000000000, // total photo storage limit per channel (here 20GB) +'total_identities' =>20, // number of channels an account can create +'total_items' =>20000, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected +'total_pages' =>400, // number of pages a channel can create +'total_channels' =>2000, // number of channels the user can add, other users can still add this channel, even if the limit is reached +'attach_upload_limit' =>20000000000, // total attachment storage limit per channel (here 20GB) +'chatters_inroom' =>100); +</code></pre> + +<p>To apply a service class to an existing account, use the command line utility from the +web root:</p> + +<p><code class="inline-code">util/service_class</code> +list service classes</p> + +<p><code class="inline-code">util/config system default_service_class firstclass</code> +set the default service class to 'firstclass'</p> + +<p><code class="inline-code">util/service_class firstclass</code> +list the services that are part of 'firstclass' service class</p> + +<p><code class="inline-code">util/service_class firstclass photo_upload_limit 10000000</code> +set firstclass total photo disk usage to 10 million bytes</p> + +<p><code class="inline-code">util/service_class --account=5 firstclass</code> +set account id 5 to service class 'firstclass' (with confirmation)</p> + +<p><code class="inline-code">util/service_class --channel=blogchan firstclass</code> +set the account that owns channel 'blogchan' to service class 'firstclass' (with confirmation)</p> + +<p><strong>Service class limit options</strong></p> + +<ul><li>photo_upload_limit - maximum total bytes for photos</li> +<li>total_items - maximum total toplevel posts</li> +<li>total_pages - maximum comanche pages</li> +<li>total_identities - maximum number of channels owned by account</li> +<li>total_channels - maximum number of connections</li> +<li>total_feeds - maximum number of rss feed connections</li> +<li>attach_upload_limit - maximum file upload storage (bytes)</li> +<li>minimum_feedcheck_minutes - lowest setting allowed for polling rss feeds</li> +<li>chatrooms - maximum chatrooms</li> +<li>chatters_inroom - maximum chatters per room</li> +<li>access_tokens - maximum number of Guest Access Tokens per channel</li> +</ul><h1 id="Theme_management">Theme management</h1> + +<h2 id="Repo_management_example">Repo management example</h2> + +<ol><li><p>Navigate to your hub web root</p> + +<p><code class="inline-code">root@hub:/root# cd /var/www</code></p></li> +<li><p>Add the theme repo and give it a name</p> + +<p><code class="inline-code">root@hub:/var/www# util/add_theme_repo https://github.com/DeadSuperHero/redmatrix-themes.git DeadSuperHero</code></p></li> +<li><p>Update the repo by using</p> + +<p><code class="inline-code">root@hub:/var/www# util/update_theme_repo DeadSuperHero</code></p></li> +</ol><h1 id="Channel_Directory">Channel Directory</h1> + +<h2 id="Keywords">Keywords</h2> + +<p>There is a "tag cloud" of keywords that can appear on the channel directory page. +If you wish to hide these keywords, which are drawn from the directory server, you +can use the <em>config</em> tool:</p> + +<pre><code>util/config system disable_directory_keywords 1 +</code></pre> + +<p>If your hub is in the standalone mode because you do not wish to connect to the +global grid, you may instead ensure the the <em>directory_server</em> system option is +empty:</p> + +<pre><code>util/config system directory_server "" +</code></pre> + +<h1 id="Upgrading_from_RedMatrix_to_Hubzilla">Upgrading from RedMatrix to Hubzilla</h1> + +<h2 id="How_to_migrate_an_individual_channel_from_RedMatrix_to_Hubzilla">How to migrate an individual channel from RedMatrix to Hubzilla</h2> + +<ol><li>Clone the channel by opening an account on a Hubzilla hub and performing a basic import (not content) from the original RedMatrix hub. Give your new clone time to sync connections and settings.</li> +<li>Export individual channel content from your RedMatrix hub to a set of JSON text files using the red.hub/uexport tool. Do this in monthly increments if necessary.</li> +<li>Import the JSON data files sequentially in chronological order into the Hubzilla clone using the new.hub/import_items tool.</li> +<li>Inform your Friendica and Diaspora contacts that your channel moves. They need to reconnect to your new address. </li> +<li>After successful import (check!) delete your channel on the old RedMatrix Server.</li> +<li>On the Hubzilla server visit new.hub/locs and upgrade to your channel to a primary one. And when the old Redmatrix server is still listed delete them here as well. Press "Sync" to inform all other server in the grid.</li> +</ol><h1 id="Troubleshooting">Troubleshooting</h1> + +<h2 id="Log_files">Log files</h2> + +<p><a href="https://macgirvin.com/display/044c72684b95c46a77ac7560656d1dc38504244dc649626c637193f6dd7c7dc4@macgirvin.com">Allow me to elaborate on logfiles...</a></p> + +<p>There are three different log facilities.</p> + +<p><strong>The first is the database failure log</strong>. This is only used if you create a file called specifically 'dbfail.out' in the root folder of your website and make it write-able by the web server. If we have any database failed queries, they are all reported here. They generally indicate typos in our queries, but also occur if the database server disconnects or tables get corrupted. On rare occasions we'll see race conditions in here where two processes tried to create an xchan or cache entry with the same ID. Any other errors (especially persistent errors) should be investigated.</p> + +<p><strong>The second is the PHP error log</strong>. This is created by the language processor and only reports issues in the language environment. Again these can be syntax errors or programming errors, but these generally are fatal and result in a "white screen of death"; e.g. PHP terminates. You should probably look at this file if something goes wrong that doesn't result in a white screen of death, but it isn't uncommon for this file to be empty for days on end.</p> + +<p>There are some lines at the bottom of the supplied .htconfig.php file; which if uncommented will enable a PHP error log (<em>extremely</em> useful for finding the source of white screen failures). This isn't done by default due to potential issues with logfile ownership and write permissions and the fact that there is no logfile rotation by default.</p> + +<p><strong>The third is the "application log"</strong>. This is used by Hubzilla to report what is going on in the program and usually reports any difficulties or unexpected data we received. It also occasionally reports "heartbeat" status messages to indicate that we reached a certain point in a script. <strong>This</strong> is the most important log file to us, as we create it ourself for the sole purpose of reporting the status of background tasks and anything that seems weird or out of place. It may not be fatal, but maybe just unexpected. If you're performing a task and there's a problem, let us know what is in this file when the problem occurred. (Please don't send me 100M dumps you'll only piss me off). Just a few relevant lines so I can rule out a few hundred thousand lines of code and concentrate on where the problem starts showing up.</p> + +<p>These are your site logs, not mine. We report serious issues at any log level. I highly recommend 'DEBUG' log level for most sites - which provides a bit of additional info and doesn't create huge logfiles. When there's a problem which defies all attempts to track, you might wish to use DATA log level for a short period of time to capture all the detail of what structures we were dealing with at the time. This log level will use a lot of space so is recommended only for brief periods or for developer test sites.</p> + +<p>I recommend configuring logrotate for both the php log and the application log. I usually have a look at dbfail.out every week or two, fix any issues reported and then starting over with a fresh file. Likewise with the PHP logfile. I refer to it once in a while to see if there's something that needs fixing.</p> + +<p>If something goes wrong, and it's not a fatal error, I look at the application logfile. Often I will +<code class="inline-code">tail -f logfile.out</code></p> + +<p>While repeating an operation that has problems. Often I'll insert extra logging statements in the code if there isn't any hint what's going wrong. Even something as simple as "got here" or printing out the value of a variable that might be suspect. You can do this too - in fact I encourage you to do so. Once you've found what you need to find, you can</p> + +<p><code class="inline-code">git checkout file.php</code></p> + +<p>To immediately clear out all the extra logging stuff you added. Use the information from this log and any detail you can provide from your investigation of the problem to file your bug report - unless your analysis points to the source of the problem. In that case, just fix it.</p> + +<h3 id="Rotating_log_files">Rotating log files</h3> + +<ol><li>Enable the <strong>logrot</strong> addon in the official <a href="https://github.com/redmatrix/hubzilla-addons">hubzilla-addons</a> repo</li> +<li>Create a directory in your web root called <code class="inline-code">log</code> with webserver write permissions</li> +<li>Go to the <strong>logrot</strong> admin settings and enter this folder name as well as the max size and number of retained log files.</li> +</ol>
\ No newline at end of file diff --git a/doc/developer/developer_guide.html b/doc/developer/developer_guide.html new file mode 100644 index 000000000..34779a7e8 --- /dev/null +++ b/doc/developer/developer_guide.html @@ -0,0 +1,473 @@ +<p><strong>Table of Contents</strong> + </p><ul id="developer-guide-toc"><li><a href="/help/admin/administrator_guideWho_is_a_Hubzilla_developer_Should_I_read_this_">Who is a Hubzilla developer? Should I read this?</a></li><li><a href="/help/admin/administrator_guideVersioning_system">Versioning system</a></li><li><a href="/help/admin/administrator_guideGit_repository_branches">Git repository branches</a></li><li><a href="/help/admin/administrator_guideDeveloper_tools_and_workflows">Developer tools and workflows</a><ul><li><a href="/help/admin/administrator_guideHub_Snapshots">Hub Snapshots</a></li></ul></li><li><a href="/help/admin/administrator_guideTranslations">Translations</a><ul><li><a href="/help/admin/administrator_guideTranslation_Process">Translation Process</a></li><li><a href="/help/admin/administrator_guideUtilities">Utilities</a></li><li><a href="/help/admin/administrator_guideKnown_Problems">Known Problems</a></li></ul></li><li><a href="/help/admin/administrator_guideTo_be_organized_information">To-be-organized information</a></li></ul><p></p> + +<h2 id="Who_is_a_Hubzilla_developer_Should_I_read_this_">Who is a Hubzilla developer? Should I read this?</h2> + +<p>Anyone who contributes to making Hubzilla better is a developer. There are many different and important ways you can contribute to this amazing technology, <em>even if you do not know how to write code</em>. The software itself is only a part of the Hubzilla project. You can contribute by</p> + +<ul><li>translating text to your language so that people around the world have the opportunity to use Hubzilla</li> +<li>promoting Hubzilla and spreading awareness of the platform through blog posts, articles, and word-of-mouth</li> +<li>creating artwork and graphics for project assets such as icons and marketing material</li> +<li>supporting project infrastructure like the project website and demo servers</li> +</ul><p><em>Software</em> developers are of course welcomed; there are so many great ideas to implement and not enough people to make them all a reality! The Hubzilla code base is an advanced and mature system, but the platform is still very flexible and responsive to new ideas.</p> + +<p>This document will help you get started learning and contributing to Hubzilla.</p> + +<h2 id="Versioning_system">Versioning system</h2> + +<p>The versioning system is similar to the popular semantic versioning but less stringent. Given x.y.z, x changes yearly. y changes for "stable" monthly builds, and z increments when there are interface changes. We maintain our date and build numbers for medium grain version control (commits within a certain date range) and of course git revs for fine grained control.</p> + +<h2 id="Git_repository_branches">Git repository branches</h2> + +<p>There are two official branches of the Hubzilla git repo.</p> + +<ul><li>The stable version is maintained on the <strong>master</strong> branch. The latest commit in this branch is considered to be suitable for production hubs. </li> +<li>Experimental development occurs on the <strong>dev</strong> branch, which is merged into <strong>master</strong> when it is deemed tested and stable enough.</li> +</ul><h2 id="Developer_tools_and_workflows">Developer tools and workflows</h2> + +<h3 id="Hub_Snapshots">Hub Snapshots</h3> + +<p>The <a href="wiki/hubzilla/Hubzilla+Documentation/Hub%2BSnapshots">Hub Snapshots</a> page provides instructions and scripts for taking complete +snapshots of a hub to support switching between consistent and completely known +states. This is useful to prevent situations where the content or database schema +might be incompatible with the code.</p> + +<h2 id="Translations">Translations</h2> + +<p>Our translations are managed through Transifex. If you wish to help out translating Hubzilla to another language, sign up on transifex.com, visit <a href="https://www.transifex.com/projects/p/red-matrix/">https://www.transifex.com/projects/p/red-matrix/</a> and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.</p> + +<h3 id="Translation_Process">Translation Process</h3> + +<p>The strings used in the UI of Hubzilla is translated at [Transifex][1] and then +included in the git repository at github. If you want to help with translation +for any language, be it correcting terms or translating Hubzilla to a +currently not supported language, please register an account at transifex.com +and contact the Redmatrix translation team there.</p> + +<p>Translating Hubzilla is simple. Just use the online tool at transifex. If you +don't want to deal with git & co. that is fine, we check the status of the +translations regularly and import them into the source tree at github so that +others can use them.</p> + +<p>We do not include every translation from transifex in the source tree to avoid +a scattered and disturbed overall experience. As an uneducated guess we have a +lower limit of 50% translated strings before we include the language. This +limit is judging only by the amount of translated strings under the assumption +that the most prominent strings for the UI will be translated first by a +translation team. If you feel your translation useable before this limit, +please contact us and we will probably include your teams work in the source +tree.</p> + +<p>If you want to get your work into the source tree yourself, feel free to do so +and contact us with and question that arises. The process is simple and +Hubzilla ships with all the tools necessary.</p> + +<p>The location of the translated files in the source tree is + /view/LNG-CODE/ +where LNG-CODE is the language code used, e.g. de for German or fr for French. +For the email templates (the *.tpl files) just place them into the directory +and you are done. The translated strings come as a "hmessages.po" file from +transifex which needs to be translated into the PHP file Hubzilla uses. To do +so, place the file in the directory mentioned above and use the "po2php" +utility from the util directory of your Hubzilla installation.</p> + +<p>Assuming you want to convert the German localization which is placed in +view/de/hmessages.po you would do the following.</p> + +<ol><li><p>Navigate at the command prompt to the base directory of your +Hubzilla installation</p></li> +<li><p>Execute the po2php script, which will place the translation +in the hstrings.php file that is used by Hubzilla.</p> + +<p>$> php util/po2php.php view/de/hmessages.po</p> + +<p>The output of the script will be placed at view/de/hstrings.php where +froemdoca os expecting it, so you can test your translation mmediately.</p></li> +<li><p>Visit your Hubzilla page to check if it still works in the language you +just translated. If not try to find the error, most likely PHP will give +you a hint in the log/warnings.about the error.</p> + +<p>For debugging you can also try to "run" the file with PHP. This should +not give any output if the file is ok but might give a hint for +searching the bug in the file.</p> + +<p>$> php view/de/hstrings.php</p></li> +<li><p>commit the two files with a meaningful commit message to your git +repository, push it to your fork of the Hubzilla repository at github and +issue a pull request for that commit.</p></li> +</ol><h3 id="Utilities">Utilities</h3> + +<p>Additional to the po2php script there are some more utilities for translation +in the "util" directory of the Hubzilla source tree. If you only want to +translate Hubzilla into another language you wont need any of these tools most +likely but it gives you an idea how the translation process of Hubzilla +works.</p> + +<p>For further information see the utils/README file.</p> + +<h3 id="Known_Problems">Known Problems</h3> + +<ul><li>Hubzilla uses the language setting of the visitors browser to determain the +language for the UI. Most of the time this works, but there are some known +quirks.</li> +<li>the early translations are based on the friendica translations, if you +some rough translations please let us know or fix them at Transifex.</li> +</ul><h2 id="To_be_organized_information">To-be-organized information</h2> + +<p><strong>Here is how you can join us.</strong></p> + +<p>First, get yourself a working git package on the system where you will be +doing development.</p> + +<p>Create your own github account.</p> + +<p>You may fork/clone the Red repository from <a href="https://github.com/redmatrix/hubzilla.git">https://github.com/redmatrix/hubzilla.git</a>.</p> + +<p>Follow the instructions provided here: <a href="http://help.github.com/fork-a-repo/">http://help.github.com/fork-a-repo/</a> +to create and use your own tracking fork on github</p> + +<p>Then go to your github page and create a "Pull request" when you are ready +to notify us to merge your work.</p> + +<p><strong>Important</strong></p> + +<p>Please pull in any changes from the project repository and merge them with your work <strong>before</strong> issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.</p> + +<p>Also - <strong>test your changes</strong>. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.</p> + +<p><strong>Licensing</strong></p> + +<p>All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.</p> + +<p><strong>Coding Style</strong></p> + +<p>In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.</p> + +<ul><li><p>All comments should be in English.</p></li> +<li><p>We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.</p></li> +<li><p>Indentation is accomplished primarily with tabs using a tab-width of 4.</p></li> +<li><p>String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"</p></li> +<li><p>Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.</p></li> +<li><p>Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.</p></li> +<li><p>Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.</p></li> +</ul><p><strong>File system layout:</strong></p> + +<p>[addon] optional addons/plugins</p> + +<p>[boot.php] Every process uses this to bootstrap the application structure</p> + +<p>[doc] Help Files</p> + +<p>[images] core required images</p> + +<p>[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing</p> + +<p>[index.php] The front-end controller for web access</p> + +<p>[install] Installation and upgrade files and DB schema</p> + +<p>[library] Third party modules (must be license compatible)</p> + +<p>[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)</p> + +<p>[mod/site/] site-specific mod overrides, excluded from git</p> + +<p>[util] translation tools, main English string database and other miscellaneous utilities</p> + +<p>[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)</p> + +<p>[view] theming and language files</p> + +<p>[view/(css,js,img,php,tpl)] default theme files</p> + +<p>[view/(en,it,es ...)] language strings and resources</p> + +<p>[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides</p> + +<p><strong>The Database:</strong></p> + +<table><thead><tr><th>Table</th> + <th>Description</th> +</tr></thead><tbody><tr><td>abconfig</td> + <td>contact table, replaces Friendica 'contact'</td> +</tr><tr><td>abook</td> + <td></td> +</tr><tr><td>account</td> + <td>service provider account</td> +</tr><tr><td>addon</td> + <td></td> +</tr><tr><td>addressbookchanges</td> + <td></td> +</tr><tr><td>addressbooks</td> + <td></td> +</tr><tr><td>app</td> + <td></td> +</tr><tr><td>atoken</td> + <td></td> +</tr><tr><td>attach</td> + <td></td> +</tr><tr><td>auth_codes</td> + <td></td> +</tr><tr><td>cache</td> + <td></td> +</tr><tr><td>cal</td> + <td></td> +</tr><tr><td>calendarchanges</td> + <td></td> +</tr><tr><td>calendarinstances</td> + <td></td> +</tr><tr><td>calendarobjects</td> + <td></td> +</tr><tr><td>calendars</td> + <td></td> +</tr><tr><td>calendarsubscriptions</td> + <td></td> +</tr><tr><td>cards</td> + <td></td> +</tr><tr><td>channel</td> + <td></td> +</tr><tr><td>chat</td> + <td></td> +</tr><tr><td>chatpresence</td> + <td></td> +</tr><tr><td>chatroom</td> + <td></td> +</tr><tr><td>clients</td> + <td></td> +</tr><tr><td>config</td> + <td></td> +</tr><tr><td>conv</td> + <td></td> +</tr><tr><td>dreport</td> + <td></td> +</tr><tr><td>event</td> + <td></td> +</tr><tr><td>group_member</td> + <td></td> +</tr><tr><td>groupmembers</td> + <td></td> +</tr><tr><td>groups</td> + <td></td> +</tr><tr><td>hook</td> + <td></td> +</tr><tr><td>hubloc</td> + <td></td> +</tr><tr><td>iconfig</td> + <td></td> +</tr><tr><td>issue</td> + <td></td> +</tr><tr><td>item</td> + <td></td> +</tr><tr><td>item_id</td> + <td></td> +</tr><tr><td>likes</td> + <td></td> +</tr><tr><td>locks</td> + <td></td> +</tr><tr><td>mail</td> + <td></td> +</tr><tr><td>menu</td> + <td></td> +</tr><tr><td>menu_item</td> + <td></td> +</tr><tr><td>notify</td> + <td></td> +</tr><tr><td>obj</td> + <td></td> +</tr><tr><td>outq</td> + <td></td> +</tr><tr><td>pconfig</td> + <td>personal (per channel) configuration storage</td> +</tr><tr><td>photo</td> + <td></td> +</tr><tr><td>poll</td> + <td></td> +</tr><tr><td>poll_elm</td> + <td></td> +</tr><tr><td>principals</td> + <td></td> +</tr><tr><td>profdef</td> + <td></td> +</tr><tr><td>profext</td> + <td></td> +</tr><tr><td>profile</td> + <td></td> +</tr><tr><td>profile_check</td> + <td></td> +</tr><tr><td>propertystorage</td> + <td></td> +</tr><tr><td>register</td> + <td></td> +</tr><tr><td>schedulingobjects</td> + <td></td> +</tr><tr><td>session</td> + <td></td> +</tr><tr><td>shares</td> + <td></td> +</tr><tr><td>sign</td> + <td></td> +</tr><tr><td>site</td> + <td></td> +</tr><tr><td>source</td> + <td></td> +</tr><tr><td>sys_perms</td> + <td></td> +</tr><tr><td>term</td> + <td></td> +</tr><tr><td>tokens</td> + <td></td> +</tr><tr><td>updates</td> + <td></td> +</tr><tr><td>users</td> + <td></td> +</tr><tr><td>verify</td> + <td></td> +</tr><tr><td>vote</td> + <td></td> +</tr><tr><td>xchan</td> + <td></td> +</tr><tr><td>xchat</td> + <td></td> +</tr><tr><td>xconfig</td> + <td></td> +</tr><tr><td>xign</td> + <td></td> +</tr><tr><td>xlink</td> + <td></td> +</tr><tr><td>xperm</td> + <td></td> +</tr><tr><td>xprof</td> + <td></td> +</tr><tr><td>xtag</td> + <td></td> +</tr></tbody></table><pre><code>* abook - contact table, replaces Friendica 'contact' +* account - service provider account +* addon - registered plugins +* app - peronal app data +* attach - file attachments +* auth_codes - OAuth usage +* cache - OEmbed cache +* channel - replaces Friendica 'user' +* chat - chat room content +* chatpresence - channel presence information for chat +* chatroom - data for the actual chat room +* clients - OAuth usage +* config - main configuration storage +* conv - Diaspora private messages +* event - Events +* fcontact - friend suggestion stuff +* ffinder - friend suggestion stuff +* fserver - obsolete +* fsuggest - friend suggestion stuff +* groups - privacy groups +* group_member - privacy groups +* hook - plugin hook registry +* hubloc - Red location storage, ties a location to an xchan +* item - posts +* item_id - other identifiers on other services for posts +* likes - likes of 'things' +* mail - private messages +* menu - channel menu data +* menu_item - items uses by channel menus +* notify - notifications +* notify-threads - need to factor this out and use item thread info on notifications +* obj - object data for things (x has y) +* outq - output queue +* pconfig - personal (per channel) configuration storage +* photo - photo storage +* poll - data for polls +* poll_elm - data for poll elements +* profdef - custom profile field definitions +* profext - custom profile field data +* profile - channel profiles +* profile_check - DFRN remote auth use, may be obsolete +* register - registrations requiring admin approval +* session - web session storage +* shares - shared item information +* sign - Diaspora signatures. To be phased out. +* site - site table to find directory peers +* source - channel sources data +* spam - unfinished +* sys_perms - extensible permissions for the sys channel +* term - item taxonomy (categories, tags, etc.) table +* tokens - OAuth usage +* updates - directory sync updates +* verify - general purpose verification structure +* vote - vote data for polls +* xchan - replaces 'gcontact', list of known channels in the universe +* xchat - bookmarked chat rooms +* xconfig - as pconfig but for channels with no local account +* xlink - "friends of friends" linkages derived from poco +* xprof - if this hub is a directory server, contains basic public profile info of everybody in the network +* xtag - if this hub is a directory server, contains tags or interests of everybody in the network +</code></pre> + +<p><strong>How to theme Hubzilla</strong></p> + +<p>This is a short documentation on what I found while trying to modify Hubzilla's appearance.</p> + +<p>First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .</p> + +<p>Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().</p> + +<p>At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css').</p> + +<p>Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.</p> + +<p>We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.</p> + +<p><strong>Here is how you can join us.</strong></p> + +<p>First, get yourself a working git package on the system where you will be +doing development.</p> + +<p>Create your own github account.</p> + +<p>You may fork/clone the Red repository from [url=https://github.com/redmatrix/hubzilla.git]https://github.com/redmatrix/hubzilla.git[/url]</p> + +<p>Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url] +to create and use your own tracking fork on github</p> + +<p>Then go to your github page and create a "Pull request" when you are ready +to notify us to merge your work.</p> + +<p><strong>Translations</strong></p> + +<p>Our translations are managed through Transifex. If you wish to help out translating the $Projectname to another language, sign up on transifex.com, visit [url=https://www.transifex.com/projects/p/red-matrix/]https://www.transifex.com/projects/p/red-matrix/[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.</p> + +<p><strong>Important</strong></p> + +<p>Please pull in any changes from the project repository and merge them with your work <strong>before</strong> issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.</p> + +<p>Also - <strong>test your changes</strong>. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.</p> + +<p>Further documentation can be found at the Github wiki pages at: [url=https://github.com/friendica/red/wiki]https://github.com/friendica/red/wiki[/url]</p> + +<p><strong>Licensing</strong></p> + +<p>All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.</p> + +<p><strong>Concensus Building</strong></p> + +<p>Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.</p> + +<p>We encourage consensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to [url=https://zothub.com/channel/one]Channel One[/url]. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.</p> + +<p>There are places where opposition cannot be resolved. In these cases, please consider making your feature <strong>optional</strong> or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.</p> + +<p>If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.</p> + +<p><strong>Coding Style</strong></p> + +<p>In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.</p> + +<ul><li><p>All comments should be in English.</p></li> +<li><p>We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.</p></li> +<li><p>Indentation is accomplished primarily with tabs using a tab-width of 4.</p></li> +<li><p>String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"</p></li> +<li><p>Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.</p></li> +<li><p>Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.</p></li> +<li><p>Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.</p></li> +<li><p>Some functions take arguments in argc/argv style like main() in C or function args in bash or Perl. Urls are broken up within a module. e.g, given "http://example.com/module/arg1/arg2", then $this->argc will be 3 (integer) and $this->argv will contain: [0] => 'module', [1] => 'arg1', [2] => 'arg2'. There will always be one argument. If provided a naked domain URL, $this->argv[0] is set to "home".</p></li> +</ul> +
\ No newline at end of file diff --git a/doc/member/member_guide.html b/doc/member/member_guide.html new file mode 100644 index 000000000..6614a4b2d --- /dev/null +++ b/doc/member/member_guide.html @@ -0,0 +1,18 @@ +<p><strong>Table of Contents</strong></p> + +<ul id="member-guide-toc"> + <li><a href="/help/member/member_guide#overview">Overview</a></li> +</ul> + +<hr> + +<h1 id="overview">Overview</h1> +<p> +While many features and capabilities of Hubzilla are familiar to people who have +used social networking sites and blogging software, there are also quite a few new +concepts and features that most people have not encountered before. Some of the +new ideas are related to the <strong>decentralized</strong> nature of the grid; others are associated +with the advanced <strong>permissions system</strong> that is necessary to protect your data privacy. +The purpose of this guide is to help you understand how to create, configure, and +use your nomadic identity. +</p>
\ No newline at end of file diff --git a/doc/member/toc.html b/doc/member/toc.html deleted file mode 100644 index 6963c5ba9..000000000 --- a/doc/member/toc.html +++ /dev/null @@ -1,25 +0,0 @@ -<h3>Member Guide</h3> -<ul> -<li><a href="/help/member/overview">Overview</a></li> -<li><a href="/help/member/registration">Account Registration</a></li> -<li><a href="/help/member/accounts_profiles_channels_basics">Accounts, profiles and channels in short</a></li> -<li><a href="/help/member/profiles">Profiles</a></li> -<li><a href="/help/member/channels">Channels</a></li> -<li><a href="/help/member/roles">Permission roles and Channel types</a></li> -<li><a href="/help/member/connecting_to_channels">Connecting To Other Channels</a></li> -<li><a href="/help/member/permissions">Permissions And Encryption: You Are In Control</a></li> -<li><a href="/help/member/cloud">Cloud Storage</a></li> -<li><a href="/help/member/remove_account">Remove Channel or Account</a></li> - -<li><a href="/help/member/tags_and_mentions">Tags and Mentions</a></li> -<li><a href="/help/member/webpages">Web Pages</a></li> -<li><a href="/help/member/bbcode">BBcode reference for posts and comments</a></li> -<li><a href="/help/member/checking_account_quota_usage">Checking Account Quota Usage</a></li> -<li><a href="/help/member/cloud_desktop_clients">Cloud Desktop Clients</a></li> -<li><a href="/help/member/AdvancedSearch">Advanced Directory Search</a></li> -<li><a href="/help/member/addons">Help With Addons</a></li> -<li><a href="/help/member/diaspora_compat">Diaspora Communications Compatibility (Diaspora and Friendica)</a></li> -<li><a href="/help/member/faq_members">FAQ For Members</a></li> -<li><a href="/help/member/bugs">Bugs, Issues, and things that go bump in the night...</a></li> - -</ul> diff --git a/doc/toc.html b/doc/toc.html index 90f0cbaeb..45214e210 100644 --- a/doc/toc.html +++ b/doc/toc.html @@ -1,6 +1,104 @@ -<ul> -<li><a href="help/general">Project/Site Information</a></li> -<li><a href="help/member/overview">For Members</a></li> -<li><a href="help/admins">For Administrators</a></li> -<li><a href="help/develop">For Developers</a></li> -</ul> +<style> + #accordion .glyphicon { margin-right:10px; } + .panel-collapse>.list-group .list-group-item:first-child {border-top-right-radius: 0;border-top-left-radius: 0;} + .panel-collapse>.list-group .list-group-item {border-width: 1px 0;} + .panel-collapse>.list-group {margin-bottom: 0;} + .panel-collapse .list-group-item {border-radius:0;} + + .doco-list-group-item { + padding-left: 15px; + } + .widget { + position: fixed; + top:70px; + width: inherit; + height: 80%; + overflow-y: scroll; + } + +</style> + +<div class="panel-group" id="accordion"> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#about"><span class="glyphicon glyphicon-folder-open"> + </span>About</a> + </h4> + </div> + <div id="about" class="panel-collapse collapse"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/about/about_hubzilla#about-hubzilla-toc"><span class="glyphicon glyphicon-file"></span>Hubzilla project</a></li> + <li class="doco-list-group-item"><a href="/help/about/about_hub"><span class="glyphicon glyphicon-file"></span>About this hub</a></li> + </ul> + </div> + </div> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#members"><span class="glyphicon glyphicon-folder-open"> + </span>Members</a> + </h4> + </div> + <div id="members" class="panel-collapse collapse"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/member/member_guide#member-guide-toc">Contents</a></li> + </ul> + </div> + </div> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#administrators"><span class="glyphicon glyphicon-folder-open"> + </span>Administrators</a> + </h4> + </div> + <div id="administrators" class="panel-collapse collapse"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/admin/administrator_guide#admin-guide-toc">Contents</a></li> + <li class="doco-list-group-item"><a href="/help/admin/administrator_guide#Before_you_begin">Installation</a></li> + + + </ul> + </div> + </div> + <div class="panel"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#developers"><span class="glyphicon glyphicon-folder-open"> + </span>Developers</a> + </h4> + </div> + <div id="developers" class="panel-collapse collapse"> + <ul class="list-group"> + <li class="doco-list-group-item"><a href="/help/developer/developer_guide#developer-guide-toc">Contents</a></li> + <li class="doco-list-group-item"><a href="/help/developer/developer_guide#Who_is_a_Hubzilla_developer_Should_I_read_this_">Overview</a></li> + + </ul> + </div> + </div> +</div> + +<script> +// $(document).ready(function() { + // Determine the content section from the URL and expand the appropriate menu section + var url = document.createElement('a'); + url.href = window.location; + switch (url.pathname.split('/')[2]) { + case 'about': + $('#about').addClass('in'); + break; + case 'admin': + $('#administrators').addClass('in'); + break; + case 'member': + $('#members').addClass('in'); + break; + case 'developer': + $('#developers').addClass('in'); + break; + default: + break; + } +// } +</script>
\ No newline at end of file |