├── .gitattributes ├── .gitignore ├── LICENSE-MIT.txt ├── jquery.details.min.js ├── README.md ├── jquery.details.js ├── demo.html └── LICENSE-GPL.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | * eol=lf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /LICENSE-MIT.txt: -------------------------------------------------------------------------------- 1 | Copyright Mathias Bynens 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /jquery.details.min.js: -------------------------------------------------------------------------------- 1 | /*! http://mths.be/details v0.1.0 by @mathias | includes http://mths.be/noselect v1.0.3 */ 2 | !function(e,t){var r,n=t.fn,o="[object Opera]"==Object.prototype.toString.call(window.opera),a=function(e){var t,r,n,o=e.createElement("details");return"open"in o?(r=e.body||function(){var r=e.documentElement;return t=!0,r.insertBefore(e.createElement("body"),r.firstElementChild||r.firstChild)}(),o.innerHTML="ab",o.style.display="block",r.appendChild(o),n=o.offsetHeight,o.open=!0,n=n!=o.offsetHeight,r.removeChild(o),t&&r.parentNode.removeChild(r),n):!1}(e),i=function(e,t,r,n){var o=e.prop("open"),a=o&&n||!o&&!n;a?(e.removeClass("open").prop("open",!1).triggerHandler("close.details"),t.attr("aria-expanded",!1),r.hide()):(e.addClass("open").prop("open",!0).triggerHandler("open.details"),t.attr("aria-expanded",!0),r.show())};n.noSelect=function(){var e="none";return this.bind("selectstart dragstart mousedown",function(){return!1}).css({MozUserSelect:e,msUserSelect:e,webkitUserSelect:e,userSelect:e})},a?(r=n.details=function(){return this.each(function(e){var r=t(this),n=t("summary",r).first();r.attr("id")||r.attr("id","details-id-"+e),r.attr("role","group"),n.attr({role:"button","aria-expanded":r.prop("open"),"aria-controls":r.attr("id")}).on("click",function(){var e=r.prop("open");n.attr("aria-expanded",!e),r.triggerHandler((e?"close":"open")+".details")})})},r.support=a):(r=n.details=function(){return this.each(function(e){var r=t(this),n=t("summary",r).first(),a=r.children(":not(summary)"),s=r.contents(":not(summary)");r.attr("id")||r.attr("id","details-id-"+e),r.attr("role","group"),n.length||(n=t("").text("Details").prependTo(r)),a.length!=s.length&&(s.filter(function(){return 3==this.nodeType&&/[^ \t\n\f\r]/.test(this.data)}).wrap(""),a=r.children(":not(summary)")),r.prop("open","string"==typeof r.attr("open")),i(r,n,a),n.attr({role:"button","aria-controls":r.attr("id")}).noSelect().prop("tabIndex",0).on("click",function(){n.focus(),i(r,n,a,!0)}).keyup(function(e){(32==e.keyCode||13==e.keyCode&&!o)&&(e.preventDefault(),n.click())})})},r.support=a)}(document,jQuery); 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `
`/`` jQuery plugin 2 | 3 | This plugin polyfills `
`/`` HTML elements and adds [the appropriate ARIA annotations](http://mathiasbynens.be/notes/html5-details-jquery#comment-58) for optimal accessibility. [More information can be found in my blog post on the subject.](http://mathiasbynens.be/notes/html5-details-jquery) 4 | 5 | ## Demo & Examples 6 | 7 | 8 | 9 | ## Example Usage 10 | 11 | In its simplest form: 12 | 13 | ```js 14 | // Polyfill a given set of elements 15 | $('details').details(); 16 | ``` 17 | 18 | The plugin will automatically detect browser support and act accordingly. If other parts of your code need to know whether `
`/`` are supported or not, use `$.fn.details.support`: 19 | 20 | ```js 21 | // Detect whether `
`/`` are natively supported 22 | console.log($.fn.details.support ? 'Native support' : 'No native support'); 23 | // Conditionally add a classname to the `html` element, based on native support 24 | $('html').addClass($.fn.details.support ? 'details' : 'no-details'); 25 | ``` 26 | 27 | The plugin will provide `open.details` and `close.details` events for you to use: 28 | 29 | ```js 30 | $('details').on({ 31 | 'open.details': function() { 32 | console.log('opened'); 33 | }, 34 | 'close.details': function() { 35 | console.log('closed'); 36 | } 37 | }); 38 | ``` 39 | 40 | Any handlers bound to these events will fire even in browsers that natively support `
`. 41 | 42 | Since both events live under the `details` namespace, you can easily unbind all handlers that are specific to this plugin: 43 | 44 | ```js 45 | $('details').off('.details'); 46 | ``` 47 | 48 | ## Notes 49 | 50 | The plugin doesn’t require you to add any CSS to your document. It will add a `class="open"` to any open `
` elements though (in addition to the `open` attribute), so you can very easily target these using CSS if you want. 51 | 52 | This plugin includes my [noSelect jQuery plugin](http://mths.be/noselect). 53 | 54 | This plugin automatically feature tests for native `
`/`` support and only enables the fallback when it’s necessary. You don’t have to write any feature tests yourself. 55 | 56 | This plugin requires jQuery 1.9+. For a version that works with jQuery 1.8 or older, [see v0.0.6](https://github.com/mathiasbynens/jquery-details/blob/0.0.6/jquery.details.js). For a version that works with jQuery 1.6 or older, [see v0.0.1](https://github.com/mathiasbynens/jquery-details/blob/0.0.1/jquery.details.js). 57 | 58 | This fallback works in all A-grade browsers, including IE6. It will only be executed if the `
` element is not natively supported in the browser. If it isn’t, and JavaScript is disabled, all elements will still be visible to the user. 59 | 60 | While the plugin has a certain level of support for `
` elements without a ``, it should be noted that omitting the `` element results in invalid HTML, and prevents the custom `open.details`/`close.details` events from firing in browsers that natively support `
`. Don’t do this! 61 | 62 | ## License 63 | 64 | This plugin is dual licensed under the MIT and GPL licenses, just like jQuery itself. 65 | 66 | _– [Mathias](http://mathiasbynens.be/)_ -------------------------------------------------------------------------------- /jquery.details.js: -------------------------------------------------------------------------------- 1 | /*! http://mths.be/details v0.1.0 by @mathias | includes http://mths.be/noselect v1.0.3 */ 2 | ;(function(document, $) { 3 | 4 | var proto = $.fn, 5 | details, 6 | // :'( 7 | isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]', 8 | // Feature test for native `
` support 9 | isDetailsSupported = (function(doc) { 10 | var el = doc.createElement('details'), 11 | fake, 12 | root, 13 | diff; 14 | if (!('open' in el)) { 15 | return false; 16 | } 17 | root = doc.body || (function() { 18 | var de = doc.documentElement; 19 | fake = true; 20 | return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild); 21 | }()); 22 | el.innerHTML = 'ab'; 23 | el.style.display = 'block'; 24 | root.appendChild(el); 25 | diff = el.offsetHeight; 26 | el.open = true; 27 | diff = diff != el.offsetHeight; 28 | root.removeChild(el); 29 | if (fake) { 30 | root.parentNode.removeChild(root); 31 | } 32 | return diff; 33 | }(document)), 34 | toggleOpen = function($details, $detailsSummary, $detailsNotSummary, toggle) { 35 | var isOpen = $details.prop('open'), 36 | close = isOpen && toggle || !isOpen && !toggle; 37 | if (close) { 38 | $details.removeClass('open').prop('open', false).triggerHandler('close.details'); 39 | $detailsSummary.attr('aria-expanded', false); 40 | $detailsNotSummary.hide(); 41 | } else { 42 | $details.addClass('open').prop('open', true).triggerHandler('open.details'); 43 | $detailsSummary.attr('aria-expanded', true); 44 | $detailsNotSummary.show(); 45 | } 46 | }; 47 | 48 | /* http://mths.be/noselect v1.0.3 */ 49 | proto.noSelect = function() { 50 | 51 | // Since the string 'none' is used three times, storing it in a variable gives better results after minification 52 | var none = 'none'; 53 | 54 | // onselectstart and ondragstart for WebKit & IE 55 | // onmousedown for WebKit & Opera 56 | return this.bind('selectstart dragstart mousedown', function() { 57 | return false; 58 | }).css({ 59 | 'MozUserSelect': none, 60 | 'msUserSelect': none, 61 | 'webkitUserSelect': none, 62 | 'userSelect': none 63 | }); 64 | 65 | }; 66 | 67 | // Execute the fallback only if there’s no native `details` support 68 | if (isDetailsSupported) { 69 | 70 | details = proto.details = function() { 71 | 72 | return this.each(function(index) { 73 | var $details = $(this), 74 | $summary = $('summary', $details).first(); 75 | // If `$details` doesn’t already have one, assign a generated `id` for 76 | // `aria-controls` on the `` to reference. 77 | if (!$details.attr('id')) { 78 | $details.attr('id', 'details-id-' + index); 79 | } 80 | $details.attr('role', 'group'); 81 | $summary.attr({ 82 | 'role': 'button', 83 | 'aria-expanded': $details.prop('open'), 84 | 'aria-controls': $details.attr('id') 85 | }).on('click', function() { 86 | // the value of the `open` property is the old value 87 | var close = $details.prop('open'); 88 | $summary.attr('aria-expanded', !close); 89 | $details.triggerHandler((close ? 'close' : 'open') + '.details'); 90 | }); 91 | }); 92 | 93 | }; 94 | 95 | details.support = isDetailsSupported; 96 | 97 | } else { 98 | 99 | details = proto.details = function() { 100 | 101 | // Loop through all `details` elements 102 | return this.each(function(index) { 103 | 104 | // Store a reference to the current `details` element in a variable 105 | var $details = $(this), 106 | // Store a reference to the `summary` element of the current `details` element (if any) in a variable 107 | $detailsSummary = $('summary', $details).first(), 108 | // Do the same for the info within the `details` element 109 | $detailsNotSummary = $details.children(':not(summary)'), 110 | // This will be used later to look for direct child text nodes 111 | $detailsNotSummaryContents = $details.contents(':not(summary)'); 112 | //assign a generated @id to the details element for reference by @aria-controls on the summary 113 | if (!$details.attr('id')) { 114 | $details.attr('id', 'details-id-' + index); 115 | } 116 | $details.attr('role', 'group'); 117 | // If there is no `summary` in the current `details` element… 118 | if (!$detailsSummary.length) { 119 | // …create one with default text 120 | $detailsSummary = $('').text('Details').prependTo($details); 121 | } 122 | 123 | // Look for direct child text nodes 124 | if ($detailsNotSummary.length != $detailsNotSummaryContents.length) { 125 | // Wrap child text nodes in a `span` element 126 | $detailsNotSummaryContents.filter(function() { 127 | // Only keep the node in the collection if it’s a text node containing more than only whitespace 128 | // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#space-character 129 | return this.nodeType == 3 && /[^ \t\n\f\r]/.test(this.data); 130 | }).wrap(''); 131 | // There are now no direct child text nodes anymore — they’re wrapped in `span` elements 132 | $detailsNotSummary = $details.children(':not(summary)'); 133 | } 134 | 135 | // Hide content unless there’s an `open` attribute 136 | $details.prop('open', typeof $details.attr('open') == 'string'); 137 | toggleOpen($details, $detailsSummary, $detailsNotSummary); 138 | 139 | // Add `role=button` and set the `tabindex` of the `summary` element to `0` to make it keyboard accessible 140 | $detailsSummary.attr({'role': 'button', 'aria-controls': $details.attr('id')}).noSelect().prop('tabIndex', 0).on('click', function() { 141 | // Focus on the `summary` element 142 | $detailsSummary.focus(); 143 | // Toggle the `open` and `aria-expanded` attributes and the `open` property of the `details` element and display the additional info 144 | toggleOpen($details, $detailsSummary, $detailsNotSummary, true); 145 | }).keyup(function(event) { 146 | if (32 == event.keyCode || (13 == event.keyCode && !isOpera)) { 147 | // Space or Enter is pressed — trigger the `click` event on the `summary` element 148 | // Opera already seems to trigger the `click` event when Enter is pressed 149 | event.preventDefault(); 150 | $detailsSummary.click(); 151 | } 152 | }); 153 | 154 | }); 155 | 156 | }; 157 | 158 | details.support = isDetailsSupported; 159 | 160 | } 161 | 162 | }(document, jQuery)); 163 | -------------------------------------------------------------------------------- /demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HTML5 <details> fallback using jQuery: demo 6 | 7 | 36 | 37 | 38 |

See HTML5 <details> fallback with jQuery.

39 | 40 |
41 |

Copying “Really Achieving Your Childhood Dreams” (details with summary)

42 |
43 | Copying… 25% 44 |
45 |
Transfer rate:
46 |
452KB/s
47 |
Local filename:
48 |
/home/rpausch/raycd.m4v
49 |
Remote filename:
50 |
/var/www/lectures/raycd.m4v
51 |
Duration:
52 |
01:16:27
53 |
Color profile:
54 |
SD (6-1-6)
55 |
Dimensions:
56 |
320×240
57 |
58 |
59 |
60 | 61 | 62 |
63 |

Copying “Really Achieving Your Childhood Dreams” (details without summary — this is invalid HTML!)

64 |
65 |
66 |
Transfer rate:
67 |
452KB/s
68 |
Local filename:
69 |
/home/rpausch/raycd.m4v
70 |
Remote filename:
71 |
/var/www/lectures/raycd.m4v
72 |
Duration:
73 |
01:16:27
74 |
Color profile:
75 |
SD (6-1-6)
76 |
Dimensions:
77 |
320×240
78 |
79 |
80 |
81 | 82 |
83 |

Copying “Really Achieving Your Childhood Dreams” (details with open attribute)

84 |
85 | Copying… 25% 86 |
87 |
Transfer rate:
88 |
452KB/s
89 |
Local filename:
90 |
/home/rpausch/raycd.m4v
91 |
Remote filename:
92 |
/var/www/lectures/raycd.m4v
93 |
Duration:
94 |
01:16:27
95 |
Color profile:
96 |
SD (6-1-6)
97 |
Dimensions:
98 |
320×240
99 |
100 |
101 |
102 | 103 | 104 |
105 |

details element containing only text

106 |
107 | Test 108 |
109 |
110 | 111 | 112 |
113 |

details element containing some children and some child text nodes

114 |
115 | 116 |

Foo

117 | 118 | Bar 119 |

Baz

120 | Inga 121 |
122 |
123 |
124 |

Nested details elements

125 |
126 | Nested 127 |
128 | Nested 129 |

lolwat

130 |
131 | Nested 132 |

lolwat

133 |
134 |
135 |
136 | Nested 137 |

lolwat

138 |
139 |
140 | Nested 141 |

lolwat

142 |
143 |

lolwat

144 |
145 |
146 | 147 | 148 | 173 | 174 | -------------------------------------------------------------------------------- /LICENSE-GPL.txt: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. --------------------------------------------------------------------------------