├── .gitattributes
├── .gitignore
├── LICENSE
├── librian
├── __init__.py
├── __main__.py
├── librian_util
│ ├── 加載器.py
│ ├── 文件.py
│ └── 路徑.py
├── librian本體
│ ├── librian.py
│ ├── librian虛擬機
│ │ ├── 命令.py
│ │ ├── 立繪.py
│ │ ├── 箱庭.py
│ │ ├── 虛擬機環境.py
│ │ ├── 角色.py
│ │ ├── 讀者.py
│ │ └── 鏡頭.py
│ ├── 前端
│ │ ├── adv.html
│ │ ├── adv.ptml
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── _統合.sass
│ │ │ ├── psd處理.coffee
│ │ │ ├── 主樣式.sass
│ │ │ ├── 全局.coffee
│ │ │ ├── 加載畫面.sass
│ │ │ ├── 各種面板.sass
│ │ │ ├── 存檔讀檔.coffee
│ │ │ ├── 按鈕.sass
│ │ │ ├── 控制.coffee
│ │ │ ├── 演出.coffee
│ │ │ ├── 特效.sass
│ │ │ └── 狀態切換.sass
│ │ ├── webpack.config.js
│ │ ├── 素材
│ │ │ ├── NotoSerifSC-SemiBold.otf
│ │ │ └── t0.png
│ │ ├── 黑科技
│ │ │ ├── font-awesome-4.7.0
│ │ │ │ ├── HELP-US-OUT.txt
│ │ │ │ ├── css
│ │ │ │ │ ├── font-awesome.css
│ │ │ │ │ └── font-awesome.min.css
│ │ │ │ ├── fonts
│ │ │ │ │ ├── FontAwesome.otf
│ │ │ │ │ ├── fontawesome-webfont.eot
│ │ │ │ │ ├── fontawesome-webfont.svg
│ │ │ │ │ ├── fontawesome-webfont.ttf
│ │ │ │ │ ├── fontawesome-webfont.woff
│ │ │ │ │ └── fontawesome-webfont.woff2
│ │ │ │ ├── less
│ │ │ │ │ ├── animated.less
│ │ │ │ │ ├── bordered-pulled.less
│ │ │ │ │ ├── core.less
│ │ │ │ │ ├── fixed-width.less
│ │ │ │ │ ├── font-awesome.less
│ │ │ │ │ ├── icons.less
│ │ │ │ │ ├── larger.less
│ │ │ │ │ ├── list.less
│ │ │ │ │ ├── mixins.less
│ │ │ │ │ ├── path.less
│ │ │ │ │ ├── rotated-flipped.less
│ │ │ │ │ ├── screen-reader.less
│ │ │ │ │ ├── stacked.less
│ │ │ │ │ └── variables.less
│ │ │ │ └── scss
│ │ │ │ │ ├── _animated.scss
│ │ │ │ │ ├── _bordered-pulled.scss
│ │ │ │ │ ├── _core.scss
│ │ │ │ │ ├── _fixed-width.scss
│ │ │ │ │ ├── _icons.scss
│ │ │ │ │ ├── _larger.scss
│ │ │ │ │ ├── _list.scss
│ │ │ │ │ ├── _mixins.scss
│ │ │ │ │ ├── _path.scss
│ │ │ │ │ ├── _rotated-flipped.scss
│ │ │ │ │ ├── _screen-reader.scss
│ │ │ │ │ ├── _stacked.scss
│ │ │ │ │ ├── _variables.scss
│ │ │ │ │ └── font-awesome.scss
│ │ │ └── synthetic_css
│ │ │ │ ├── _synthetic_offline.sass
│ │ │ │ ├── synthetic_offline.css
│ │ │ │ ├── 紙背景花紋.webp
│ │ │ │ └── 紙背景花紋模糊.webp
│ │ └── 默認標題畫面
│ │ │ ├── 定位.coffee
│ │ │ ├── 定位.js
│ │ │ ├── 標題.html
│ │ │ ├── 標題.ptml
│ │ │ ├── 樣式.css
│ │ │ └── 虛僞的假面.png
│ ├── 土特產
│ │ ├── liber.sublime-syntax
│ │ ├── protobuf.cson
│ │ ├── syntax_demo.liber
│ │ └── 導出pdf用
│ │ │ ├── 紙樣式.css
│ │ │ ├── 紙背景插入.webp
│ │ │ └── 紙背景花紋印刷.webp
│ ├── 導出文件.py
│ ├── 山彥.py
│ ├── 幻象.py
│ ├── 環境.py
│ ├── 窗口.py
│ ├── 資源
│ │ ├── Librian小.png
│ │ └── librian.ico
│ └── 配置.yaml
└── librian閱讀器
│ └── 配置.json
├── readme.md
├── requirements.txt
├── setup.py
└── 文檔
├── Librian2.jpg
├── 樣例_潘大爺.jpg
└── 視頻佔位.jpg
/.gitattributes:
--------------------------------------------------------------------------------
1 | librian/librian本體/前端/黑科技/** linguist-vendored
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | __pycache__/
2 | node_modules/
3 | .idea/
4 | .vim/
5 | *.swp
6 | error.log
7 | /存檔資料/
8 | /librian本體/project/
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Mozilla Public License Version 2.0
2 | ==================================
3 |
4 | 1. Definitions
5 | --------------
6 |
7 | 1.1. "Contributor"
8 | means each individual or legal entity that creates, contributes to
9 | the creation of, or owns Covered Software.
10 |
11 | 1.2. "Contributor Version"
12 | means the combination of the Contributions of others (if any) used
13 | by a Contributor and that particular Contributor's Contribution.
14 |
15 | 1.3. "Contribution"
16 | means Covered Software of a particular Contributor.
17 |
18 | 1.4. "Covered Software"
19 | means Source Code Form to which the initial Contributor has attached
20 | the notice in Exhibit A, the Executable Form of such Source Code
21 | Form, and Modifications of such Source Code Form, in each case
22 | including portions thereof.
23 |
24 | 1.5. "Incompatible With Secondary Licenses"
25 | means
26 |
27 | (a) that the initial Contributor has attached the notice described
28 | in Exhibit B to the Covered Software; or
29 |
30 | (b) that the Covered Software was made available under the terms of
31 | version 1.1 or earlier of the License, but not also under the
32 | terms of a Secondary License.
33 |
34 | 1.6. "Executable Form"
35 | means any form of the work other than Source Code Form.
36 |
37 | 1.7. "Larger Work"
38 | means a work that combines Covered Software with other material, in
39 | a separate file or files, that is not Covered Software.
40 |
41 | 1.8. "License"
42 | means this document.
43 |
44 | 1.9. "Licensable"
45 | means having the right to grant, to the maximum extent possible,
46 | whether at the time of the initial grant or subsequently, any and
47 | all of the rights conveyed by this License.
48 |
49 | 1.10. "Modifications"
50 | means any of the following:
51 |
52 | (a) any file in Source Code Form that results from an addition to,
53 | deletion from, or modification of the contents of Covered
54 | Software; or
55 |
56 | (b) any new file in Source Code Form that contains any Covered
57 | Software.
58 |
59 | 1.11. "Patent Claims" of a Contributor
60 | means any patent claim(s), including without limitation, method,
61 | process, and apparatus claims, in any patent Licensable by such
62 | Contributor that would be infringed, but for the grant of the
63 | License, by the making, using, selling, offering for sale, having
64 | made, import, or transfer of either its Contributions or its
65 | Contributor Version.
66 |
67 | 1.12. "Secondary License"
68 | means either the GNU General Public License, Version 2.0, the GNU
69 | Lesser General Public License, Version 2.1, the GNU Affero General
70 | Public License, Version 3.0, or any later versions of those
71 | licenses.
72 |
73 | 1.13. "Source Code Form"
74 | means the form of the work preferred for making modifications.
75 |
76 | 1.14. "You" (or "Your")
77 | means an individual or a legal entity exercising rights under this
78 | License. For legal entities, "You" includes any entity that
79 | controls, is controlled by, or is under common control with You. For
80 | purposes of this definition, "control" means (a) the power, direct
81 | or indirect, to cause the direction or management of such entity,
82 | whether by contract or otherwise, or (b) ownership of more than
83 | fifty percent (50%) of the outstanding shares or beneficial
84 | ownership of such entity.
85 |
86 | 2. License Grants and Conditions
87 | --------------------------------
88 |
89 | 2.1. Grants
90 |
91 | Each Contributor hereby grants You a world-wide, royalty-free,
92 | non-exclusive license:
93 |
94 | (a) under intellectual property rights (other than patent or trademark)
95 | Licensable by such Contributor to use, reproduce, make available,
96 | modify, display, perform, distribute, and otherwise exploit its
97 | Contributions, either on an unmodified basis, with Modifications, or
98 | as part of a Larger Work; and
99 |
100 | (b) under Patent Claims of such Contributor to make, use, sell, offer
101 | for sale, have made, import, and otherwise transfer either its
102 | Contributions or its Contributor Version.
103 |
104 | 2.2. Effective Date
105 |
106 | The licenses granted in Section 2.1 with respect to any Contribution
107 | become effective for each Contribution on the date the Contributor first
108 | distributes such Contribution.
109 |
110 | 2.3. Limitations on Grant Scope
111 |
112 | The licenses granted in this Section 2 are the only rights granted under
113 | this License. No additional rights or licenses will be implied from the
114 | distribution or licensing of Covered Software under this License.
115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a
116 | Contributor:
117 |
118 | (a) for any code that a Contributor has removed from Covered Software;
119 | or
120 |
121 | (b) for infringements caused by: (i) Your and any other third party's
122 | modifications of Covered Software, or (ii) the combination of its
123 | Contributions with other software (except as part of its Contributor
124 | Version); or
125 |
126 | (c) under Patent Claims infringed by Covered Software in the absence of
127 | its Contributions.
128 |
129 | This License does not grant any rights in the trademarks, service marks,
130 | or logos of any Contributor (except as may be necessary to comply with
131 | the notice requirements in Section 3.4).
132 |
133 | 2.4. Subsequent Licenses
134 |
135 | No Contributor makes additional grants as a result of Your choice to
136 | distribute the Covered Software under a subsequent version of this
137 | License (see Section 10.2) or under the terms of a Secondary License (if
138 | permitted under the terms of Section 3.3).
139 |
140 | 2.5. Representation
141 |
142 | Each Contributor represents that the Contributor believes its
143 | Contributions are its original creation(s) or it has sufficient rights
144 | to grant the rights to its Contributions conveyed by this License.
145 |
146 | 2.6. Fair Use
147 |
148 | This License is not intended to limit any rights You have under
149 | applicable copyright doctrines of fair use, fair dealing, or other
150 | equivalents.
151 |
152 | 2.7. Conditions
153 |
154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
155 | in Section 2.1.
156 |
157 | 3. Responsibilities
158 | -------------------
159 |
160 | 3.1. Distribution of Source Form
161 |
162 | All distribution of Covered Software in Source Code Form, including any
163 | Modifications that You create or to which You contribute, must be under
164 | the terms of this License. You must inform recipients that the Source
165 | Code Form of the Covered Software is governed by the terms of this
166 | License, and how they can obtain a copy of this License. You may not
167 | attempt to alter or restrict the recipients' rights in the Source Code
168 | Form.
169 |
170 | 3.2. Distribution of Executable Form
171 |
172 | If You distribute Covered Software in Executable Form then:
173 |
174 | (a) such Covered Software must also be made available in Source Code
175 | Form, as described in Section 3.1, and You must inform recipients of
176 | the Executable Form how they can obtain a copy of such Source Code
177 | Form by reasonable means in a timely manner, at a charge no more
178 | than the cost of distribution to the recipient; and
179 |
180 | (b) You may distribute such Executable Form under the terms of this
181 | License, or sublicense it under different terms, provided that the
182 | license for the Executable Form does not attempt to limit or alter
183 | the recipients' rights in the Source Code Form under this License.
184 |
185 | 3.3. Distribution of a Larger Work
186 |
187 | You may create and distribute a Larger Work under terms of Your choice,
188 | provided that You also comply with the requirements of this License for
189 | the Covered Software. If the Larger Work is a combination of Covered
190 | Software with a work governed by one or more Secondary Licenses, and the
191 | Covered Software is not Incompatible With Secondary Licenses, this
192 | License permits You to additionally distribute such Covered Software
193 | under the terms of such Secondary License(s), so that the recipient of
194 | the Larger Work may, at their option, further distribute the Covered
195 | Software under the terms of either this License or such Secondary
196 | License(s).
197 |
198 | 3.4. Notices
199 |
200 | You may not remove or alter the substance of any license notices
201 | (including copyright notices, patent notices, disclaimers of warranty,
202 | or limitations of liability) contained within the Source Code Form of
203 | the Covered Software, except that You may alter any license notices to
204 | the extent required to remedy known factual inaccuracies.
205 |
206 | 3.5. Application of Additional Terms
207 |
208 | You may choose to offer, and to charge a fee for, warranty, support,
209 | indemnity or liability obligations to one or more recipients of Covered
210 | Software. However, You may do so only on Your own behalf, and not on
211 | behalf of any Contributor. You must make it absolutely clear that any
212 | such warranty, support, indemnity, or liability obligation is offered by
213 | You alone, and You hereby agree to indemnify every Contributor for any
214 | liability incurred by such Contributor as a result of warranty, support,
215 | indemnity or liability terms You offer. You may include additional
216 | disclaimers of warranty and limitations of liability specific to any
217 | jurisdiction.
218 |
219 | 4. Inability to Comply Due to Statute or Regulation
220 | ---------------------------------------------------
221 |
222 | If it is impossible for You to comply with any of the terms of this
223 | License with respect to some or all of the Covered Software due to
224 | statute, judicial order, or regulation then You must: (a) comply with
225 | the terms of this License to the maximum extent possible; and (b)
226 | describe the limitations and the code they affect. Such description must
227 | be placed in a text file included with all distributions of the Covered
228 | Software under this License. Except to the extent prohibited by statute
229 | or regulation, such description must be sufficiently detailed for a
230 | recipient of ordinary skill to be able to understand it.
231 |
232 | 5. Termination
233 | --------------
234 |
235 | 5.1. The rights granted under this License will terminate automatically
236 | if You fail to comply with any of its terms. However, if You become
237 | compliant, then the rights granted under this License from a particular
238 | Contributor are reinstated (a) provisionally, unless and until such
239 | Contributor explicitly and finally terminates Your grants, and (b) on an
240 | ongoing basis, if such Contributor fails to notify You of the
241 | non-compliance by some reasonable means prior to 60 days after You have
242 | come back into compliance. Moreover, Your grants from a particular
243 | Contributor are reinstated on an ongoing basis if such Contributor
244 | notifies You of the non-compliance by some reasonable means, this is the
245 | first time You have received notice of non-compliance with this License
246 | from such Contributor, and You become compliant prior to 30 days after
247 | Your receipt of the notice.
248 |
249 | 5.2. If You initiate litigation against any entity by asserting a patent
250 | infringement claim (excluding declaratory judgment actions,
251 | counter-claims, and cross-claims) alleging that a Contributor Version
252 | directly or indirectly infringes any patent, then the rights granted to
253 | You by any and all Contributors for the Covered Software under Section
254 | 2.1 of this License shall terminate.
255 |
256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
257 | end user license agreements (excluding distributors and resellers) which
258 | have been validly granted by You or Your distributors under this License
259 | prior to termination shall survive termination.
260 |
261 | ************************************************************************
262 | * *
263 | * 6. Disclaimer of Warranty *
264 | * ------------------------- *
265 | * *
266 | * Covered Software is provided under this License on an "as is" *
267 | * basis, without warranty of any kind, either expressed, implied, or *
268 | * statutory, including, without limitation, warranties that the *
269 | * Covered Software is free of defects, merchantable, fit for a *
270 | * particular purpose or non-infringing. The entire risk as to the *
271 | * quality and performance of the Covered Software is with You. *
272 | * Should any Covered Software prove defective in any respect, You *
273 | * (not any Contributor) assume the cost of any necessary servicing, *
274 | * repair, or correction. This disclaimer of warranty constitutes an *
275 | * essential part of this License. No use of any Covered Software is *
276 | * authorized under this License except under this disclaimer. *
277 | * *
278 | ************************************************************************
279 |
280 | ************************************************************************
281 | * *
282 | * 7. Limitation of Liability *
283 | * -------------------------- *
284 | * *
285 | * Under no circumstances and under no legal theory, whether tort *
286 | * (including negligence), contract, or otherwise, shall any *
287 | * Contributor, or anyone who distributes Covered Software as *
288 | * permitted above, be liable to You for any direct, indirect, *
289 | * special, incidental, or consequential damages of any character *
290 | * including, without limitation, damages for lost profits, loss of *
291 | * goodwill, work stoppage, computer failure or malfunction, or any *
292 | * and all other commercial damages or losses, even if such party *
293 | * shall have been informed of the possibility of such damages. This *
294 | * limitation of liability shall not apply to liability for death or *
295 | * personal injury resulting from such party's negligence to the *
296 | * extent applicable law prohibits such limitation. Some *
297 | * jurisdictions do not allow the exclusion or limitation of *
298 | * incidental or consequential damages, so this exclusion and *
299 | * limitation may not apply to You. *
300 | * *
301 | ************************************************************************
302 |
303 | 8. Litigation
304 | -------------
305 |
306 | Any litigation relating to this License may be brought only in the
307 | courts of a jurisdiction where the defendant maintains its principal
308 | place of business and such litigation shall be governed by laws of that
309 | jurisdiction, without reference to its conflict-of-law provisions.
310 | Nothing in this Section shall prevent a party's ability to bring
311 | cross-claims or counter-claims.
312 |
313 | 9. Miscellaneous
314 | ----------------
315 |
316 | This License represents the complete agreement concerning the subject
317 | matter hereof. If any provision of this License is held to be
318 | unenforceable, such provision shall be reformed only to the extent
319 | necessary to make it enforceable. Any law or regulation which provides
320 | that the language of a contract shall be construed against the drafter
321 | shall not be used to construe this License against a Contributor.
322 |
323 | 10. Versions of the License
324 | ---------------------------
325 |
326 | 10.1. New Versions
327 |
328 | Mozilla Foundation is the license steward. Except as provided in Section
329 | 10.3, no one other than the license steward has the right to modify or
330 | publish new versions of this License. Each version will be given a
331 | distinguishing version number.
332 |
333 | 10.2. Effect of New Versions
334 |
335 | You may distribute the Covered Software under the terms of the version
336 | of the License under which You originally received the Covered Software,
337 | or under the terms of any subsequent version published by the license
338 | steward.
339 |
340 | 10.3. Modified Versions
341 |
342 | If you create software not governed by this License, and you want to
343 | create a new license for such software, you may create and use a
344 | modified version of this License if you rename the license and remove
345 | any references to the name of the license steward (except to note that
346 | such modified license differs from this License).
347 |
348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary
349 | Licenses
350 |
351 | If You choose to distribute Source Code Form that is Incompatible With
352 | Secondary Licenses under the terms of this version of the License, the
353 | notice described in Exhibit B of this License must be attached.
354 |
355 | Exhibit A - Source Code Form License Notice
356 | -------------------------------------------
357 |
358 | This Source Code Form is subject to the terms of the Mozilla Public
359 | License, v. 2.0. If a copy of the MPL was not distributed with this
360 | file, You can obtain one at http://mozilla.org/MPL/2.0/.
361 |
362 | If it is not possible or desirable to put the notice in a particular
363 | file, then You may include the notice in a location (such as a LICENSE
364 | file in a relevant directory) where a recipient would be likely to look
365 | for such a notice.
366 |
367 | You may add additional accurate notices of copyright ownership.
368 |
369 | Exhibit B - "Incompatible With Secondary Licenses" Notice
370 | ---------------------------------------------------------
371 |
372 | This Source Code Form is "Incompatible With Secondary Licenses", as
373 | defined by the Mozilla Public License, v. 2.0.
374 |
--------------------------------------------------------------------------------
/librian/__init__.py:
--------------------------------------------------------------------------------
1 | from librian.librian本體.librian import ember
2 |
3 | __version__ = '2.0.2'
4 |
--------------------------------------------------------------------------------
/librian/__main__.py:
--------------------------------------------------------------------------------
1 | import fire
2 |
3 | from librian.librian本體.librian import ember
4 |
5 |
6 | fire.Fire(ember)
7 |
--------------------------------------------------------------------------------
/librian/librian_util/加載器.py:
--------------------------------------------------------------------------------
1 | import os
2 | import logging
3 |
4 |
5 | def yaml(文件名, 默認=[]):
6 | import yaml
7 | return 加載(文件名, yaml.safe_load, 默認)
8 |
9 |
10 | def 加載(文件名, 加載方法, 默認):
11 | if os.path.isfile(文件名):
12 | try:
13 | with open(文件名, encoding='utf8') as f:
14 | 內容 = 加載方法(f)
15 | return 內容
16 | except Exception as e:
17 | logging.exception(e)
18 | logging.warning(f'「{文件名}」沒能讀入。')
19 | return 默認
20 |
21 |
22 |
--------------------------------------------------------------------------------
/librian/librian_util/文件.py:
--------------------------------------------------------------------------------
1 | import os
2 | import logging
3 |
4 |
5 | def 補充擴展名(文件名, 擴展名表, 路徑='./'):
6 | if '.' in os.path.split(文件名)[-1]:
7 | if not os.path.isfile(f'{路徑}/{文件名}'):
8 | logging.warning(f'「{文件名}」不存在。')
9 | return 文件名
10 | for 擴展名 in 擴展名表:
11 | if os.path.isfile(f'{路徑}/{文件名}.{擴展名}'):
12 | return f'{文件名}.{擴展名}'
13 | logging.warning(f'「{文件名}」不存在。')
14 | return 文件名
15 |
16 | def 轉爲網址路徑(路徑):
17 | 絕對路徑 = os.path.abspath(路徑)
18 | return f'file:///{絕對路徑}'
--------------------------------------------------------------------------------
/librian/librian_util/路徑.py:
--------------------------------------------------------------------------------
1 | import os
2 | from pathlib import Path
3 |
4 |
5 | 此處 = Path(__file__).parent
6 |
7 | librian = (此處 / '..').resolve()
8 |
9 | librian面板 = librian / 'librian面板'
10 | librian本體 = librian / 'librian本體'
11 |
12 |
13 |
14 | def 虛擬相對前端路徑(x):
15 | 源 = librian本體 / 'v' / x
16 | 前端 = librian本體 / '前端'
17 | return os.path.relpath(源, start=前端)
18 |
--------------------------------------------------------------------------------
/librian/librian本體/librian.py:
--------------------------------------------------------------------------------
1 | import os
2 | import logging
3 |
4 | from . import 環境
5 | from . import librian虛擬機
6 | from . import 窗口
7 |
8 | from .librian虛擬機 import 虛擬機環境
9 |
10 |
11 | def ember(project, 編寫模式=False):
12 | logging.info('librian_main啓動。')
13 | librian虛擬機.虛擬機環境.加載配置(project)
14 | 環境.導入全局配置({
15 | '編寫模式': 編寫模式
16 | })
17 |
18 | os.makedirs(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔', exist_ok=True)
19 |
20 | app = 窗口.啓動app()
21 | app.MainLoop()
22 |
--------------------------------------------------------------------------------
/librian/librian本體/librian虛擬機/命令.py:
--------------------------------------------------------------------------------
1 | import logging
2 |
3 | from librian.librian_util import 文件
4 |
5 | from . import 虛擬機環境
6 |
7 |
8 | def 別名適用(x):
9 | for i, f in list(x.__dict__.items()):
10 | if '別名' in dir(f):
11 | for 各別名 in f.別名:
12 | x.__class__.__setattr__(x, 各別名, f)
13 | return x
14 |
15 |
16 | def 別名(*li):
17 | def f2(x):
18 | x.別名 = li
19 | return x
20 | return f2
21 |
22 |
23 | @別名適用
24 | class 命令:
25 | def __init__(self, 函數, 參數表, 原文):
26 | self.函數 = 函數
27 | self.參數 = [i['a'] for i in 參數表]
28 | self.原文 = 原文
29 |
30 | def 執行(self, 讀者):
31 | try:
32 | t = eval(self.原文, {
33 | i: (lambda *li, f=f: f(self, 讀者, *li))
34 | for i, f in self.__class__.__dict__.items()
35 | if i not in ('py', 'js') and i[0] != '_'
36 | })
37 | if t is not None:
38 | raise Exception('不太對勁……')
39 | except:
40 | try:
41 | 函數 = eval('self.' + self.函數)
42 | 函數(*([讀者] + self.參數))
43 | except AttributeError as e:
44 | raise AttributeError('沒有可用的函數「%s」。' % self.函數)
45 | except Exception as e:
46 | s = '%s(%s)' % (self.函數, ', '.join(self.參數))
47 | logging.warning(f'在劇本中執行方法「{s}」時遇到了意外。')
48 | logging.exception(e)
49 |
50 | # ——————————————————————————————
51 |
52 | @別名('背景')
53 | def BG(self, 讀者, bg, 淡入時間=1, 位置='0% 0%', 漸變方法='_淡出'):
54 | bg = 文件.補充擴展名(bg, ['webp', 'png', 'jpg'], 虛擬機環境.工程路徑 / 虛擬機環境.圖片文件夾)
55 | 讀者.狀態.背景 = bg, 淡入時間, 位置, 漸變方法
56 |
57 | @別名('特效')
58 | def EF(self, 讀者, 標識, 類名=None):
59 | if 類名 is None and 標識 in 讀者.狀態.特效表:
60 | del 讀者.狀態.特效表[標識]
61 | else:
62 | 讀者.狀態.特效表[標識] = 類名
63 |
64 | @別名('背景音樂', '背景音乐')
65 | def BGM(self, 讀者, 文件名, 音量=1):
66 | if 文件名 is None or 文件名 == 'None':
67 | 讀者.狀態.背景音樂 = None
68 | else:
69 | 文件名 = 文件.補充擴展名(文件名, ['opus', 'mp3', 'ogg'], 虛擬機環境.工程路徑 / 虛擬機環境.音樂文件夾)
70 | 讀者.狀態.背景音樂 = 文件名, 音量
71 |
72 | def CG(self, 讀者, cg, 淡入時間=1, 漸變方法='_淡出'):
73 | if cg is None or cg == 'None':
74 | 讀者.狀態.cg = None
75 | else:
76 | cg = 文件.補充擴展名(cg, ['webp', 'png', 'jpg'], 虛擬機環境.工程路徑 / 虛擬機環境.圖片文件夾)
77 | 讀者.狀態.cg = cg, 淡入時間, 漸變方法
78 |
79 | @別名('效果音')
80 | def SE(self, 讀者, 文件名, 音量=1):
81 | 文件名 = 文件.補充擴展名(文件名, ['opus', 'mp3', 'ogg'], 虛擬機環境.工程路徑 / 虛擬機環境.音樂文件夾)
82 | 讀者.狀態.效果音 = 文件名, 音量
83 |
84 | @別名('視頻', '视频')
85 | def VIDEO(self, 讀者, 文件名, 可以跳過=False):
86 | 讀者.狀態.重置()
87 | 讀者.狀態.視頻 = 文件名, 可以跳過
88 |
--------------------------------------------------------------------------------
/librian/librian本體/librian虛擬機/立繪.py:
--------------------------------------------------------------------------------
1 | import copy
2 |
3 | from . import 角色
4 |
5 |
6 | def 人物拆解(人名: str, 镜头參數):
7 | 人 = 角色.取角色(人名)
8 |
9 | if not 人.有立繪:
10 | return None
11 |
12 | 位置 = copy.deepcopy(镜头參數['位置'])
13 | 語 = 镜头參數['語']
14 |
15 | if 人.使用png:
16 | return {
17 | '使用png': True,
18 | '位置': 位置,
19 | '特效': 人.現特效,
20 | '名字': 人名,
21 | }
22 |
23 | 位置[2] *= 人.固有縮放
24 |
25 | 衣配件 = 人.現衣圖層[::-1]
26 | 顏 = 人.現顏圖層
27 | if isinstance(顏, dict):
28 | if 語:
29 | 顏 = 顏['_語']
30 | else:
31 | 顏 = 顏['_默認']
32 | 顏配件 = 顏[::-1]
33 |
34 | return {
35 | '圖層': 衣配件 + 顏配件,
36 | '位置': 位置,
37 | '特效': 人.現特效,
38 | '名字': 人名,
39 | }
40 |
--------------------------------------------------------------------------------
/librian/librian本體/librian虛擬機/箱庭.py:
--------------------------------------------------------------------------------
1 | import os
2 | import logging
3 |
4 | import liber
5 |
6 | from . import 讀者
7 |
8 |
9 | class 箱庭:
10 | def __init__(self, 關聯讀者):
11 | self.關聯讀者 = 關聯讀者
12 | self.箱庭內容 = {
13 | 'goto': self.跳轉,
14 | 'call': self.棧跳轉,
15 | 'choice': self.產生選項,
16 | 'fusion': self.同化,
17 | 'adv_end': self.演出終了,
18 |
19 | '跳轉': self.跳轉,
20 | '調用': self.棧跳轉,
21 | '產生選項': self.產生選項,
22 | '同化': self.同化,
23 | '演出終了': self.演出終了,
24 |
25 | '跳转': self.跳轉,
26 | '调用': self.棧跳轉,
27 | '产生选项': self.產生選項,
28 | '同化': self.同化,
29 | '演出终了': self.演出終了,
30 | }
31 |
32 | def 跳轉(self, path=None, lable=None, 彈=True):
33 | 現名 = self.關聯讀者.劇本文件.名
34 | if not path:
35 | path = 現名
36 | else:
37 | path = '%s/%s' % (os.path.dirname(現名), path)
38 |
39 | if 彈:
40 | self.關聯讀者.劇本棧.pop()
41 | self.關聯讀者.劇本棧.append(self.關聯讀者.編譯(path))
42 | if lable:
43 | while True:
44 | t = self.關聯讀者.劇本文件.下一句()
45 | if t is None:
46 | raise Exception(f'沒有找到躍點「{lable}」')
47 | if '躍點' in t and t['躍點'] == lable:
48 | break
49 |
50 | def 棧跳轉(self, path=None, lable=None):
51 | self.跳轉(path, lable, 彈=False)
52 |
53 | def 產生選項(self, *li):
54 | li = [(i[0], i[1]) for i in li]
55 | self.關聯讀者.狀態.選項 = li
56 |
57 | def 同化(self, s):
58 | self.關聯讀者.劇本棧.append(讀者.劇本(liber.load(s), '_字串'))
59 |
60 | def 演出終了(self):
61 | self.關聯讀者.劇本棧 = []
62 |
--------------------------------------------------------------------------------
/librian/librian本體/librian虛擬機/虛擬機環境.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import logging
3 | from pathlib import Path
4 |
5 | import yaml
6 |
7 |
8 | class 假面:
9 | 配置 = {}
10 |
11 | def 加載配置(self, 工程路徑):
12 | 工程路徑 = Path(工程路徑)
13 | with open(工程路徑 / '工程配置.yaml', encoding='utf8') as f:
14 | a = yaml.safe_load(f)
15 | for i in a:
16 | self.配置.update(a[i])
17 | self.配置['工程路徑'] = 工程路徑
18 | self.配置['psd立繪路徑'] = 工程路徑 / self.配置['立繪文件夾']
19 |
20 | def __getattr__(self, x):
21 | return self.配置[x]
22 |
23 |
24 | sys.modules[__name__] = 假面()
25 |
--------------------------------------------------------------------------------
/librian/librian本體/librian虛擬機/角色.py:
--------------------------------------------------------------------------------
1 | import os
2 | import logging
3 |
4 | import yaml
5 | from rimo_utils import good_open
6 |
7 | from . import 虛擬機環境
8 |
9 |
10 | 角色表 = {}
11 |
12 |
13 | def 初始化():
14 | if '了' in dir(初始化):
15 | return
16 | 初始化.了 = True
17 | 導入有立繪的角色()
18 |
19 |
20 | def 取角色(名字):
21 | 初始化()
22 | if 名字 in 角色表:
23 | return 角色表[名字]
24 | else:
25 | return 角色(名字)
26 |
27 |
28 | def 導入有立繪的角色():
29 | try:
30 | with good_open(虛擬機環境.psd立繪路徑 / '映射.yaml') as f:
31 | 映射表 = yaml.load(f, Loader=yaml.BaseLoader)
32 | if 映射表:
33 | for 角色名 in 映射表:
34 | 角色(角色名, 映射表[角色名])
35 | for i in os.listdir(虛擬機環境.psd立繪路徑):
36 | if i.endswith('.png'):
37 | 前名 = os.path.basename(os.path.splitext(i)[0])
38 | 角色(前名, 使用png=True)
39 | except Exception as e:
40 | logging.warning('角色立繪沒有導入。')
41 | logging.exception(e)
42 |
43 |
44 | class 角色:
45 | def __init__(self, 名字: str, 立繪表: dict = None, 使用png=False):
46 | self.名字 = 名字
47 | self.顯示名字 = None
48 | self.使用png = 使用png
49 | self.有立繪 = bool(立繪表 or 使用png)
50 | if not self.有立繪:
51 | logging.warning(f'新建了沒有立繪的角色「{名字}」')
52 | if 立繪表:
53 | self.衣圖層 = 立繪表['衣']
54 | self.顏圖層 = 立繪表['顏']
55 | self.固有縮放 = 立繪表.get('縮放', 1)
56 | self.現顏 = None
57 | self.現衣 = None
58 | self.現特效 = None
59 |
60 | assert self.名字 not in 角色表
61 | 角色表[self.名字] = self
62 |
63 | @property
64 | def 現衣圖層(self):
65 | try:
66 | return self.衣圖層[self.現衣 or '_默認']
67 | except Exception:
68 | logging.warning(f'衣「{self.現衣}」沒有配置。')
69 | return []
70 |
71 | @property
72 | def 現顏圖層(self):
73 | try:
74 | return self.顏圖層[self.現顏 or '_默認']
75 | except Exception:
76 | logging.warning(f'顏「{self.現顏}」沒有配置。')
77 | return []
78 |
79 | def __repr__(self):
80 | return f'角色{"|"+self.顯示名字 if self.顯示名字 else ""}({self.名字}->[衣:{self.衣圖層}],[顏:{self.顏圖層}])'
81 |
--------------------------------------------------------------------------------
/librian/librian本體/librian虛擬機/讀者.py:
--------------------------------------------------------------------------------
1 | import copy
2 | import logging
3 |
4 | import yaml
5 | import sass
6 | import liber
7 | import cloudpickle as pickle
8 | from rimo_utils import good_open
9 |
10 | from . import 鏡頭
11 | from . import 角色
12 | from . import 命令
13 | from . import 箱庭
14 |
15 |
16 |
17 | class 狀態:
18 | def __init__(self):
19 | self.話語 = None # str
20 | self.名字 = None # str
21 | self.語者 = None # str
22 | self.人物 = None # str
23 | self.背景 = None # [圖名, 淡入時間, 位置, 漸變方法]
24 | self.背景音樂 = None # [音樂名, 音量]
25 | self.效果音 = None # [音樂名, 音量]
26 | self.插入圖 = None # str
27 | self.cg = None # [圖名, 淡入時間, 漸變方法]
28 | self.視頻 = None # [視頻名, 可以跳過]
29 | self.js = None # str
30 | self.html = None # str
31 | self.選項 = []
32 | self.特效表 = {}
33 | self.額外信息 = ()
34 | self.源 = []
35 |
36 | def 導出(self):
37 | 鏡頭.語者 = self.語者
38 | if self.人物:
39 | 立繪 = 鏡頭.查詢(self.人物).拆解()
40 | else:
41 | 立繪 = []
42 | if self.語者:
43 | 表情 = 角色.取角色(self.語者).現顏
44 | else:
45 | 表情 = ''
46 | 快照 = {
47 | '話語': self.話語,
48 | '名字': self.名字,
49 | '立繪': 立繪,
50 | '表情': 表情,
51 | '語者': self.語者,
52 | '背景': self.背景,
53 | '背景音樂': self.背景音樂,
54 | '效果音': self.效果音,
55 | '插入圖': self.插入圖,
56 | 'cg': self.cg,
57 | '視頻': self.視頻,
58 | 'js': self.js,
59 | 'html': self.html,
60 | '選項': [i[0] for i in self.選項],
61 | '特效表': copy.deepcopy(self.特效表),
62 | '額外信息': self.額外信息,
63 | '源': self.源,
64 | }
65 | self.清除臨時狀態()
66 | return 快照
67 |
68 | def 重置(self):
69 | self.__init__()
70 |
71 | def 清除臨時狀態(self):
72 | self.js = None
73 | self.插入圖 = None
74 | self.效果音 = None
75 | self.視頻 = None
76 | self.額外信息 = ()
77 | self.源 = []
78 |
79 |
80 | class 劇本:
81 | def __init__(self, 內容, 名):
82 | self.內容 = 內容
83 | self.指針 = 0
84 | self.名 = 名
85 |
86 | def 下一句(self):
87 | if self.指針 >= len(self.內容):
88 | return None
89 | r = self.內容[self.指針]
90 | self.指針 += 1
91 | return r
92 |
93 |
94 | class 讀者:
95 | def __init__(self, 初始劇本):
96 | self.劇本棧 = [self.編譯(初始劇本)]
97 | self.狀態 = 狀態()
98 | self.狀態.重置()
99 | self.箱庭 = 箱庭.箱庭(self)
100 | 鏡頭.鏡頭對應 = {}
101 |
102 | @property
103 | def 劇本文件(self):
104 | return self.劇本棧[-1]
105 |
106 | def 下一句(self):
107 | if not self.劇本棧:
108 | return {'旁白': '【演出結束了】 ', '類型': '終焉'}
109 | s = self.劇本文件.下一句()
110 | if s:
111 | return s
112 | else:
113 | self.劇本棧.pop()
114 | return self.下一句()
115 |
116 | def 編譯(self, s):
117 | with good_open(s) as f:
118 | return 劇本(liber.load(f), s)
119 |
120 | def 步進(self, 防止終焉=False):
121 | s = self.下一句()
122 | if s['類型'] == '終焉' and 防止終焉:
123 | return True
124 | self.狀態.源.append(copy.copy(s))
125 | 讀者句控制(self, s['類型'], s)
126 |
127 | def 迭代器(self):
128 | while True:
129 | self.步進()
130 | s = self.狀態.導出()
131 | if s['額外信息'] and s['額外信息'][0] == '終焉':
132 | break
133 | else:
134 | yield s
135 |
136 | def 從一而終(self, 劇本):
137 | self.__init__(劇本)
138 | logging.debug(self.劇本文件.內容)
139 | while True:
140 | if self.步進(防止終焉=True):
141 | break
142 |
143 | def 存檔(self, 路徑, 存檔信息=None):
144 | 虛擬機狀態 = {
145 | '讀者狀態': self.狀態,
146 | '角色表': 角色.角色表,
147 | '鏡頭對應': 鏡頭.鏡頭對應,
148 | '劇本棧': self.劇本棧,
149 | '箱庭': self.箱庭,
150 | }
151 | with open(路徑, 'wb') as f:
152 | pickle.dump({
153 | '虛擬機狀態': 虛擬機狀態,
154 | '存檔信息': 存檔信息
155 | }, f)
156 |
157 | def 讀檔(self, 路徑):
158 | try:
159 | with open(路徑, 'rb') as f:
160 | data = pickle.load(f)['虛擬機狀態']
161 | 角色.角色表 = data['角色表']
162 | 鏡頭.鏡頭對應 = data['鏡頭對應']
163 | self.狀態 = data['讀者狀態']
164 | self.狀態.額外信息 = ('load',)
165 | self.劇本棧 = data['劇本棧']
166 | self.箱庭 = data['箱庭']
167 | except Exception as e:
168 | logging.warning('讀檔失敗……')
169 | logging.exception(e)
170 |
171 |
172 | class 讀者句控制:
173 | def __init__(self, 讀者, 類型, 參數表):
174 | del 參數表['類型']
175 | if '縮進數' in 參數表:
176 | del 參數表['縮進數']
177 | if '之後的空白' in 參數表:
178 | del 參數表['之後的空白']
179 | logging.debug(類型)
180 | logging.debug(參數表)
181 | 讀者句控制.__getattribute__(self, 類型)(讀者, **參數表)
182 |
183 | @staticmethod
184 | def 註釋(讀者, 註釋):
185 | 讀者.步進()
186 |
187 | @staticmethod
188 | def 躍點(讀者, 躍點):
189 | 讀者.步進()
190 |
191 | @staticmethod
192 | def 函數調用(讀者, 函數, 參數表, 原文):
193 | 命令.命令(函數, 參數表, 原文).執行(讀者)
194 | if not 讀者.狀態.選項:
195 | 讀者.步進()
196 |
197 | @staticmethod
198 | def 插入代碼(讀者, 代碼類型, 代碼內容):
199 | if 代碼類型 in ['', 'py', 'python']:
200 | exec(代碼內容, 讀者.箱庭.箱庭內容)
201 | elif 代碼類型 in ['js', 'javascript']:
202 | 讀者.狀態.js = 代碼內容
203 | elif 代碼類型 in ['html']:
204 | 讀者.狀態.html = 代碼內容
205 | elif 代碼類型 in ['css']:
206 | 讀者.狀態.html = f''
207 | elif 代碼類型 in ['sass']:
208 | 讀者.狀態.html = f''
209 | elif 代碼類型 in ['scss']:
210 | 讀者.狀態.html = f''
211 | else:
212 | raise Exception(f'『{代碼類型}』代碼類型不明白。')
213 | if not 讀者.狀態.選項:
214 | 讀者.步進()
215 |
216 | @staticmethod
217 | def 插入圖(讀者, 插入圖):
218 | logging.debug('插入圖: %s' % 插入圖)
219 | 讀者.狀態.插入圖 = 插入圖
220 |
221 | @staticmethod
222 | def 終焉(讀者, 旁白):
223 | 讀者.狀態.額外信息 = ('終焉',)
224 | 讀者.狀態.話語 = 旁白
225 | 讀者.狀態.名字 = ''
226 | 讀者.狀態.語者 = ''
227 |
228 | @staticmethod
229 | def 鏡頭(讀者, 鏡頭符號, 內容):
230 | if 鏡頭符號 == '+':
231 | try:
232 | d = yaml.load(內容)
233 | 鏡頭.生成鏡頭(d)
234 | except Exception as e:
235 | logging.exception(e)
236 | logging.warning(f'鏡頭「{內容}」的內容不正確。')
237 | 讀者.步進()
238 | elif 鏡頭符號 == '-':
239 | try:
240 | 鏡頭.解除鏡頭(yaml.load(內容))
241 | except Exception as e:
242 | logging.exception(e)
243 | logging.warning(f'鏡頭「{內容}」的內容不正確。')
244 | 讀者.步進()
245 |
246 | @staticmethod
247 | def 旁白(讀者, 旁白):
248 | 讀者.狀態.話語 = 旁白
249 | 讀者.狀態.名字 = ''
250 | 讀者.狀態.語者 = ''
251 |
252 | @staticmethod
253 | def 人物操作(讀者, 人物名, 目標, 操作符):
254 | if 操作符 == '+':
255 | 角色.取角色(人物名).現衣 = 目標
256 | if 操作符 == '|':
257 | 角色.取角色(人物名).顯示名字 = 目標
258 | 讀者.步進()
259 |
260 | @staticmethod
261 | def 人物對話(讀者, 名, 顏, 語, 代, 特效):
262 | 人物 = 讀者句控制._表情變化(讀者, 名, 顏, 代, 特效)
263 | 讀者.狀態.話語 = 語
264 | 讀者.狀態.名字 = 代 or 人物.顯示名字 or 名
265 | 讀者.狀態.語者 = 名
266 | logging.debug([名, 代, 顏, 語].__str__())
267 |
268 | @staticmethod
269 | def 人物表情(讀者, 名, 顏, 代, 特效):
270 | 人物 = 讀者句控制._表情變化(讀者, 名, 顏, 代, 特效)
271 | logging.debug([名, 代, 顏].__str__())
272 | 讀者.步進()
273 |
274 | @staticmethod
275 | def 選項(讀者, 選項名, 文件, 位置):
276 | 讀者.狀態.選項.append([選項名, lambda: 讀者.箱庭.棧跳轉(文件, 位置)])
277 | if 讀者.劇本文件.指針 < len(讀者.劇本文件.內容):
278 | if 讀者.劇本文件.內容[讀者.劇本文件.指針]['類型'] == '選項':
279 | 讀者.步進()
280 |
281 | @staticmethod
282 | def _表情變化(讀者, 名, 顏, 代, 特效):
283 | 人物 = 角色.取角色(名)
284 | 人物.現顏 = 顏
285 | if 特效:
286 | 人物.現特效 = [特效]
287 | else:
288 | 人物.現特效 = []
289 | if 鏡頭.查詢(名) and 讀者.狀態.人物 != 名:
290 | 讀者.狀態.人物 = 名
291 | return 人物
292 |
--------------------------------------------------------------------------------
/librian/librian本體/librian虛擬機/鏡頭.py:
--------------------------------------------------------------------------------
1 | import logging
2 |
3 | from . import 立繪
4 | from . import 虛擬機環境
5 |
6 | 語者 = ''
7 |
8 | 鏡頭對應 = {}
9 |
10 | 上次位置 = {}
11 |
12 |
13 | class 鏡頭:
14 | def __init__(self, 所有位置):
15 | self.所有位置 = 所有位置
16 | for 人, 位置 in 所有位置.items():
17 | 鏡頭對應[人] = self
18 | if len(位置) == 2:
19 | 位置.append(1)
20 |
21 | def 統合(self):
22 | global 上次位置
23 | t = {}
24 | for 人 in self.所有位置:
25 | 位置 = self.所有位置[人]
26 | t[人] = {
27 | '位置': 位置,
28 | '語': 人 == 語者
29 | }
30 | 上次位置 = {}
31 | for 人 in self.所有位置:
32 | 上次位置[人] = self.所有位置[人]
33 | return t
34 |
35 | def 拆解(self):
36 | 立繪組 = [立繪.人物拆解(人, 參數) for 人, 參數 in self.統合().items()]
37 | return [立繪 for 立繪 in 立繪組 if 立繪 is not None]
38 |
39 | def __repr__(self):
40 | return str(self.所有位置)
41 |
42 | def __bool__(self):
43 | return bool(self.所有位置)
44 |
45 |
46 | 空鏡頭 = 鏡頭({})
47 |
48 |
49 | def 查詢(人):
50 | if 人 not in 鏡頭對應:
51 | 鏡頭({人: 虛擬機環境.默認立繪位置[1][0]})
52 | return 鏡頭對應[人]
53 |
54 | # ['潘大爺'] -> {'潘大爺':[0,0]}
55 |
56 |
57 | def 生成鏡頭(x):
58 | if type(x) == dict:
59 | return 鏡頭(x)
60 | if type(x) == list:
61 | m = 虛擬機環境.默認立繪位置[len(x)]
62 | a = dict(zip(x, m))
63 | return 鏡頭(a)
64 |
65 |
66 | def 解除鏡頭(人):
67 | 鏡頭對應[人] = 空鏡頭
68 |
69 |
70 | if __name__ == '__main__':
71 | print(查詢('潘大爺'))
72 | print(空鏡頭)
73 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/adv.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | 加載資源
14 |
15 |
18 |
23 |
24 |
25 |
26 |
46 |
79 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/adv.ptml:
--------------------------------------------------------------------------------
1 | html:
2 | head:
3 | title:
4 | meta charset='utf-8';
5 | link rel="stylesheet" href='./黑科技/font-awesome-4.7.0/css/font-awesome.css';
6 | script src='./虛擬核心.js':
7 | script src='./dist/bundle.js':
8 |
9 | style#style:
10 |
11 | body oncontextmenu='window.event.returnValue=false;':
12 | div#加載畫面:
13 | div:
14 | 加載資源
15 | div:
16 | progress v-bind:value='計數' v-bind:max='最大值':
17 | div v-if='計數 == 最大值':
18 | a onclick='加載完成的初始化()':
19 | 開始
20 | div#總畫面:
21 | video#視頻 width="1366" height="768" src="" autoplay="autoplay":
22 | div#配置面板:
23 | span.按鈕組:
24 | a#重置設置:
25 | i.fa.fa-rotate-left:
26 | a#退出設置:
27 | i.fa.fa-check:
28 | div v-for='(內容, 設置名) in 用戶設置' v-bind:名字='設置名':
29 | template v-if='內容.類型 === "number"':
30 | {{內容.提示[0]}}
31 | input type="range" v-bind:min="內容.範圍[0]" v-bind:max="內容.範圍[1]" v-bind:step='(內容.範圍[1]-內容.範圍[0])/32' v-model="內容['值']":
32 | {{內容.提示[1]}}
33 | template v-if='內容.類型 === "boolean"':
34 | input type="checkbox" v-model="內容['值']":
35 |
36 | div#存檔讀檔面板 v-if='本地運行':
37 | span.按鈕組:
38 | a#新建存檔 v-if='存檔讀檔.啓動功能 === "存檔"':
39 | i.fa.fa-plus:
40 | a#退出存檔讀檔:
41 | i.fa.fa-close:
42 | {{存檔讀檔.啓動功能}}
43 | hr;
44 | div#檔表:
45 | template v-for='檔 in 存檔讀檔.檔表':
46 | div.檔 v-bind:名字='檔.名字':
47 | img.截圖 v-bind:src='檔.截圖';
48 | div.信息:
49 | {{檔.名字}}
50 | br;
51 | {{檔.描述}}
52 | br;
53 | {{檔.時間}}
54 | a.讀取 v-if='存檔讀檔.啓動功能 === "讀檔"':
55 | 讀取
56 | a.覆蓋 v-if='存檔讀檔.啓動功能 === "存檔"':
57 | 覆蓋
58 | hr;
59 |
60 | div#工具欄:
61 | div#工具容器 v-bind:class="{自動收起: 用戶設置.自動收起控制面板.值}":
62 | a#存檔準備 v-if='本地運行':
63 | i.fa.fa-floppy-o:
64 | i.fa.fa-angle-double-down style='text-shadow:0 0 4px #000;':
65 | a#讀檔準備 v-if='本地運行':
66 | i.fa.fa-floppy-o:
67 | i.fa.fa-angle-double-up style='text-shadow:0 0 4px #000;':
68 | a#快速存檔 v-if='本地運行':
69 | i.fa.fa-floppy-o:
70 | i.fa.fa-angle-double-down style='color:#fd1; text-shadow:0 0 4px #000;':
71 | a#快速讀檔 v-if='本地運行':
72 | i.fa.fa-floppy-o:
73 | i.fa.fa-angle-double-up style='color:#fd1; text-shadow:0 0 4px #000;':
74 | a#切換快進:
75 | i.fa.fa-fast-forward:
76 | a#全屏 href='javascript:山彥.切換全屏();':
77 | i.fa.fa-arrows-alt:
78 | a#進入設置:
79 | i.fa.fa-gear:
80 | a#回標題 v-if='本地運行':
81 | i.fa.fa-mail-reply:
82 |
83 | div#adv畫面:
84 | div#選項:
85 | div#對話歷史:
86 | div#主畫面:
87 | div#覆蓋:
88 | div#html疊加:
89 | div#cg:
90 | div#bg:
91 | div#立繪:
92 | div#對話框:
93 | div#名字框:
94 | div#名字:
95 | div#名字框背景 v-bind:style="{opacity: 用戶設置.對話框背景透明度.值}":
96 | div#話語框:
97 | div#話語:
98 | div#話語框背景 v-bind:style="{opacity: 用戶設置.對話框背景透明度.值}":
99 | div#對話框背景 v-bind:style="{opacity: 用戶設置.對話框背景透明度.值}":
100 |
101 | div#提示:
102 |
103 | div#墊底:
104 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "q",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "webpack.config.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "devDependencies": {
12 | "coffee-loader": "^0.9.0",
13 | "coffeescript": "^2.5.0",
14 | "css-loader": "^5.0.0",
15 | "file-loader": "^4.3.0",
16 | "imports-loader": "^0.8.0",
17 | "jquery": "^3.4.1",
18 | "jquery-browserify": "^1.8.1",
19 | "jquery-mousewheel": "^3.1.13",
20 | "node-opencc": "^2.0.1",
21 | "node-sass": "^4.13.0",
22 | "psd.js": "^3.3.12",
23 | "resolve-url-loader": "^3.1.0",
24 | "sass-loader": "^8.0.0",
25 | "style-loader": "^1.3.0",
26 | "vue": "^2.6.11",
27 | "webpack": "^4.43.0",
28 | "webpack-cli": "^3.3.12",
29 | "webpackbar": "^4.0.0"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/_統合.sass:
--------------------------------------------------------------------------------
1 | @import "按鈕.sass"
2 | @import "狀態切換.sass"
3 | @import "主樣式.sass"
4 | @import "特效.sass"
5 | @import "加載畫面.sass"
6 | @import "各種面板.sass"
7 | @import "對話框.sass"
8 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/psd處理.coffee:
--------------------------------------------------------------------------------
1 | import PSD from 'psd.js'
2 |
3 |
4 | psd緩存 = {}
5 | 圖層緩存 = {}
6 | 圖緩存 = {}
7 |
8 | export default psd拆包 =
9 |
10 | 獲取圖層: (psd路徑, 圖層名) ->
11 | if not psd緩存[psd路徑]
12 | psd緩存[psd路徑] = await PSD.fromURL(psd路徑)
13 | psd = psd緩存[psd路徑]
14 |
15 | key = [psd路徑, 圖層名].toString()
16 | if not 圖層緩存[key]
17 | 現層 = psd.tree().childrenAtPath(圖層名)[0]
18 | 圖層緩存[key] = {
19 | '位置': 現層.coords
20 | 'img': 現層.layer.image.toPng()
21 | }
22 | return 圖層緩存[key]
23 |
24 | 獲取圖層組: (psd路徑, 圖層名組) ->
25 | return (
26 | for i, 圖層名 of 圖層名組
27 | await this.獲取圖層(psd路徑, 圖層名)
28 | )
29 |
30 | 圖層融合: (圖層組) ->
31 | m = 0
32 |
33 | 極x = Math.max.apply(Math, (圖層.位置.right for 圖層 in 圖層組))
34 | 極y = Math.max.apply(Math, (圖層.位置.bottom for 圖層 in 圖層組))
35 |
36 | canvas = document.createElement('canvas')
37 | canvas.width = 極x
38 | canvas.height = 極y
39 |
40 | context = canvas.getContext('2d')
41 | for 圖層 in 圖層組
42 | {left, top, bottom, right} = 圖層.位置
43 | context.drawImage(圖層.img, left, top)
44 |
45 | base64 = canvas.toDataURL('image/png')
46 |
47 | return [極x, 極y, base64]
48 |
49 | 融合到div: (base64, width, height, 過渡時間, div名) ->
50 | dv = document.getElementById(div名)
51 | dv.style.transition = "background #{過渡時間}s, width #{過渡時間}s, height #{過渡時間}s"
52 | dv.style.width = width
53 | dv.style.height = height
54 | dv.style.backgroundImage = "url(#{base64})"
55 |
56 | 渲染圖層組到div: (psd路徑, 圖層名組, div名) ->
57 | key = [psd路徑, 圖層名組].toString()
58 | if not 圖緩存[key]
59 | 圖層組 = await this.獲取圖層組(psd路徑, 圖層名組)
60 | 圖緩存[key] = this.圖層融合(圖層組)
61 | [width, height, base64] = 圖緩存[key]
62 | this.融合到div(base64, width, height, 0.5, div名)
63 |
64 | 渲染png到div: (png路徑, div名) ->
65 | t = new Image()
66 | t.setAttribute("crossOrigin", 'Anonymous')
67 | t.src = png路徑
68 | t.onload = () =>
69 | [width, height, base64] = this.圖層融合([{
70 | '位置':
71 | 'top': 0,
72 | 'left': 0,
73 | 'bottom': t.height,
74 | 'right': t.width,
75 | 'img': t,
76 | }])
77 | this.融合到div(base64, width, height, 0.5, div名)
78 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/主樣式.sass:
--------------------------------------------------------------------------------
1 | @font-face
2 | font-family: 思源宋體SemiBold
3 | src: url('../素材/NotoSerifSC-SemiBold.otf')
4 |
5 | body
6 | font-family: 思源宋體SemiBold
7 | line-height: 1.5
8 | margin: 0px
9 | padding: 0px
10 | -webkit-user-select: none
11 | color: #fff
12 | overflow: hidden
13 | background-color: #fff
14 | background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee), linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee)
15 | background-size: 24px 24px
16 | background-position: 0px 0px, 12px 12px
17 |
18 | div
19 | margin: 0px
20 | padding: 0px
21 |
22 | #總畫面
23 | position: relative
24 |
25 | #視頻
26 | position: absolute
27 | z-index: 999
28 | display: None
29 |
30 | #adv畫面
31 | width: 100%
32 | height: 100%
33 | position: relative
34 | margin: 0
35 | overflow: hidden
36 | #覆蓋
37 | width: 100%
38 | height: 100%
39 | position: absolute
40 | background-size: cover
41 | z-index: 99
42 | #選項
43 | position: absolute
44 | width: 60%
45 | height: 60%
46 | left: 20%
47 | top: 20%
48 | font-size: 27px
49 | z-index: 20
50 | display: None
51 | #主畫面
52 | width: 100%
53 | height: 100%
54 | #bg, #cg, #html疊加
55 | width: 100%
56 | height: 100%
57 | position: absolute
58 | background-size: cover
59 | #bg
60 | z-index: -10
61 | #cg
62 | z-index: -1
63 | #立繪
64 | position: absolute
65 | top: 0px
66 | left: 0px
67 | z-index: -2
68 | &>div
69 | position: absolute
70 | transform-origin: 0% 0%
71 | #對話框
72 | width: 1000px
73 | height: 240px
74 | color: #fff
75 | font-size: 24px
76 | margin: 0 auto
77 | text-shadow: 0px 0px 3px #000, 0px 0px 3px #000
78 | position: absolute
79 | top: 528px
80 | left: 185px
81 | #名字框
82 | opacity: 0
83 | transition: opacity 0.3s, width 0.3s
84 | position: absolute
85 | top: 0px
86 | left: 80px
87 | #話語框
88 | position: absolute
89 | top: 25%
90 | z-index: 10
91 | width: 100%
92 | height: 100%
93 | #話語
94 | white-space: pre-line
95 | &[對話類型=旁白] #話語
96 | // text-indent: 2em each-line
97 | --幹你娘老子就是要每行都縮進: 2
98 | &[對話類型=對話] #話語
99 | &:before
100 | content: '「'
101 | display: block
102 | height: 100%
103 | float: left
104 | &>span:nth-last-child(1):after
105 | content: '」'
106 | #名字框背景
107 | position: absolute
108 | top: 0px
109 | left: 0px
110 | z-index: -1
111 | width: 100%
112 | height: 100%
113 | #話語框背景
114 | position: absolute
115 | top: 0px
116 | left: 0px
117 | z-index: -1
118 | width: 100%
119 | height: 100%
120 |
121 | .舊淡出
122 | width: 100%
123 | height: 100%
124 | position: absolute
125 | background-size: cover
126 |
127 | #工具欄
128 | right: 0px
129 | bottom: 0px
130 | padding: 0px
131 | margin: 5px
132 | position: absolute
133 | z-index: 10
134 | #工具容器.自動收起
135 | opacity: 0
136 | transition: opacity 4s
137 | &:hover
138 | opacity: 1
139 | transition: opacity 0.5s
140 |
141 | #墊底
142 | position: absolute
143 | top: 0px
144 | left: 0px
145 | width: 100%
146 | height: 100%
147 | background: #000
148 | z-index: -999
149 |
150 | #提示
151 | position: absolute
152 | left: 0px
153 | top: 0px
154 | padding: 20px
155 | background: rgba(0, 0, 0, 0.65)
156 | z-index: 999
157 | width: 200px
158 | display: none
159 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/全局.coffee:
--------------------------------------------------------------------------------
1 | import Vue from 'vue/dist/vue.esm.js'
2 | import $ from 'jquery'
3 |
4 | import 演出 from './演出.coffee'
5 | import 控制 from './控制.coffee'
6 | import 存檔讀檔 from './存檔讀檔.coffee'
7 |
8 | cccc = require('./_統合.sass')
9 | console.log cccc
10 |
11 | window._py演出 = 演出
12 |
13 | window.onload = ->
14 | 查詢參數 = {}
15 | new URLSearchParams(window.location.search).forEach (value, key)->
16 | 查詢參數[key] = value
17 | if window.山彥
18 | console.log '在本地演出'
19 | 本地運行(查詢參數['入口'])
20 | else
21 | console.log '在瀏覽器上演出'
22 | 在線運行()
23 | 控制.控制初始化()
24 |
25 | 本地運行 = (入口)->
26 | window.v = new Vue
27 | el: '#總畫面'
28 | data:
29 | 本地運行: true
30 | 圖片文件夾: ''
31 | 音樂文件夾: ''
32 | 視頻文件夾: ''
33 | psd立繪路徑: ''
34 | 自定css: ''
35 | 主題css: ''
36 | 解析度: ''
37 | 邊界: ''
38 | 翻譯: false
39 | 存檔讀檔:
40 | 啓動功能: '???'
41 | 檔表: []
42 | 用戶設置:
43 | 文字速度:
44 | 類型: 'number'
45 | 值: 35
46 | 範圍: [0, 100]
47 | 提示: ['須臾', '永恆']
48 | 對話框背景透明度:
49 | 類型: 'number'
50 | 值: 0.8
51 | 範圍: [0, 1]
52 | 提示: ['通透', '固實']
53 | 總體音量:
54 | 類型: 'number'
55 | 值: 1
56 | 範圍: [0, 1]
57 | 提示: ['小聲', '大聲(沒用)']
58 | 自動收起控制面板:
59 | 類型: 'boolean'
60 | 值: false
61 | watch:
62 | $data:
63 | handler: (val, oldVal) ->
64 | 山彥.vue更新(val)
65 | deep: true
66 | 山彥.vue連接初始化((x)->
67 | for a,b of x
68 | v[a]=b
69 | )
70 | if 入口=='讀檔'
71 | 山彥.初始化 ->
72 | 演出.準備工作()
73 | 存檔讀檔.讀檔準備()
74 | else
75 | 山彥.初始化 ->
76 | 演出.準備工作()
77 | 演出.更新()
78 |
79 |
80 |
81 | 從虛擬核心提取資源 = (心)->
82 | 集合 = {}
83 | 步 = JSON.parse(JSON.stringify(心.演出步))
84 | for data in 步
85 | if data.背景
86 | 集合["#{v.圖片文件夾}/#{data.背景[0]}"] = true
87 | if data.cg
88 | 集合["#{v.圖片文件夾}/#{data.cg[0]}"] = true
89 | if data.插入圖
90 | 集合["#{v.圖片文件夾}/#{data.插入圖}"] = true
91 | for 人 in data.立繪
92 | 集合["#{v.psd立繪路徑}/#{人.名字}.psd"] = true
93 | return (i for i of 集合)
94 |
95 | window.加載完成的初始化 = ->
96 | $('#加載畫面').fadeOut()
97 | 山彥.初始化 ->
98 | 演出.準備工作()
99 | 演出.更新()
100 |
101 | 在線運行 = ->
102 | if typeof(虛擬核心) == "undefined"
103 | alert '無法加載虛擬核心。'
104 | return
105 |
106 | ua = window.navigator.userAgent
107 | isChrome = ua.indexOf("Chrome") && window.chrome
108 | if not isChrome
109 | alert '只有chrome能用。'
110 | return
111 |
112 | $('#加載畫面').css('display', 'flex')
113 |
114 | window.山彥 =
115 | n: 0
116 | 步進: ->
117 | this.n += 1
118 | 更新: ->
119 | 演出.改變演出狀態(虛擬核心.演出步[this.n])
120 | 狀態回調: (步進, callback)->
121 | if 步進
122 | this.步進()
123 | callback(虛擬核心.演出步[this.n])
124 | 初始化: (callback)->
125 | callback()
126 | 切換全屏: ->
127 | doc = window.document
128 | docEl = doc.documentElement
129 |
130 | requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen
131 | cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen
132 |
133 | if(!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement)
134 | requestFullScreen.call(docEl)
135 | else
136 | cancelFullScreen.call(doc)
137 |
138 | window.v = new Vue
139 | el: '#總畫面'
140 | data:
141 | 本地運行: false
142 | 圖片文件夾: 虛擬核心.圖片文件夾
143 | 音樂文件夾: 虛擬核心.音樂文件夾
144 | 視頻文件夾: 虛擬核心.視頻文件夾
145 | psd立繪路徑: 虛擬核心.psd立繪路徑
146 | 自定css: 虛擬核心.自定css
147 | 主題css: 虛擬核心.主題css
148 | 解析度: 虛擬核心.解析度
149 | 邊界: 虛擬核心.邊界
150 | 翻譯: false
151 | 用戶設置:
152 | 文字速度:
153 | 類型: 'number'
154 | 值: 35
155 | 範圍: [0, 100]
156 | 提示: ['須臾', '永恆']
157 | 對話框背景透明度:
158 | 類型: 'number'
159 | 值: 0.8
160 | 範圍: [0, 1]
161 | 提示: ['通透', '固實']
162 | 總體音量:
163 | 類型: 'number'
164 | 值: 1
165 | 範圍: [0, 1]
166 | 提示: ['小聲', '大聲(沒用)']
167 | 自動收起控制面板:
168 | 類型: 'boolean'
169 | 值: false
170 |
171 | 資源組 = 從虛擬核心提取資源(虛擬核心)
172 | window.v加載 = new Vue
173 | el: '#加載畫面'
174 | data:
175 | 最大值: 資源組.length
176 | 計數: 0
177 | for 資源 in 資源組
178 | console.log 資源
179 | $.get(資源, ->
180 | v加載.計數+=1
181 | )
182 | $('title').html 虛擬核心.作品名
183 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/加載畫面.sass:
--------------------------------------------------------------------------------
1 | @import "../黑科技/synthetic_css/synthetic_offline.sass"
2 |
3 | #加載畫面
4 | background-image: url('../黑科技/synthetic_css/紙背景花紋.webp')
5 | color: 000
6 | display: none
7 | flex-direction: column
8 | justify-content: center
9 | align-items: center
10 | height: 100%
11 | width: 100%
12 | a
13 | @extend a, .synth
14 | progress
15 | @extend progress, .synth
16 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/各種面板.sass:
--------------------------------------------------------------------------------
1 | @import "../黑科技/synthetic_css/synthetic_offline.sass"
2 |
3 | =面板
4 | @extend div, .synth
5 | background-image: url('../黑科技/synthetic_css/紙背景花紋.webp')
6 | background-attachment: scroll
7 | color: #000
8 | font-size: 24px
9 | border-radius: 1vw
10 | .按鈕組
11 | position: absolute
12 | right: 2%
13 | top: 2%
14 |
15 | #存檔讀檔面板
16 | +面板
17 | position: absolute
18 | top: 12%
19 | left: 12%
20 | height: 70%
21 | width: 72%
22 | padding: 2% 2% 2% 2%
23 | z-index: 999
24 | a
25 | @extend a, .synth
26 | padding: 8px
27 | margin: 8px
28 | border-radius: 8px
29 | hr
30 | width: 90%
31 | border: none
32 | border-top: 1px solid rgba(120, 50, 0, 0.5)
33 | .檔
34 | display: flex
35 | justify-content: space-between
36 | align-items: center
37 | width: 100%
38 | .截圖
39 | width: 160px
40 | height: 90px
41 | border: 1px solid rgba(0,0,0,0.34)
42 | border-radius: 3px
43 | margin: 15px
44 | .信息
45 | flex-grow: 999
46 |
47 | #配置面板
48 | +面板
49 | position: absolute
50 | top: 10%
51 | left: 10%
52 | height: 74%
53 | width: 76%
54 | padding: 4% 2% 2% 2%
55 | z-index: 998
56 | a
57 | @extend a, .synth
58 | padding: 8px
59 | margin: 8px
60 | border-radius: 8px
61 | input
62 | @extend input, .synth
63 | &>div
64 | height: 80px
65 | display: flex
66 | align-items: center
67 | &::before
68 | content: '【' attr(名字) '】'
69 |
70 | #對話歷史
71 | +面板
72 | position: absolute
73 | top: 10%
74 | left: 18%
75 | width: 60%
76 | height: 80%
77 | padding: 0 2%
78 | z-index: 10
79 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/存檔讀檔.coffee:
--------------------------------------------------------------------------------
1 | import Vue from 'vue/dist/vue.esm.js'
2 | import $ from 'jquery'
3 |
4 | import 演出 from './演出.coffee'
5 |
6 |
7 | export default 存檔讀檔 =
8 | 存檔準備: ->
9 | 山彥.取檔 (檔表) ->
10 | v.存檔讀檔.檔表 = 檔表
11 | v.存檔讀檔.啓動功能 = '存檔'
12 | $('#總畫面').attr('存檔讀檔面板', 'on')
13 | 讀檔準備: ->
14 | 山彥.取檔 (檔表) ->
15 | v.存檔讀檔.檔表 = 檔表
16 | v.存檔讀檔.啓動功能 = '讀檔'
17 | $('#總畫面').attr('存檔讀檔面板', 'on')
18 | 存檔: (名字, 描述)->
19 | this.截圖轉換 160, 90, (截圖)->
20 | 山彥.存檔(名字, 描述, 截圖)
21 | 山彥.取檔 (檔表) ->
22 | v.存檔讀檔.檔表 = 檔表
23 | 讀檔: (名字)->
24 | 山彥.讀檔(名字)
25 | $('#總畫面').attr('存檔讀檔面板', 'off')
26 | 快速存檔: ->
27 | 山彥.快速存檔()
28 | 快速讀檔: ->
29 | 山彥.快速讀檔()
30 | 截圖轉換: (x, y, 回調)->
31 | bg = 演出.當前狀態.背景[0].slice(5,-2)
32 | t = new Image()
33 | t.src = bg
34 | t.setAttribute("crossOrigin", 'Anonymous')
35 | t.onload = ->
36 | canvas = document.createElement("canvas")
37 | canvas.width = x
38 | canvas.height = y
39 | context = canvas.getContext("2d")
40 | context.drawImage(t, 0, 0, 160, 90)
41 | base64 = canvas.toDataURL("image/webp")
42 | 回調(base64)
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/按鈕.sass:
--------------------------------------------------------------------------------
1 | #工具欄 a
2 | display: block
3 | margin: 10px
4 | cursor: pointer
5 | font-size: 25px
6 | text-decoration: none
7 | text-align: center
8 | height: 40px
9 | width: 40px
10 | border-radius: 50%
11 | position: relative
12 | z-index: 1
13 | color: #fff
14 | transition: transform 0.1s
15 | &:before
16 | position: absolute
17 | width: 100%
18 | height: 100%
19 | background-color: rgba(255, 255, 255, 0.2)
20 | display: block
21 | content: ''
22 | border-radius: 50%
23 | transition: background-color 0.1s, transform 0.1s
24 | &:hover:before
25 | background-color: rgba(255, 255, 255, 0.4)
26 | transform: scale(1.2)
27 | transition: background-color 0.1s, transform 0.1s
28 |
29 | & > i
30 | display: block
31 | position: absolute
32 | top: 50%
33 | left: 50%
34 | transform: translate(-50%, -50%)
35 |
36 | #選項 a
37 | display: block
38 | width: 100%
39 | padding: 10px
40 | margin: 10px
41 | text-align: center
42 | border-radius: 3px
43 | background: rgba(0, 0, 0, 0.5)
44 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6), 0px 0px 5px rgba(0, 0, 0, 0) inset
45 | cursor: pointer
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/控制.coffee:
--------------------------------------------------------------------------------
1 | $ = require('jquery-browserify')
2 | require("imports-loader?define=>false!jquery-mousewheel")($)
3 |
4 | import 演出 from './演出.coffee'
5 | import 存檔讀檔 from './存檔讀檔.coffee'
6 |
7 |
8 | export default 控制 =
9 | 右鍵功能: ->
10 | window.event.returnValue = false
11 | $('#總畫面').attr('歷史', 'off')
12 | if $('#總畫面').attr('對話框') == 'off'
13 | $('#總畫面').attr('對話框', 'on')
14 | else
15 | $('#總畫面').attr('對話框', 'off')
16 |
17 | 左鍵屏蔽: false
18 | 左鍵功能: ->
19 | if this.左鍵屏蔽 or 演出.選擇之刻
20 | return
21 |
22 | if $('#總畫面').attr('歷史') == 'on'
23 | $('#總畫面').attr('歷史', 'off')
24 |
25 | if $('#總畫面').attr('對話框') == 'off'
26 | $('#總畫面').attr('對話框', 'on')
27 | else
28 | if Date.now() < 演出.淡入過期時間
29 | 演出.淡入過期時間 = 0
30 | 演出.早泄()
31 | else
32 | 演出.步進更新()
33 |
34 | 顯示履歷: ->
35 | $('#總畫面').attr('歷史', 'on')
36 | $('#總畫面').attr('對話框', 'off')
37 | $('#對話歷史').scrollTop($('#對話歷史')[0].scrollHeight)
38 |
39 | 正在快進: false,
40 |
41 | 開始快進: ->
42 | if this.正在快進 == false
43 | this.正在快進 = true
44 | this.快進輪迴()
45 | 結束快進: ->
46 | this.正在快進 = false
47 |
48 | 切換快進: ->
49 | if this.正在快進 == false
50 | this.正在快進 = true
51 | this.快進輪迴()
52 | else
53 | this.正在快進 = false
54 |
55 | 快進輪迴: ->
56 | if not 控制.正在快進
57 | return
58 | else
59 | 控制.左鍵功能()
60 | setTimeout(控制.快進輪迴, 35)
61 |
62 | 進入設置: ->
63 | $('#總畫面').attr('配置面板', 'on')
64 |
65 | 退出設置: ->
66 | $('#總畫面').attr('配置面板', 'off')
67 |
68 | 退出存檔讀檔: ->
69 | $('#總畫面').attr('存檔讀檔面板', 'off')
70 |
71 | 控制初始化: ->
72 | window.document.onkeydown = (evt) ->
73 | k = evt.keyCode
74 | # [ctrl] skip
75 | if k == 17
76 | console.log 'ctrl按下'
77 | 控制.開始快進()
78 | # [空格 回車 z] 左鍵
79 | if k == 32 || k == 13 || k == 90
80 | 控制.左鍵功能()
81 | # [esc] 右鍵
82 | if k == 27
83 | 控制.右鍵功能()
84 | # [Page_up] 歷史
85 | if k == 33
86 | 控制.顯示履歷()
87 | window.document.onkeyup = (evt) ->
88 | # [ctrl] skip
89 | if evt.keyCode == 17
90 | console.log 'ctrl放開'
91 | 控制.結束快進()
92 |
93 | # 滚轮功能
94 | $('#主畫面').mousewheel (event, delta)->
95 | if delta > 0
96 | 控制.顯示履歷()
97 | if delta < 0
98 | 控制.左鍵功能()
99 |
100 | $("#主畫面").mousedown (e)->
101 | if e.which == 3
102 | 控制.右鍵功能()
103 | else if e.which == 1
104 | 控制.左鍵功能()
105 |
106 | $('#存檔準備').click ->
107 | 存檔讀檔.存檔準備()
108 | $('#讀檔準備').click ->
109 | 存檔讀檔.讀檔準備()
110 | $('#快速存檔').click ->
111 | 存檔讀檔.快速存檔()
112 | $('#快速讀檔').click ->
113 | 存檔讀檔.快速讀檔()
114 | $('#自動模式').click ->
115 | alert("沒做這個功能")
116 | $('#切換快進').click ->
117 | 控制.切換快進()
118 | $('#進入設置').click ->
119 | 控制.進入設置()
120 | $('#回標題').click ->
121 | 山彥.回標題()
122 |
123 | $('#退出設置').click ->
124 | 控制.退出設置()
125 | $('#退出存檔讀檔').click ->
126 | 控制.退出存檔讀檔()
127 |
128 | $('body').on 'click','.檔 > .讀取', (event)->
129 | 名字 = $(this).parent().attr('名字')
130 | 存檔讀檔.讀檔(名字)
131 |
132 | $('body').on 'click','.檔 > .覆蓋', (event)->
133 | 名字 = $(this).parent().attr('名字')
134 | 描述 = 演出.當前狀態.話語
135 | 存檔讀檔.存檔(名字, 描述)
136 |
137 | $('body').on 'click','#新建存檔', (event)->
138 | 名字 = '存檔' + new Date().getTime()
139 | 描述 = 演出.當前狀態.話語
140 | 存檔讀檔.存檔(名字, 描述)
141 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/演出.coffee:
--------------------------------------------------------------------------------
1 | import $ from 'jquery'
2 | import opencc from 'node-opencc'
3 |
4 | import 控制 from './控制.coffee'
5 | import psd處理 from './psd處理.coffee'
6 |
7 |
8 | export default 演出 =
9 | 準備工作: ->
10 | $ ' '
11 | .attr
12 | rel: 'stylesheet'
13 | type: 'text/css'
14 | href: v.主題css
15 | .appendTo("head")
16 | for i in v.自定css
17 | $ ' '
18 | .attr
19 | rel: 'stylesheet'
20 | type: 'text/css'
21 | href: i
22 | .appendTo('head')
23 |
24 | $('#總畫面').css 'width', v.解析度[0]
25 | $('#總畫面').css 'height', v.解析度[1]
26 |
27 | if v.邊界
28 | $ 'div'
29 | .css 'border','1px solid #22f'
30 |
31 | this.縮放調整()
32 |
33 | 縮放調整: ->
34 | a = document.body.clientWidth / v.解析度[0]
35 | b = document.body.clientHeight / v.解析度[1]
36 | t = Math.min(a, b)
37 | $('#總畫面').css(
38 | "transform-origin": "0% 0%"
39 | "transform": "scale("+t+")"
40 | )
41 | setTimeout(演出.縮放調整, 200)
42 |
43 | 更新: (瞬間化=false)->
44 | 山彥.狀態回調 false, (狀態, 步進=false)->
45 | 演出.改變演出狀態(狀態, 瞬間化)
46 |
47 | 步進更新: (瞬間化=false)->
48 | 山彥.狀態回調 true, (狀態)->
49 | 演出.改變演出狀態(狀態, 瞬間化)
50 |
51 | 翻譯: (s)->
52 | if not v.翻譯
53 | return s
54 | return opencc[v.翻譯](s)
55 |
56 | 信息預處理: (data) ->
57 | if data.背景
58 | data.背景[0] = "url('#{v.圖片文件夾}/#{data.背景[0]}')".replace(/(\\)/g, '/')
59 | if data.cg
60 | data.cg[0] = "url('#{v.圖片文件夾}/#{data.cg[0]}')".replace(/\\/g, '/')
61 | if data.背景音樂
62 | data.背景音樂[0] = v.音樂文件夾 + '/' + data.背景音樂[0]
63 | if data.效果音
64 | data.效果音[0] = v.音樂文件夾 + '/' + data.效果音[0]
65 | if data.插入圖
66 | data.插入圖 = "url('#{v.圖片文件夾}/#{data.插入圖}')".replace(/\\/g, '/')
67 |
68 | 當前狀態: {}
69 | 改變演出狀態: (data, 瞬間化=false) ->
70 | console.log data
71 | this.信息預處理 data
72 | this.當前狀態 = data
73 | {特效表, 插入圖, 立繪, 名字, 話語, 額外信息, 語者, 背景, 背景音樂, 效果音, cg, 選項, js, html, 視頻} = data
74 | this.特效處理 特效表
75 | if 選項.length > 0
76 | this.處理選項 選項
77 | return
78 |
79 | if 插入圖
80 | this.換背景音樂(null)
81 | this.換圖('覆蓋', 插入圖, 0)
82 | $('#覆蓋').attr('顯現', 'true')
83 | return
84 | else
85 | if $('#覆蓋').attr('顯現') == 'true'
86 | 瞬間化 = true
87 | $('#覆蓋').attr('顯現', 'false')
88 |
89 | if 額外信息
90 | if 額外信息[0] == 'load'
91 | this.load特效()
92 | try
93 | eval(js)
94 | catch e
95 | console.log e
96 |
97 | $('#html疊加').html(html)
98 | this.放視頻(視頻)
99 | this.換cg(cg)
100 | this.換背景(背景, 瞬間化)
101 | this.換立繪(立繪, 瞬間化)
102 | this.換背景音樂(背景音樂)
103 | this.放效果音(效果音)
104 | this.換人名(語者, 名字)
105 | this.換對話(話語, 名字, 瞬間化)
106 |
107 | 特效處理: (特效表) ->
108 | 可特效块 = [
109 | '總畫面','adv畫面','主畫面','覆蓋','選項','cg','bg','立繪','對話歷史',
110 | '對話框','名字框','名字','名字框背景','話語框','話語','話語框背景',
111 | '對話框背景'
112 | ]
113 | for i in 可特效块
114 | if $('#' + i).attr('特效')
115 | $('#' + i).attr('特效', '')
116 | for i of 特效表
117 | $('#' + i).attr('特效', 特效表[i])
118 |
119 | 選擇之刻: false,
120 | 處理選項: (選項) ->
121 | $('#選項').html('')
122 | for i, p in 選項
123 | t = $("#{i} ")
124 | $('#選項').append(t)
125 | t.click () ->
126 | 演出.點選項(parseInt($(this).attr('選項號')))
127 | $('#選項').fadeIn(200)
128 | this.選擇之刻 = true
129 | 點選項: (x) ->
130 | $('#選項').fadeOut(50)
131 | 山彥.選(x)
132 | this.選擇之刻 = false
133 |
134 | 放視頻: (視頻) ->
135 | if ! 視頻
136 | return
137 | [視頻文件, 可以跳過] = 視頻
138 | video = $('#視頻')
139 | video.css('display', 'block')
140 | video.attr('src', v.視頻文件夾+'/' + 視頻文件)
141 | video.click if 可以跳過
142 | ->
143 | video.css('animation', '_黑出 0.5s')
144 | video.css('animation-fill-mode', 'forwards')
145 | setTimeout ->
146 | video.css('animation', '')
147 | video.attr('src', '')
148 | video[0].style.display = 'none'
149 | , 600
150 | else
151 | -> null
152 |
153 | video[0].addEventListener 'ended', ->
154 | video[0].style.display = 'none'
155 | , false
156 | video[0].play()
157 |
158 | load特效: ->
159 | 控制.左鍵屏蔽 = true
160 | $('#adv畫面').fadeOut(0)
161 | $('#adv畫面').fadeIn(400)
162 | setTimeout ->
163 | 控制.左鍵屏蔽 = false
164 | , 300
165 | 提示: (x) ->
166 | $('#提示').html(x)
167 | $('#提示').fadeIn(300)
168 | $('#提示').hide(1000)
169 |
170 | 現在cg: null,
171 | 換cg: (cg) ->
172 | if cg
173 | [cg圖片, 淡入時間, 漸變方法] = cg
174 | else
175 | [cg圖片, 淡入時間, 漸變方法] = ['', 0, '']
176 | if cg圖片 == this.現在cg
177 | return
178 | this.現在cg = cg圖片
179 | this.換圖('cg', cg圖片, 淡入時間, 漸變方法)
180 |
181 | 當前人物組: []
182 | 換立繪: (立繪組, 瞬=false) ->
183 | 名字組 = (立繪.名字 for 立繪 in 立繪組)
184 |
185 | # 垃圾回收
186 | for 名字 in this.當前人物組
187 | if 名字組.indexOf(名字) == - 1
188 | $("#立繪--#{名字}").remove()
189 | console.log "去除 #{名字}"
190 | else
191 | $("#立繪--#{名字}").attr('特效', '')
192 |
193 | # 新建
194 | for 名字 in 名字組
195 | if this.當前人物組.indexOf(名字) == - 1
196 | $('#立繪').append($(""))
197 | console.log "加入 #{名字}"
198 |
199 | # 設定位置
200 | for 立繪 in 立繪組
201 | t = $("#立繪--#{立繪.名字}")
202 | if 瞬
203 | t.css('transition', '')
204 | else
205 | 移動時間 = 0.5
206 | t.css('transition', "top #{移動時間}s, left #{移動時間}s, transform #{移動時間}s")
207 | t.css('left', "#{立繪.位置[0]}px")
208 | t.css('top', "#{立繪.位置[1]}px")
209 | t.css('transform', "scale(#{立繪.位置[2]})")
210 | $("#立繪--#{立繪.名字}--圖像").attr('特效', 立繪.特效.join(' '))
211 |
212 | # 貼圖
213 | for 立繪 in 立繪組
214 | if 立繪.使用png
215 | png名 = "#{v.psd立繪路徑}/#{立繪.名字}.png"
216 | await psd處理.渲染png到div(png名, "立繪--#{立繪.名字}--圖像")
217 | else
218 | psd名 = "#{v.psd立繪路徑}/#{立繪.名字}.psd"
219 | await psd處理.渲染圖層組到div(psd名, 立繪.圖層, "立繪--#{立繪.名字}--圖像")
220 | if this.當前人物組.indexOf(立繪.名字) == -1
221 | $("#立繪--#{立繪.名字}").attr('特效','淡入')
222 |
223 | this.當前人物組 = 名字組
224 |
225 | 現在背景: [null, "0% 0%"],
226 | 換背景: (背景, 瞬) ->
227 | if 背景
228 | [背景圖片, 淡入時間, 位置, 漸變方法] = 背景
229 | else
230 | [背景圖片, 淡入時間, 位置, 漸變方法] = ['', 0, '']
231 | if 瞬
232 | 淡入時間 = 0
233 | if 背景圖片 != this.現在背景[0]
234 | $('#bg').css('background-position', 位置)
235 | this.換圖('bg', 背景圖片, 淡入時間, 漸變方法)
236 | else if 位置 != this.現在背景[1]
237 | $('#bg').css('background-position', 位置)
238 | this.現在背景 = [背景圖片, 位置]
239 |
240 | 換人名: (語者, 名字) ->
241 | 名字 = this.翻譯(名字)
242 | if 名字
243 | $('#名字').html(名字)
244 | $('#名字框').css('opacity', 1)
245 | else
246 | $('#名字框').css('opacity', 0)
247 | $('#對話歷史').append(名字+' ')
248 | $('#對話框').attr('名字', 語者)
249 |
250 | 淡入過期時間: 0,
251 | 換對話: (話語, 名字, 瞬間化) ->
252 | 話語 = this.翻譯(話語)
253 | 名字 = this.翻譯(名字)
254 | $('#對話歷史').append(話語+' ')
255 |
256 | if 名字 != ''
257 | $('#對話框').attr('對話類型','對話')
258 | else
259 | $('#對話框').attr('對話類型','旁白')
260 |
261 | if $("#話語").css("--幹你娘老子就是要每行都縮進")
262 | 縮進 = ' '.repeat(parseInt($("#話語").css("--幹你娘老子就是要每行都縮進")))
263 | 話語 = 話語.replace(/(^|\n)/g, "$1#{縮進}")
264 |
265 | if 瞬間化
266 | $('#話語').html(話語 + ' ')
267 | else
268 | 淡入字 = 演出.文字淡入(話語)
269 | $('#話語').html(淡入字.內容)
270 | 演出.淡入過期時間 = Date.now() + 淡入字.文字時間 * 1000
271 | 早泄: ->
272 | $('#話語 *').css('animation','None')
273 | $('#話語 *').css('opacity','1')
274 |
275 | 當前曲名: null,
276 | 換背景音樂: (背景音樂) ->
277 | if 背景音樂
278 | [曲名, 音量] = 背景音樂
279 | else
280 | [曲名, 音量] = [null, 0]
281 |
282 | if this.當前曲名 == 曲名
283 | return
284 | this.當前曲名 = 曲名
285 |
286 | for i in $('#總畫面 > audio.背景音樂')
287 | if i.volume==0
288 | i.remove()
289 | $('#總畫面 > audio.背景音樂').animate({volume: 0}, 500)
290 |
291 | 音樂 = $(" ")
292 | 音樂.volume = 音量
293 | $('#總畫面').append(音樂)
294 |
295 | 放效果音: (效果音) ->
296 | if ! 效果音
297 | return
298 | [曲名, 音量] = 效果音
299 | 音樂 = $(" ")
300 | 音樂.volume = 音量
301 | 音樂[0].addEventListener('ended', ->
302 | 音樂.remove()
303 | , false)
304 | $('#總畫面').append(音樂)
305 |
306 | 換圖: (目標, 新圖, 漸變時間, 漸變方法 = '_淡出') ->
307 | 目標 = $('#'+目標)
308 | 原背景 = 目標.css('background-image')
309 | 目標.css('background-image', 新圖)
310 |
311 | 目標.html('
')
312 | 舊淡出 = 目標.children()
313 |
314 | if 漸變時間 > 0
315 | 舊淡出.css('background-image', 原背景)
316 | 舊淡出.css('animation', "#{漸變方法} #{漸變時間}s")
317 | 舊淡出.css('animation-fill-mode', 'forwards')
318 | 舊淡出.css('animation-play-state', 'running')
319 |
320 | 文字淡入: (s, 動畫名 = '_淡入') ->
321 | 時間間隔 = v.用戶設置.文字速度.值 / 800
322 | group = s.replace(/(\s*((<.*?>)|(.)))/g, "$1\0").split('\0')
323 | 動畫時間 = 時間間隔 * 8
324 | 時間 = 0
325 | 內容 = (for i in group
326 | if i[0] == '<'
327 | i
328 | else
329 | 時間 += 時間間隔
330 | "#{i} "
331 | ).join('')
332 | {內容, 文字時間: 時間, 總時間: 時間 + 動畫時間}
333 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/特效.sass:
--------------------------------------------------------------------------------
1 | @keyframes _淡入
2 | 0%
3 | opacity: 0
4 | 100%
5 | opacity: 1
6 |
7 | @keyframes _下入
8 | 0%
9 | position: relative
10 | top: 50px
11 | opacity: 0
12 | 100%
13 | opacity: 1
14 | position: relative
15 | top: 0px
16 |
17 | @keyframes _淡出
18 | 0%
19 | opacity: 1
20 |
21 | 100%
22 | opacity: 0
23 |
24 | @keyframes _黑出
25 | 0%
26 | opacity: 1
27 | filter: brightness(100%)
28 | 50%
29 | opacity: 1
30 | filter: brightness(0%)
31 | 100%
32 | opacity: 0
33 | filter: brightness(0%)
34 |
35 | [特效~=淡入]
36 | animation: _淡入 0.6s
37 | animation-fill-mode: forwards
38 |
39 | [特效~=下入]
40 | animation: _下入 0.6s
41 | animation-fill-mode: forwards
42 |
43 | [特效~=灰]
44 | filter: grayscale(1)
45 |
46 | [特效~=透明]
47 | opacity: 0.5
48 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/src/狀態切換.sass:
--------------------------------------------------------------------------------
1 | #總畫面
2 | #配置面板, #對話歷史, #存檔讀檔面板
3 | opacity: 0
4 | visibility: hidden
5 | #adv畫面, #工具欄
6 | transition: filter 0.25s
7 |
8 | &[配置面板=off]
9 | #配置面板
10 | transition: visibility 0s 0.25s, opacity 0.25s
11 | &[配置面板=on]
12 | #配置面板
13 | opacity: 1
14 | visibility: visible
15 | transition: opacity 0.25s
16 | #adv畫面, #工具欄
17 | pointer-events: none
18 | filter: brightness(0.6)
19 |
20 | &[存檔讀檔面板=off]
21 | #存檔讀檔面板
22 | transition: visibility 0s 0.25s, opacity 0.25s
23 | &[存檔讀檔面板=on]
24 | #存檔讀檔面板
25 | opacity: 1
26 | visibility: visible
27 | transition: opacity 0.25s
28 | #adv畫面, #工具欄
29 | pointer-events: none
30 | filter: brightness(0.6)
31 | #對話框
32 | visibility: hidden
33 | &[歷史=off]
34 | #對話歷史
35 | transition: visibility 0s 0.25s, opacity 0.25s
36 | &[歷史=on]
37 | #對話歷史
38 | opacity: 1
39 | visibility: visible
40 | transition: opacity 0.25s
41 |
42 | &[對話框=off]
43 | #對話框
44 | opacity: 0
45 | visibility: hidden
46 | transition: visibility 0s 0.25s, opacity 0.25s
47 | &[對話框=on]
48 | #對話框
49 | opacity: 1
50 | visibility: visible
51 | transition: opacity 0.25s
52 |
53 |
54 | #adv畫面
55 | #覆蓋
56 | visibility: hidden
57 | opacity: 0
58 | filter: brightness(0)
59 | transition: visibility 0s 0.4s, opacity 0.4s, filter 0s 0.4s
60 | &[顯現=true]
61 | visibility: visible
62 | opacity: 1
63 | filter: brightness(1)
64 | transition: visibility 0s, opacity 1s, filter 2s 1s
65 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const WebpackBar = require('webpackbar');
3 |
4 | module.exports = {
5 | entry: './src/全局.coffee',
6 | output: {
7 | path: path.resolve(__dirname, 'dist'),
8 | filename: 'bundle.js',
9 | publicPath: './dist/',
10 | },
11 | module: {
12 | rules: [
13 | {
14 | test: /\.coffee$/,
15 | use: ['coffee-loader']
16 | }, {
17 | test: /\.sass$/,
18 | use: [
19 | { loader: 'style-loader' },
20 | { loader: 'css-loader' },
21 | { loader: 'resolve-url-loader' },
22 | { loader: 'sass-loader', options: { sourceMap: true } }
23 | ]
24 | }, {
25 | test: /\.(otf|png|jpg|webp|svg)$/,
26 | use: [
27 | {
28 | loader: 'file-loader', options: {
29 | name: () => '[name].[ext]',
30 | }
31 | },
32 | ]
33 | },
34 | ],
35 | },
36 | plugins: [
37 | new WebpackBar()
38 | ],
39 | node: { fs: 'empty' },
40 | mode: 'development',
41 | // mode: 'production',
42 | };
--------------------------------------------------------------------------------
/librian/librian本體/前端/素材/NotoSerifSC-SemiBold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/素材/NotoSerifSC-SemiBold.otf
--------------------------------------------------------------------------------
/librian/librian本體/前端/素材/t0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/素材/t0.png
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/HELP-US-OUT.txt:
--------------------------------------------------------------------------------
1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
3 | comprehensive icon sets or copy and paste your own.
4 |
5 | Please. Check it out.
6 |
7 | -Dave Gandy
8 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/animated.less:
--------------------------------------------------------------------------------
1 | // Animated Icons
2 | // --------------------------
3 |
4 | .@{fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | .@{fa-css-prefix}-pulse {
10 | -webkit-animation: fa-spin 1s infinite steps(8);
11 | animation: fa-spin 1s infinite steps(8);
12 | }
13 |
14 | @-webkit-keyframes fa-spin {
15 | 0% {
16 | -webkit-transform: rotate(0deg);
17 | transform: rotate(0deg);
18 | }
19 | 100% {
20 | -webkit-transform: rotate(359deg);
21 | transform: rotate(359deg);
22 | }
23 | }
24 |
25 | @keyframes fa-spin {
26 | 0% {
27 | -webkit-transform: rotate(0deg);
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | -webkit-transform: rotate(359deg);
32 | transform: rotate(359deg);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/bordered-pulled.less:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em @fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .@{fa-css-prefix}-pull-left { float: left; }
11 | .@{fa-css-prefix}-pull-right { float: right; }
12 |
13 | .@{fa-css-prefix} {
14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .@{fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/core.less:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .@{fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/fixed-width.less:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .@{fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/font-awesome.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables.less";
7 | @import "mixins.less";
8 | @import "path.less";
9 | @import "core.less";
10 | @import "larger.less";
11 | @import "fixed-width.less";
12 | @import "list.less";
13 | @import "bordered-pulled.less";
14 | @import "animated.less";
15 | @import "rotated-flipped.less";
16 | @import "stacked.less";
17 | @import "icons.less";
18 | @import "screen-reader.less";
19 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/larger.less:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .@{fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .@{fa-css-prefix}-2x { font-size: 2em; }
11 | .@{fa-css-prefix}-3x { font-size: 3em; }
12 | .@{fa-css-prefix}-4x { font-size: 4em; }
13 | .@{fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/list.less:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: @fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .@{fa-css-prefix}-li {
11 | position: absolute;
12 | left: -@fa-li-width;
13 | width: @fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.@{fa-css-prefix}-lg {
17 | left: (-@fa-li-width + (4em / 14));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/mixins.less:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | .fa-icon() {
5 | display: inline-block;
6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
14 | .fa-icon-rotate(@degrees, @rotation) {
15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
16 | -webkit-transform: rotate(@degrees);
17 | -ms-transform: rotate(@degrees);
18 | transform: rotate(@degrees);
19 | }
20 |
21 | .fa-icon-flip(@horiz, @vert, @rotation) {
22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
23 | -webkit-transform: scale(@horiz, @vert);
24 | -ms-transform: scale(@horiz, @vert);
25 | transform: scale(@horiz, @vert);
26 | }
27 |
28 |
29 | // Only display content to screen readers. A la Bootstrap 4.
30 | //
31 | // See: http://a11yproject.com/posts/how-to-hide-content/
32 |
33 | .sr-only() {
34 | position: absolute;
35 | width: 1px;
36 | height: 1px;
37 | padding: 0;
38 | margin: -1px;
39 | overflow: hidden;
40 | clip: rect(0,0,0,0);
41 | border: 0;
42 | }
43 |
44 | // Use in conjunction with .sr-only to only display content when it's focused.
45 | //
46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
47 | //
48 | // Credit: HTML5 Boilerplate
49 |
50 | .sr-only-focusable() {
51 | &:active,
52 | &:focus {
53 | position: static;
54 | width: auto;
55 | height: auto;
56 | margin: 0;
57 | overflow: visible;
58 | clip: auto;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/path.less:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
13 | font-weight: normal;
14 | font-style: normal;
15 | }
16 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/rotated-flipped.less:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
7 |
8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .@{fa-css-prefix}-rotate-90,
15 | :root .@{fa-css-prefix}-rotate-180,
16 | :root .@{fa-css-prefix}-rotate-270,
17 | :root .@{fa-css-prefix}-flip-horizontal,
18 | :root .@{fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/screen-reader.less:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { .sr-only(); }
5 | .sr-only-focusable { .sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/stacked.less:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; }
21 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/variables.less:
--------------------------------------------------------------------------------
1 | // Variables
2 | // --------------------------
3 |
4 | @fa-font-path: "../fonts";
5 | @fa-font-size-base: 14px;
6 | @fa-line-height-base: 1;
7 | //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly
8 | @fa-css-prefix: fa;
9 | @fa-version: "4.7.0";
10 | @fa-border-color: #eee;
11 | @fa-inverse: #fff;
12 | @fa-li-width: (30em / 14);
13 |
14 | @fa-var-500px: "\f26e";
15 | @fa-var-address-book: "\f2b9";
16 | @fa-var-address-book-o: "\f2ba";
17 | @fa-var-address-card: "\f2bb";
18 | @fa-var-address-card-o: "\f2bc";
19 | @fa-var-adjust: "\f042";
20 | @fa-var-adn: "\f170";
21 | @fa-var-align-center: "\f037";
22 | @fa-var-align-justify: "\f039";
23 | @fa-var-align-left: "\f036";
24 | @fa-var-align-right: "\f038";
25 | @fa-var-amazon: "\f270";
26 | @fa-var-ambulance: "\f0f9";
27 | @fa-var-american-sign-language-interpreting: "\f2a3";
28 | @fa-var-anchor: "\f13d";
29 | @fa-var-android: "\f17b";
30 | @fa-var-angellist: "\f209";
31 | @fa-var-angle-double-down: "\f103";
32 | @fa-var-angle-double-left: "\f100";
33 | @fa-var-angle-double-right: "\f101";
34 | @fa-var-angle-double-up: "\f102";
35 | @fa-var-angle-down: "\f107";
36 | @fa-var-angle-left: "\f104";
37 | @fa-var-angle-right: "\f105";
38 | @fa-var-angle-up: "\f106";
39 | @fa-var-apple: "\f179";
40 | @fa-var-archive: "\f187";
41 | @fa-var-area-chart: "\f1fe";
42 | @fa-var-arrow-circle-down: "\f0ab";
43 | @fa-var-arrow-circle-left: "\f0a8";
44 | @fa-var-arrow-circle-o-down: "\f01a";
45 | @fa-var-arrow-circle-o-left: "\f190";
46 | @fa-var-arrow-circle-o-right: "\f18e";
47 | @fa-var-arrow-circle-o-up: "\f01b";
48 | @fa-var-arrow-circle-right: "\f0a9";
49 | @fa-var-arrow-circle-up: "\f0aa";
50 | @fa-var-arrow-down: "\f063";
51 | @fa-var-arrow-left: "\f060";
52 | @fa-var-arrow-right: "\f061";
53 | @fa-var-arrow-up: "\f062";
54 | @fa-var-arrows: "\f047";
55 | @fa-var-arrows-alt: "\f0b2";
56 | @fa-var-arrows-h: "\f07e";
57 | @fa-var-arrows-v: "\f07d";
58 | @fa-var-asl-interpreting: "\f2a3";
59 | @fa-var-assistive-listening-systems: "\f2a2";
60 | @fa-var-asterisk: "\f069";
61 | @fa-var-at: "\f1fa";
62 | @fa-var-audio-description: "\f29e";
63 | @fa-var-automobile: "\f1b9";
64 | @fa-var-backward: "\f04a";
65 | @fa-var-balance-scale: "\f24e";
66 | @fa-var-ban: "\f05e";
67 | @fa-var-bandcamp: "\f2d5";
68 | @fa-var-bank: "\f19c";
69 | @fa-var-bar-chart: "\f080";
70 | @fa-var-bar-chart-o: "\f080";
71 | @fa-var-barcode: "\f02a";
72 | @fa-var-bars: "\f0c9";
73 | @fa-var-bath: "\f2cd";
74 | @fa-var-bathtub: "\f2cd";
75 | @fa-var-battery: "\f240";
76 | @fa-var-battery-0: "\f244";
77 | @fa-var-battery-1: "\f243";
78 | @fa-var-battery-2: "\f242";
79 | @fa-var-battery-3: "\f241";
80 | @fa-var-battery-4: "\f240";
81 | @fa-var-battery-empty: "\f244";
82 | @fa-var-battery-full: "\f240";
83 | @fa-var-battery-half: "\f242";
84 | @fa-var-battery-quarter: "\f243";
85 | @fa-var-battery-three-quarters: "\f241";
86 | @fa-var-bed: "\f236";
87 | @fa-var-beer: "\f0fc";
88 | @fa-var-behance: "\f1b4";
89 | @fa-var-behance-square: "\f1b5";
90 | @fa-var-bell: "\f0f3";
91 | @fa-var-bell-o: "\f0a2";
92 | @fa-var-bell-slash: "\f1f6";
93 | @fa-var-bell-slash-o: "\f1f7";
94 | @fa-var-bicycle: "\f206";
95 | @fa-var-binoculars: "\f1e5";
96 | @fa-var-birthday-cake: "\f1fd";
97 | @fa-var-bitbucket: "\f171";
98 | @fa-var-bitbucket-square: "\f172";
99 | @fa-var-bitcoin: "\f15a";
100 | @fa-var-black-tie: "\f27e";
101 | @fa-var-blind: "\f29d";
102 | @fa-var-bluetooth: "\f293";
103 | @fa-var-bluetooth-b: "\f294";
104 | @fa-var-bold: "\f032";
105 | @fa-var-bolt: "\f0e7";
106 | @fa-var-bomb: "\f1e2";
107 | @fa-var-book: "\f02d";
108 | @fa-var-bookmark: "\f02e";
109 | @fa-var-bookmark-o: "\f097";
110 | @fa-var-braille: "\f2a1";
111 | @fa-var-briefcase: "\f0b1";
112 | @fa-var-btc: "\f15a";
113 | @fa-var-bug: "\f188";
114 | @fa-var-building: "\f1ad";
115 | @fa-var-building-o: "\f0f7";
116 | @fa-var-bullhorn: "\f0a1";
117 | @fa-var-bullseye: "\f140";
118 | @fa-var-bus: "\f207";
119 | @fa-var-buysellads: "\f20d";
120 | @fa-var-cab: "\f1ba";
121 | @fa-var-calculator: "\f1ec";
122 | @fa-var-calendar: "\f073";
123 | @fa-var-calendar-check-o: "\f274";
124 | @fa-var-calendar-minus-o: "\f272";
125 | @fa-var-calendar-o: "\f133";
126 | @fa-var-calendar-plus-o: "\f271";
127 | @fa-var-calendar-times-o: "\f273";
128 | @fa-var-camera: "\f030";
129 | @fa-var-camera-retro: "\f083";
130 | @fa-var-car: "\f1b9";
131 | @fa-var-caret-down: "\f0d7";
132 | @fa-var-caret-left: "\f0d9";
133 | @fa-var-caret-right: "\f0da";
134 | @fa-var-caret-square-o-down: "\f150";
135 | @fa-var-caret-square-o-left: "\f191";
136 | @fa-var-caret-square-o-right: "\f152";
137 | @fa-var-caret-square-o-up: "\f151";
138 | @fa-var-caret-up: "\f0d8";
139 | @fa-var-cart-arrow-down: "\f218";
140 | @fa-var-cart-plus: "\f217";
141 | @fa-var-cc: "\f20a";
142 | @fa-var-cc-amex: "\f1f3";
143 | @fa-var-cc-diners-club: "\f24c";
144 | @fa-var-cc-discover: "\f1f2";
145 | @fa-var-cc-jcb: "\f24b";
146 | @fa-var-cc-mastercard: "\f1f1";
147 | @fa-var-cc-paypal: "\f1f4";
148 | @fa-var-cc-stripe: "\f1f5";
149 | @fa-var-cc-visa: "\f1f0";
150 | @fa-var-certificate: "\f0a3";
151 | @fa-var-chain: "\f0c1";
152 | @fa-var-chain-broken: "\f127";
153 | @fa-var-check: "\f00c";
154 | @fa-var-check-circle: "\f058";
155 | @fa-var-check-circle-o: "\f05d";
156 | @fa-var-check-square: "\f14a";
157 | @fa-var-check-square-o: "\f046";
158 | @fa-var-chevron-circle-down: "\f13a";
159 | @fa-var-chevron-circle-left: "\f137";
160 | @fa-var-chevron-circle-right: "\f138";
161 | @fa-var-chevron-circle-up: "\f139";
162 | @fa-var-chevron-down: "\f078";
163 | @fa-var-chevron-left: "\f053";
164 | @fa-var-chevron-right: "\f054";
165 | @fa-var-chevron-up: "\f077";
166 | @fa-var-child: "\f1ae";
167 | @fa-var-chrome: "\f268";
168 | @fa-var-circle: "\f111";
169 | @fa-var-circle-o: "\f10c";
170 | @fa-var-circle-o-notch: "\f1ce";
171 | @fa-var-circle-thin: "\f1db";
172 | @fa-var-clipboard: "\f0ea";
173 | @fa-var-clock-o: "\f017";
174 | @fa-var-clone: "\f24d";
175 | @fa-var-close: "\f00d";
176 | @fa-var-cloud: "\f0c2";
177 | @fa-var-cloud-download: "\f0ed";
178 | @fa-var-cloud-upload: "\f0ee";
179 | @fa-var-cny: "\f157";
180 | @fa-var-code: "\f121";
181 | @fa-var-code-fork: "\f126";
182 | @fa-var-codepen: "\f1cb";
183 | @fa-var-codiepie: "\f284";
184 | @fa-var-coffee: "\f0f4";
185 | @fa-var-cog: "\f013";
186 | @fa-var-cogs: "\f085";
187 | @fa-var-columns: "\f0db";
188 | @fa-var-comment: "\f075";
189 | @fa-var-comment-o: "\f0e5";
190 | @fa-var-commenting: "\f27a";
191 | @fa-var-commenting-o: "\f27b";
192 | @fa-var-comments: "\f086";
193 | @fa-var-comments-o: "\f0e6";
194 | @fa-var-compass: "\f14e";
195 | @fa-var-compress: "\f066";
196 | @fa-var-connectdevelop: "\f20e";
197 | @fa-var-contao: "\f26d";
198 | @fa-var-copy: "\f0c5";
199 | @fa-var-copyright: "\f1f9";
200 | @fa-var-creative-commons: "\f25e";
201 | @fa-var-credit-card: "\f09d";
202 | @fa-var-credit-card-alt: "\f283";
203 | @fa-var-crop: "\f125";
204 | @fa-var-crosshairs: "\f05b";
205 | @fa-var-css3: "\f13c";
206 | @fa-var-cube: "\f1b2";
207 | @fa-var-cubes: "\f1b3";
208 | @fa-var-cut: "\f0c4";
209 | @fa-var-cutlery: "\f0f5";
210 | @fa-var-dashboard: "\f0e4";
211 | @fa-var-dashcube: "\f210";
212 | @fa-var-database: "\f1c0";
213 | @fa-var-deaf: "\f2a4";
214 | @fa-var-deafness: "\f2a4";
215 | @fa-var-dedent: "\f03b";
216 | @fa-var-delicious: "\f1a5";
217 | @fa-var-desktop: "\f108";
218 | @fa-var-deviantart: "\f1bd";
219 | @fa-var-diamond: "\f219";
220 | @fa-var-digg: "\f1a6";
221 | @fa-var-dollar: "\f155";
222 | @fa-var-dot-circle-o: "\f192";
223 | @fa-var-download: "\f019";
224 | @fa-var-dribbble: "\f17d";
225 | @fa-var-drivers-license: "\f2c2";
226 | @fa-var-drivers-license-o: "\f2c3";
227 | @fa-var-dropbox: "\f16b";
228 | @fa-var-drupal: "\f1a9";
229 | @fa-var-edge: "\f282";
230 | @fa-var-edit: "\f044";
231 | @fa-var-eercast: "\f2da";
232 | @fa-var-eject: "\f052";
233 | @fa-var-ellipsis-h: "\f141";
234 | @fa-var-ellipsis-v: "\f142";
235 | @fa-var-empire: "\f1d1";
236 | @fa-var-envelope: "\f0e0";
237 | @fa-var-envelope-o: "\f003";
238 | @fa-var-envelope-open: "\f2b6";
239 | @fa-var-envelope-open-o: "\f2b7";
240 | @fa-var-envelope-square: "\f199";
241 | @fa-var-envira: "\f299";
242 | @fa-var-eraser: "\f12d";
243 | @fa-var-etsy: "\f2d7";
244 | @fa-var-eur: "\f153";
245 | @fa-var-euro: "\f153";
246 | @fa-var-exchange: "\f0ec";
247 | @fa-var-exclamation: "\f12a";
248 | @fa-var-exclamation-circle: "\f06a";
249 | @fa-var-exclamation-triangle: "\f071";
250 | @fa-var-expand: "\f065";
251 | @fa-var-expeditedssl: "\f23e";
252 | @fa-var-external-link: "\f08e";
253 | @fa-var-external-link-square: "\f14c";
254 | @fa-var-eye: "\f06e";
255 | @fa-var-eye-slash: "\f070";
256 | @fa-var-eyedropper: "\f1fb";
257 | @fa-var-fa: "\f2b4";
258 | @fa-var-facebook: "\f09a";
259 | @fa-var-facebook-f: "\f09a";
260 | @fa-var-facebook-official: "\f230";
261 | @fa-var-facebook-square: "\f082";
262 | @fa-var-fast-backward: "\f049";
263 | @fa-var-fast-forward: "\f050";
264 | @fa-var-fax: "\f1ac";
265 | @fa-var-feed: "\f09e";
266 | @fa-var-female: "\f182";
267 | @fa-var-fighter-jet: "\f0fb";
268 | @fa-var-file: "\f15b";
269 | @fa-var-file-archive-o: "\f1c6";
270 | @fa-var-file-audio-o: "\f1c7";
271 | @fa-var-file-code-o: "\f1c9";
272 | @fa-var-file-excel-o: "\f1c3";
273 | @fa-var-file-image-o: "\f1c5";
274 | @fa-var-file-movie-o: "\f1c8";
275 | @fa-var-file-o: "\f016";
276 | @fa-var-file-pdf-o: "\f1c1";
277 | @fa-var-file-photo-o: "\f1c5";
278 | @fa-var-file-picture-o: "\f1c5";
279 | @fa-var-file-powerpoint-o: "\f1c4";
280 | @fa-var-file-sound-o: "\f1c7";
281 | @fa-var-file-text: "\f15c";
282 | @fa-var-file-text-o: "\f0f6";
283 | @fa-var-file-video-o: "\f1c8";
284 | @fa-var-file-word-o: "\f1c2";
285 | @fa-var-file-zip-o: "\f1c6";
286 | @fa-var-files-o: "\f0c5";
287 | @fa-var-film: "\f008";
288 | @fa-var-filter: "\f0b0";
289 | @fa-var-fire: "\f06d";
290 | @fa-var-fire-extinguisher: "\f134";
291 | @fa-var-firefox: "\f269";
292 | @fa-var-first-order: "\f2b0";
293 | @fa-var-flag: "\f024";
294 | @fa-var-flag-checkered: "\f11e";
295 | @fa-var-flag-o: "\f11d";
296 | @fa-var-flash: "\f0e7";
297 | @fa-var-flask: "\f0c3";
298 | @fa-var-flickr: "\f16e";
299 | @fa-var-floppy-o: "\f0c7";
300 | @fa-var-folder: "\f07b";
301 | @fa-var-folder-o: "\f114";
302 | @fa-var-folder-open: "\f07c";
303 | @fa-var-folder-open-o: "\f115";
304 | @fa-var-font: "\f031";
305 | @fa-var-font-awesome: "\f2b4";
306 | @fa-var-fonticons: "\f280";
307 | @fa-var-fort-awesome: "\f286";
308 | @fa-var-forumbee: "\f211";
309 | @fa-var-forward: "\f04e";
310 | @fa-var-foursquare: "\f180";
311 | @fa-var-free-code-camp: "\f2c5";
312 | @fa-var-frown-o: "\f119";
313 | @fa-var-futbol-o: "\f1e3";
314 | @fa-var-gamepad: "\f11b";
315 | @fa-var-gavel: "\f0e3";
316 | @fa-var-gbp: "\f154";
317 | @fa-var-ge: "\f1d1";
318 | @fa-var-gear: "\f013";
319 | @fa-var-gears: "\f085";
320 | @fa-var-genderless: "\f22d";
321 | @fa-var-get-pocket: "\f265";
322 | @fa-var-gg: "\f260";
323 | @fa-var-gg-circle: "\f261";
324 | @fa-var-gift: "\f06b";
325 | @fa-var-git: "\f1d3";
326 | @fa-var-git-square: "\f1d2";
327 | @fa-var-github: "\f09b";
328 | @fa-var-github-alt: "\f113";
329 | @fa-var-github-square: "\f092";
330 | @fa-var-gitlab: "\f296";
331 | @fa-var-gittip: "\f184";
332 | @fa-var-glass: "\f000";
333 | @fa-var-glide: "\f2a5";
334 | @fa-var-glide-g: "\f2a6";
335 | @fa-var-globe: "\f0ac";
336 | @fa-var-google: "\f1a0";
337 | @fa-var-google-plus: "\f0d5";
338 | @fa-var-google-plus-circle: "\f2b3";
339 | @fa-var-google-plus-official: "\f2b3";
340 | @fa-var-google-plus-square: "\f0d4";
341 | @fa-var-google-wallet: "\f1ee";
342 | @fa-var-graduation-cap: "\f19d";
343 | @fa-var-gratipay: "\f184";
344 | @fa-var-grav: "\f2d6";
345 | @fa-var-group: "\f0c0";
346 | @fa-var-h-square: "\f0fd";
347 | @fa-var-hacker-news: "\f1d4";
348 | @fa-var-hand-grab-o: "\f255";
349 | @fa-var-hand-lizard-o: "\f258";
350 | @fa-var-hand-o-down: "\f0a7";
351 | @fa-var-hand-o-left: "\f0a5";
352 | @fa-var-hand-o-right: "\f0a4";
353 | @fa-var-hand-o-up: "\f0a6";
354 | @fa-var-hand-paper-o: "\f256";
355 | @fa-var-hand-peace-o: "\f25b";
356 | @fa-var-hand-pointer-o: "\f25a";
357 | @fa-var-hand-rock-o: "\f255";
358 | @fa-var-hand-scissors-o: "\f257";
359 | @fa-var-hand-spock-o: "\f259";
360 | @fa-var-hand-stop-o: "\f256";
361 | @fa-var-handshake-o: "\f2b5";
362 | @fa-var-hard-of-hearing: "\f2a4";
363 | @fa-var-hashtag: "\f292";
364 | @fa-var-hdd-o: "\f0a0";
365 | @fa-var-header: "\f1dc";
366 | @fa-var-headphones: "\f025";
367 | @fa-var-heart: "\f004";
368 | @fa-var-heart-o: "\f08a";
369 | @fa-var-heartbeat: "\f21e";
370 | @fa-var-history: "\f1da";
371 | @fa-var-home: "\f015";
372 | @fa-var-hospital-o: "\f0f8";
373 | @fa-var-hotel: "\f236";
374 | @fa-var-hourglass: "\f254";
375 | @fa-var-hourglass-1: "\f251";
376 | @fa-var-hourglass-2: "\f252";
377 | @fa-var-hourglass-3: "\f253";
378 | @fa-var-hourglass-end: "\f253";
379 | @fa-var-hourglass-half: "\f252";
380 | @fa-var-hourglass-o: "\f250";
381 | @fa-var-hourglass-start: "\f251";
382 | @fa-var-houzz: "\f27c";
383 | @fa-var-html5: "\f13b";
384 | @fa-var-i-cursor: "\f246";
385 | @fa-var-id-badge: "\f2c1";
386 | @fa-var-id-card: "\f2c2";
387 | @fa-var-id-card-o: "\f2c3";
388 | @fa-var-ils: "\f20b";
389 | @fa-var-image: "\f03e";
390 | @fa-var-imdb: "\f2d8";
391 | @fa-var-inbox: "\f01c";
392 | @fa-var-indent: "\f03c";
393 | @fa-var-industry: "\f275";
394 | @fa-var-info: "\f129";
395 | @fa-var-info-circle: "\f05a";
396 | @fa-var-inr: "\f156";
397 | @fa-var-instagram: "\f16d";
398 | @fa-var-institution: "\f19c";
399 | @fa-var-internet-explorer: "\f26b";
400 | @fa-var-intersex: "\f224";
401 | @fa-var-ioxhost: "\f208";
402 | @fa-var-italic: "\f033";
403 | @fa-var-joomla: "\f1aa";
404 | @fa-var-jpy: "\f157";
405 | @fa-var-jsfiddle: "\f1cc";
406 | @fa-var-key: "\f084";
407 | @fa-var-keyboard-o: "\f11c";
408 | @fa-var-krw: "\f159";
409 | @fa-var-language: "\f1ab";
410 | @fa-var-laptop: "\f109";
411 | @fa-var-lastfm: "\f202";
412 | @fa-var-lastfm-square: "\f203";
413 | @fa-var-leaf: "\f06c";
414 | @fa-var-leanpub: "\f212";
415 | @fa-var-legal: "\f0e3";
416 | @fa-var-lemon-o: "\f094";
417 | @fa-var-level-down: "\f149";
418 | @fa-var-level-up: "\f148";
419 | @fa-var-life-bouy: "\f1cd";
420 | @fa-var-life-buoy: "\f1cd";
421 | @fa-var-life-ring: "\f1cd";
422 | @fa-var-life-saver: "\f1cd";
423 | @fa-var-lightbulb-o: "\f0eb";
424 | @fa-var-line-chart: "\f201";
425 | @fa-var-link: "\f0c1";
426 | @fa-var-linkedin: "\f0e1";
427 | @fa-var-linkedin-square: "\f08c";
428 | @fa-var-linode: "\f2b8";
429 | @fa-var-linux: "\f17c";
430 | @fa-var-list: "\f03a";
431 | @fa-var-list-alt: "\f022";
432 | @fa-var-list-ol: "\f0cb";
433 | @fa-var-list-ul: "\f0ca";
434 | @fa-var-location-arrow: "\f124";
435 | @fa-var-lock: "\f023";
436 | @fa-var-long-arrow-down: "\f175";
437 | @fa-var-long-arrow-left: "\f177";
438 | @fa-var-long-arrow-right: "\f178";
439 | @fa-var-long-arrow-up: "\f176";
440 | @fa-var-low-vision: "\f2a8";
441 | @fa-var-magic: "\f0d0";
442 | @fa-var-magnet: "\f076";
443 | @fa-var-mail-forward: "\f064";
444 | @fa-var-mail-reply: "\f112";
445 | @fa-var-mail-reply-all: "\f122";
446 | @fa-var-male: "\f183";
447 | @fa-var-map: "\f279";
448 | @fa-var-map-marker: "\f041";
449 | @fa-var-map-o: "\f278";
450 | @fa-var-map-pin: "\f276";
451 | @fa-var-map-signs: "\f277";
452 | @fa-var-mars: "\f222";
453 | @fa-var-mars-double: "\f227";
454 | @fa-var-mars-stroke: "\f229";
455 | @fa-var-mars-stroke-h: "\f22b";
456 | @fa-var-mars-stroke-v: "\f22a";
457 | @fa-var-maxcdn: "\f136";
458 | @fa-var-meanpath: "\f20c";
459 | @fa-var-medium: "\f23a";
460 | @fa-var-medkit: "\f0fa";
461 | @fa-var-meetup: "\f2e0";
462 | @fa-var-meh-o: "\f11a";
463 | @fa-var-mercury: "\f223";
464 | @fa-var-microchip: "\f2db";
465 | @fa-var-microphone: "\f130";
466 | @fa-var-microphone-slash: "\f131";
467 | @fa-var-minus: "\f068";
468 | @fa-var-minus-circle: "\f056";
469 | @fa-var-minus-square: "\f146";
470 | @fa-var-minus-square-o: "\f147";
471 | @fa-var-mixcloud: "\f289";
472 | @fa-var-mobile: "\f10b";
473 | @fa-var-mobile-phone: "\f10b";
474 | @fa-var-modx: "\f285";
475 | @fa-var-money: "\f0d6";
476 | @fa-var-moon-o: "\f186";
477 | @fa-var-mortar-board: "\f19d";
478 | @fa-var-motorcycle: "\f21c";
479 | @fa-var-mouse-pointer: "\f245";
480 | @fa-var-music: "\f001";
481 | @fa-var-navicon: "\f0c9";
482 | @fa-var-neuter: "\f22c";
483 | @fa-var-newspaper-o: "\f1ea";
484 | @fa-var-object-group: "\f247";
485 | @fa-var-object-ungroup: "\f248";
486 | @fa-var-odnoklassniki: "\f263";
487 | @fa-var-odnoklassniki-square: "\f264";
488 | @fa-var-opencart: "\f23d";
489 | @fa-var-openid: "\f19b";
490 | @fa-var-opera: "\f26a";
491 | @fa-var-optin-monster: "\f23c";
492 | @fa-var-outdent: "\f03b";
493 | @fa-var-pagelines: "\f18c";
494 | @fa-var-paint-brush: "\f1fc";
495 | @fa-var-paper-plane: "\f1d8";
496 | @fa-var-paper-plane-o: "\f1d9";
497 | @fa-var-paperclip: "\f0c6";
498 | @fa-var-paragraph: "\f1dd";
499 | @fa-var-paste: "\f0ea";
500 | @fa-var-pause: "\f04c";
501 | @fa-var-pause-circle: "\f28b";
502 | @fa-var-pause-circle-o: "\f28c";
503 | @fa-var-paw: "\f1b0";
504 | @fa-var-paypal: "\f1ed";
505 | @fa-var-pencil: "\f040";
506 | @fa-var-pencil-square: "\f14b";
507 | @fa-var-pencil-square-o: "\f044";
508 | @fa-var-percent: "\f295";
509 | @fa-var-phone: "\f095";
510 | @fa-var-phone-square: "\f098";
511 | @fa-var-photo: "\f03e";
512 | @fa-var-picture-o: "\f03e";
513 | @fa-var-pie-chart: "\f200";
514 | @fa-var-pied-piper: "\f2ae";
515 | @fa-var-pied-piper-alt: "\f1a8";
516 | @fa-var-pied-piper-pp: "\f1a7";
517 | @fa-var-pinterest: "\f0d2";
518 | @fa-var-pinterest-p: "\f231";
519 | @fa-var-pinterest-square: "\f0d3";
520 | @fa-var-plane: "\f072";
521 | @fa-var-play: "\f04b";
522 | @fa-var-play-circle: "\f144";
523 | @fa-var-play-circle-o: "\f01d";
524 | @fa-var-plug: "\f1e6";
525 | @fa-var-plus: "\f067";
526 | @fa-var-plus-circle: "\f055";
527 | @fa-var-plus-square: "\f0fe";
528 | @fa-var-plus-square-o: "\f196";
529 | @fa-var-podcast: "\f2ce";
530 | @fa-var-power-off: "\f011";
531 | @fa-var-print: "\f02f";
532 | @fa-var-product-hunt: "\f288";
533 | @fa-var-puzzle-piece: "\f12e";
534 | @fa-var-qq: "\f1d6";
535 | @fa-var-qrcode: "\f029";
536 | @fa-var-question: "\f128";
537 | @fa-var-question-circle: "\f059";
538 | @fa-var-question-circle-o: "\f29c";
539 | @fa-var-quora: "\f2c4";
540 | @fa-var-quote-left: "\f10d";
541 | @fa-var-quote-right: "\f10e";
542 | @fa-var-ra: "\f1d0";
543 | @fa-var-random: "\f074";
544 | @fa-var-ravelry: "\f2d9";
545 | @fa-var-rebel: "\f1d0";
546 | @fa-var-recycle: "\f1b8";
547 | @fa-var-reddit: "\f1a1";
548 | @fa-var-reddit-alien: "\f281";
549 | @fa-var-reddit-square: "\f1a2";
550 | @fa-var-refresh: "\f021";
551 | @fa-var-registered: "\f25d";
552 | @fa-var-remove: "\f00d";
553 | @fa-var-renren: "\f18b";
554 | @fa-var-reorder: "\f0c9";
555 | @fa-var-repeat: "\f01e";
556 | @fa-var-reply: "\f112";
557 | @fa-var-reply-all: "\f122";
558 | @fa-var-resistance: "\f1d0";
559 | @fa-var-retweet: "\f079";
560 | @fa-var-rmb: "\f157";
561 | @fa-var-road: "\f018";
562 | @fa-var-rocket: "\f135";
563 | @fa-var-rotate-left: "\f0e2";
564 | @fa-var-rotate-right: "\f01e";
565 | @fa-var-rouble: "\f158";
566 | @fa-var-rss: "\f09e";
567 | @fa-var-rss-square: "\f143";
568 | @fa-var-rub: "\f158";
569 | @fa-var-ruble: "\f158";
570 | @fa-var-rupee: "\f156";
571 | @fa-var-s15: "\f2cd";
572 | @fa-var-safari: "\f267";
573 | @fa-var-save: "\f0c7";
574 | @fa-var-scissors: "\f0c4";
575 | @fa-var-scribd: "\f28a";
576 | @fa-var-search: "\f002";
577 | @fa-var-search-minus: "\f010";
578 | @fa-var-search-plus: "\f00e";
579 | @fa-var-sellsy: "\f213";
580 | @fa-var-send: "\f1d8";
581 | @fa-var-send-o: "\f1d9";
582 | @fa-var-server: "\f233";
583 | @fa-var-share: "\f064";
584 | @fa-var-share-alt: "\f1e0";
585 | @fa-var-share-alt-square: "\f1e1";
586 | @fa-var-share-square: "\f14d";
587 | @fa-var-share-square-o: "\f045";
588 | @fa-var-shekel: "\f20b";
589 | @fa-var-sheqel: "\f20b";
590 | @fa-var-shield: "\f132";
591 | @fa-var-ship: "\f21a";
592 | @fa-var-shirtsinbulk: "\f214";
593 | @fa-var-shopping-bag: "\f290";
594 | @fa-var-shopping-basket: "\f291";
595 | @fa-var-shopping-cart: "\f07a";
596 | @fa-var-shower: "\f2cc";
597 | @fa-var-sign-in: "\f090";
598 | @fa-var-sign-language: "\f2a7";
599 | @fa-var-sign-out: "\f08b";
600 | @fa-var-signal: "\f012";
601 | @fa-var-signing: "\f2a7";
602 | @fa-var-simplybuilt: "\f215";
603 | @fa-var-sitemap: "\f0e8";
604 | @fa-var-skyatlas: "\f216";
605 | @fa-var-skype: "\f17e";
606 | @fa-var-slack: "\f198";
607 | @fa-var-sliders: "\f1de";
608 | @fa-var-slideshare: "\f1e7";
609 | @fa-var-smile-o: "\f118";
610 | @fa-var-snapchat: "\f2ab";
611 | @fa-var-snapchat-ghost: "\f2ac";
612 | @fa-var-snapchat-square: "\f2ad";
613 | @fa-var-snowflake-o: "\f2dc";
614 | @fa-var-soccer-ball-o: "\f1e3";
615 | @fa-var-sort: "\f0dc";
616 | @fa-var-sort-alpha-asc: "\f15d";
617 | @fa-var-sort-alpha-desc: "\f15e";
618 | @fa-var-sort-amount-asc: "\f160";
619 | @fa-var-sort-amount-desc: "\f161";
620 | @fa-var-sort-asc: "\f0de";
621 | @fa-var-sort-desc: "\f0dd";
622 | @fa-var-sort-down: "\f0dd";
623 | @fa-var-sort-numeric-asc: "\f162";
624 | @fa-var-sort-numeric-desc: "\f163";
625 | @fa-var-sort-up: "\f0de";
626 | @fa-var-soundcloud: "\f1be";
627 | @fa-var-space-shuttle: "\f197";
628 | @fa-var-spinner: "\f110";
629 | @fa-var-spoon: "\f1b1";
630 | @fa-var-spotify: "\f1bc";
631 | @fa-var-square: "\f0c8";
632 | @fa-var-square-o: "\f096";
633 | @fa-var-stack-exchange: "\f18d";
634 | @fa-var-stack-overflow: "\f16c";
635 | @fa-var-star: "\f005";
636 | @fa-var-star-half: "\f089";
637 | @fa-var-star-half-empty: "\f123";
638 | @fa-var-star-half-full: "\f123";
639 | @fa-var-star-half-o: "\f123";
640 | @fa-var-star-o: "\f006";
641 | @fa-var-steam: "\f1b6";
642 | @fa-var-steam-square: "\f1b7";
643 | @fa-var-step-backward: "\f048";
644 | @fa-var-step-forward: "\f051";
645 | @fa-var-stethoscope: "\f0f1";
646 | @fa-var-sticky-note: "\f249";
647 | @fa-var-sticky-note-o: "\f24a";
648 | @fa-var-stop: "\f04d";
649 | @fa-var-stop-circle: "\f28d";
650 | @fa-var-stop-circle-o: "\f28e";
651 | @fa-var-street-view: "\f21d";
652 | @fa-var-strikethrough: "\f0cc";
653 | @fa-var-stumbleupon: "\f1a4";
654 | @fa-var-stumbleupon-circle: "\f1a3";
655 | @fa-var-subscript: "\f12c";
656 | @fa-var-subway: "\f239";
657 | @fa-var-suitcase: "\f0f2";
658 | @fa-var-sun-o: "\f185";
659 | @fa-var-superpowers: "\f2dd";
660 | @fa-var-superscript: "\f12b";
661 | @fa-var-support: "\f1cd";
662 | @fa-var-table: "\f0ce";
663 | @fa-var-tablet: "\f10a";
664 | @fa-var-tachometer: "\f0e4";
665 | @fa-var-tag: "\f02b";
666 | @fa-var-tags: "\f02c";
667 | @fa-var-tasks: "\f0ae";
668 | @fa-var-taxi: "\f1ba";
669 | @fa-var-telegram: "\f2c6";
670 | @fa-var-television: "\f26c";
671 | @fa-var-tencent-weibo: "\f1d5";
672 | @fa-var-terminal: "\f120";
673 | @fa-var-text-height: "\f034";
674 | @fa-var-text-width: "\f035";
675 | @fa-var-th: "\f00a";
676 | @fa-var-th-large: "\f009";
677 | @fa-var-th-list: "\f00b";
678 | @fa-var-themeisle: "\f2b2";
679 | @fa-var-thermometer: "\f2c7";
680 | @fa-var-thermometer-0: "\f2cb";
681 | @fa-var-thermometer-1: "\f2ca";
682 | @fa-var-thermometer-2: "\f2c9";
683 | @fa-var-thermometer-3: "\f2c8";
684 | @fa-var-thermometer-4: "\f2c7";
685 | @fa-var-thermometer-empty: "\f2cb";
686 | @fa-var-thermometer-full: "\f2c7";
687 | @fa-var-thermometer-half: "\f2c9";
688 | @fa-var-thermometer-quarter: "\f2ca";
689 | @fa-var-thermometer-three-quarters: "\f2c8";
690 | @fa-var-thumb-tack: "\f08d";
691 | @fa-var-thumbs-down: "\f165";
692 | @fa-var-thumbs-o-down: "\f088";
693 | @fa-var-thumbs-o-up: "\f087";
694 | @fa-var-thumbs-up: "\f164";
695 | @fa-var-ticket: "\f145";
696 | @fa-var-times: "\f00d";
697 | @fa-var-times-circle: "\f057";
698 | @fa-var-times-circle-o: "\f05c";
699 | @fa-var-times-rectangle: "\f2d3";
700 | @fa-var-times-rectangle-o: "\f2d4";
701 | @fa-var-tint: "\f043";
702 | @fa-var-toggle-down: "\f150";
703 | @fa-var-toggle-left: "\f191";
704 | @fa-var-toggle-off: "\f204";
705 | @fa-var-toggle-on: "\f205";
706 | @fa-var-toggle-right: "\f152";
707 | @fa-var-toggle-up: "\f151";
708 | @fa-var-trademark: "\f25c";
709 | @fa-var-train: "\f238";
710 | @fa-var-transgender: "\f224";
711 | @fa-var-transgender-alt: "\f225";
712 | @fa-var-trash: "\f1f8";
713 | @fa-var-trash-o: "\f014";
714 | @fa-var-tree: "\f1bb";
715 | @fa-var-trello: "\f181";
716 | @fa-var-tripadvisor: "\f262";
717 | @fa-var-trophy: "\f091";
718 | @fa-var-truck: "\f0d1";
719 | @fa-var-try: "\f195";
720 | @fa-var-tty: "\f1e4";
721 | @fa-var-tumblr: "\f173";
722 | @fa-var-tumblr-square: "\f174";
723 | @fa-var-turkish-lira: "\f195";
724 | @fa-var-tv: "\f26c";
725 | @fa-var-twitch: "\f1e8";
726 | @fa-var-twitter: "\f099";
727 | @fa-var-twitter-square: "\f081";
728 | @fa-var-umbrella: "\f0e9";
729 | @fa-var-underline: "\f0cd";
730 | @fa-var-undo: "\f0e2";
731 | @fa-var-universal-access: "\f29a";
732 | @fa-var-university: "\f19c";
733 | @fa-var-unlink: "\f127";
734 | @fa-var-unlock: "\f09c";
735 | @fa-var-unlock-alt: "\f13e";
736 | @fa-var-unsorted: "\f0dc";
737 | @fa-var-upload: "\f093";
738 | @fa-var-usb: "\f287";
739 | @fa-var-usd: "\f155";
740 | @fa-var-user: "\f007";
741 | @fa-var-user-circle: "\f2bd";
742 | @fa-var-user-circle-o: "\f2be";
743 | @fa-var-user-md: "\f0f0";
744 | @fa-var-user-o: "\f2c0";
745 | @fa-var-user-plus: "\f234";
746 | @fa-var-user-secret: "\f21b";
747 | @fa-var-user-times: "\f235";
748 | @fa-var-users: "\f0c0";
749 | @fa-var-vcard: "\f2bb";
750 | @fa-var-vcard-o: "\f2bc";
751 | @fa-var-venus: "\f221";
752 | @fa-var-venus-double: "\f226";
753 | @fa-var-venus-mars: "\f228";
754 | @fa-var-viacoin: "\f237";
755 | @fa-var-viadeo: "\f2a9";
756 | @fa-var-viadeo-square: "\f2aa";
757 | @fa-var-video-camera: "\f03d";
758 | @fa-var-vimeo: "\f27d";
759 | @fa-var-vimeo-square: "\f194";
760 | @fa-var-vine: "\f1ca";
761 | @fa-var-vk: "\f189";
762 | @fa-var-volume-control-phone: "\f2a0";
763 | @fa-var-volume-down: "\f027";
764 | @fa-var-volume-off: "\f026";
765 | @fa-var-volume-up: "\f028";
766 | @fa-var-warning: "\f071";
767 | @fa-var-wechat: "\f1d7";
768 | @fa-var-weibo: "\f18a";
769 | @fa-var-weixin: "\f1d7";
770 | @fa-var-whatsapp: "\f232";
771 | @fa-var-wheelchair: "\f193";
772 | @fa-var-wheelchair-alt: "\f29b";
773 | @fa-var-wifi: "\f1eb";
774 | @fa-var-wikipedia-w: "\f266";
775 | @fa-var-window-close: "\f2d3";
776 | @fa-var-window-close-o: "\f2d4";
777 | @fa-var-window-maximize: "\f2d0";
778 | @fa-var-window-minimize: "\f2d1";
779 | @fa-var-window-restore: "\f2d2";
780 | @fa-var-windows: "\f17a";
781 | @fa-var-won: "\f159";
782 | @fa-var-wordpress: "\f19a";
783 | @fa-var-wpbeginner: "\f297";
784 | @fa-var-wpexplorer: "\f2de";
785 | @fa-var-wpforms: "\f298";
786 | @fa-var-wrench: "\f0ad";
787 | @fa-var-xing: "\f168";
788 | @fa-var-xing-square: "\f169";
789 | @fa-var-y-combinator: "\f23b";
790 | @fa-var-y-combinator-square: "\f1d4";
791 | @fa-var-yahoo: "\f19e";
792 | @fa-var-yc: "\f23b";
793 | @fa-var-yc-square: "\f1d4";
794 | @fa-var-yelp: "\f1e9";
795 | @fa-var-yen: "\f157";
796 | @fa-var-yoast: "\f2b1";
797 | @fa-var-youtube: "\f167";
798 | @fa-var-youtube-play: "\f16a";
799 | @fa-var-youtube-square: "\f166";
800 |
801 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_animated.scss:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | .#{$fa-css-prefix}-pulse {
10 | -webkit-animation: fa-spin 1s infinite steps(8);
11 | animation: fa-spin 1s infinite steps(8);
12 | }
13 |
14 | @-webkit-keyframes fa-spin {
15 | 0% {
16 | -webkit-transform: rotate(0deg);
17 | transform: rotate(0deg);
18 | }
19 | 100% {
20 | -webkit-transform: rotate(359deg);
21 | transform: rotate(359deg);
22 | }
23 | }
24 |
25 | @keyframes fa-spin {
26 | 0% {
27 | -webkit-transform: rotate(0deg);
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | -webkit-transform: rotate(359deg);
32 | transform: rotate(359deg);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em $fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .#{$fa-css-prefix}-pull-left { float: left; }
11 | .#{$fa-css-prefix}-pull-right { float: right; }
12 |
13 | .#{$fa-css-prefix} {
14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .#{$fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .#{$fa-css-prefix}-2x { font-size: 2em; }
11 | .#{$fa-css-prefix}-3x { font-size: 3em; }
12 | .#{$fa-css-prefix}-4x { font-size: 4em; }
13 | .#{$fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: $fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .#{$fa-css-prefix}-li {
11 | position: absolute;
12 | left: -$fa-li-width;
13 | width: $fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.#{$fa-css-prefix}-lg {
17 | left: -$fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------
3 |
4 | @mixin fa-icon() {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
14 | @mixin fa-icon-rotate($degrees, $rotation) {
15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
16 | -webkit-transform: rotate($degrees);
17 | -ms-transform: rotate($degrees);
18 | transform: rotate($degrees);
19 | }
20 |
21 | @mixin fa-icon-flip($horiz, $vert, $rotation) {
22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
23 | -webkit-transform: scale($horiz, $vert);
24 | -ms-transform: scale($horiz, $vert);
25 | transform: scale($horiz, $vert);
26 | }
27 |
28 |
29 | // Only display content to screen readers. A la Bootstrap 4.
30 | //
31 | // See: http://a11yproject.com/posts/how-to-hide-content/
32 |
33 | @mixin sr-only {
34 | position: absolute;
35 | width: 1px;
36 | height: 1px;
37 | padding: 0;
38 | margin: -1px;
39 | overflow: hidden;
40 | clip: rect(0,0,0,0);
41 | border: 0;
42 | }
43 |
44 | // Use in conjunction with .sr-only to only display content when it's focused.
45 | //
46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
47 | //
48 | // Credit: HTML5 Boilerplate
49 |
50 | @mixin sr-only-focusable {
51 | &:active,
52 | &:focus {
53 | position: static;
54 | width: auto;
55 | height: auto;
56 | margin: 0;
57 | overflow: visible;
58 | clip: auto;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_path.scss:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
13 | font-weight: normal;
14 | font-style: normal;
15 | }
16 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .#{$fa-css-prefix}-rotate-90,
15 | :root .#{$fa-css-prefix}-rotate-180,
16 | :root .#{$fa-css-prefix}-rotate-270,
17 | :root .#{$fa-css-prefix}-flip-horizontal,
18 | :root .#{$fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { @include sr-only(); }
5 | .sr-only-focusable { @include sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
21 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_variables.scss:
--------------------------------------------------------------------------------
1 | // Variables
2 | // --------------------------
3 |
4 | $fa-font-path: "../fonts" !default;
5 | $fa-font-size-base: 14px !default;
6 | $fa-line-height-base: 1 !default;
7 | //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly
8 | $fa-css-prefix: fa !default;
9 | $fa-version: "4.7.0" !default;
10 | $fa-border-color: #eee !default;
11 | $fa-inverse: #fff !default;
12 | $fa-li-width: (30em / 14) !default;
13 |
14 | $fa-var-500px: "\f26e";
15 | $fa-var-address-book: "\f2b9";
16 | $fa-var-address-book-o: "\f2ba";
17 | $fa-var-address-card: "\f2bb";
18 | $fa-var-address-card-o: "\f2bc";
19 | $fa-var-adjust: "\f042";
20 | $fa-var-adn: "\f170";
21 | $fa-var-align-center: "\f037";
22 | $fa-var-align-justify: "\f039";
23 | $fa-var-align-left: "\f036";
24 | $fa-var-align-right: "\f038";
25 | $fa-var-amazon: "\f270";
26 | $fa-var-ambulance: "\f0f9";
27 | $fa-var-american-sign-language-interpreting: "\f2a3";
28 | $fa-var-anchor: "\f13d";
29 | $fa-var-android: "\f17b";
30 | $fa-var-angellist: "\f209";
31 | $fa-var-angle-double-down: "\f103";
32 | $fa-var-angle-double-left: "\f100";
33 | $fa-var-angle-double-right: "\f101";
34 | $fa-var-angle-double-up: "\f102";
35 | $fa-var-angle-down: "\f107";
36 | $fa-var-angle-left: "\f104";
37 | $fa-var-angle-right: "\f105";
38 | $fa-var-angle-up: "\f106";
39 | $fa-var-apple: "\f179";
40 | $fa-var-archive: "\f187";
41 | $fa-var-area-chart: "\f1fe";
42 | $fa-var-arrow-circle-down: "\f0ab";
43 | $fa-var-arrow-circle-left: "\f0a8";
44 | $fa-var-arrow-circle-o-down: "\f01a";
45 | $fa-var-arrow-circle-o-left: "\f190";
46 | $fa-var-arrow-circle-o-right: "\f18e";
47 | $fa-var-arrow-circle-o-up: "\f01b";
48 | $fa-var-arrow-circle-right: "\f0a9";
49 | $fa-var-arrow-circle-up: "\f0aa";
50 | $fa-var-arrow-down: "\f063";
51 | $fa-var-arrow-left: "\f060";
52 | $fa-var-arrow-right: "\f061";
53 | $fa-var-arrow-up: "\f062";
54 | $fa-var-arrows: "\f047";
55 | $fa-var-arrows-alt: "\f0b2";
56 | $fa-var-arrows-h: "\f07e";
57 | $fa-var-arrows-v: "\f07d";
58 | $fa-var-asl-interpreting: "\f2a3";
59 | $fa-var-assistive-listening-systems: "\f2a2";
60 | $fa-var-asterisk: "\f069";
61 | $fa-var-at: "\f1fa";
62 | $fa-var-audio-description: "\f29e";
63 | $fa-var-automobile: "\f1b9";
64 | $fa-var-backward: "\f04a";
65 | $fa-var-balance-scale: "\f24e";
66 | $fa-var-ban: "\f05e";
67 | $fa-var-bandcamp: "\f2d5";
68 | $fa-var-bank: "\f19c";
69 | $fa-var-bar-chart: "\f080";
70 | $fa-var-bar-chart-o: "\f080";
71 | $fa-var-barcode: "\f02a";
72 | $fa-var-bars: "\f0c9";
73 | $fa-var-bath: "\f2cd";
74 | $fa-var-bathtub: "\f2cd";
75 | $fa-var-battery: "\f240";
76 | $fa-var-battery-0: "\f244";
77 | $fa-var-battery-1: "\f243";
78 | $fa-var-battery-2: "\f242";
79 | $fa-var-battery-3: "\f241";
80 | $fa-var-battery-4: "\f240";
81 | $fa-var-battery-empty: "\f244";
82 | $fa-var-battery-full: "\f240";
83 | $fa-var-battery-half: "\f242";
84 | $fa-var-battery-quarter: "\f243";
85 | $fa-var-battery-three-quarters: "\f241";
86 | $fa-var-bed: "\f236";
87 | $fa-var-beer: "\f0fc";
88 | $fa-var-behance: "\f1b4";
89 | $fa-var-behance-square: "\f1b5";
90 | $fa-var-bell: "\f0f3";
91 | $fa-var-bell-o: "\f0a2";
92 | $fa-var-bell-slash: "\f1f6";
93 | $fa-var-bell-slash-o: "\f1f7";
94 | $fa-var-bicycle: "\f206";
95 | $fa-var-binoculars: "\f1e5";
96 | $fa-var-birthday-cake: "\f1fd";
97 | $fa-var-bitbucket: "\f171";
98 | $fa-var-bitbucket-square: "\f172";
99 | $fa-var-bitcoin: "\f15a";
100 | $fa-var-black-tie: "\f27e";
101 | $fa-var-blind: "\f29d";
102 | $fa-var-bluetooth: "\f293";
103 | $fa-var-bluetooth-b: "\f294";
104 | $fa-var-bold: "\f032";
105 | $fa-var-bolt: "\f0e7";
106 | $fa-var-bomb: "\f1e2";
107 | $fa-var-book: "\f02d";
108 | $fa-var-bookmark: "\f02e";
109 | $fa-var-bookmark-o: "\f097";
110 | $fa-var-braille: "\f2a1";
111 | $fa-var-briefcase: "\f0b1";
112 | $fa-var-btc: "\f15a";
113 | $fa-var-bug: "\f188";
114 | $fa-var-building: "\f1ad";
115 | $fa-var-building-o: "\f0f7";
116 | $fa-var-bullhorn: "\f0a1";
117 | $fa-var-bullseye: "\f140";
118 | $fa-var-bus: "\f207";
119 | $fa-var-buysellads: "\f20d";
120 | $fa-var-cab: "\f1ba";
121 | $fa-var-calculator: "\f1ec";
122 | $fa-var-calendar: "\f073";
123 | $fa-var-calendar-check-o: "\f274";
124 | $fa-var-calendar-minus-o: "\f272";
125 | $fa-var-calendar-o: "\f133";
126 | $fa-var-calendar-plus-o: "\f271";
127 | $fa-var-calendar-times-o: "\f273";
128 | $fa-var-camera: "\f030";
129 | $fa-var-camera-retro: "\f083";
130 | $fa-var-car: "\f1b9";
131 | $fa-var-caret-down: "\f0d7";
132 | $fa-var-caret-left: "\f0d9";
133 | $fa-var-caret-right: "\f0da";
134 | $fa-var-caret-square-o-down: "\f150";
135 | $fa-var-caret-square-o-left: "\f191";
136 | $fa-var-caret-square-o-right: "\f152";
137 | $fa-var-caret-square-o-up: "\f151";
138 | $fa-var-caret-up: "\f0d8";
139 | $fa-var-cart-arrow-down: "\f218";
140 | $fa-var-cart-plus: "\f217";
141 | $fa-var-cc: "\f20a";
142 | $fa-var-cc-amex: "\f1f3";
143 | $fa-var-cc-diners-club: "\f24c";
144 | $fa-var-cc-discover: "\f1f2";
145 | $fa-var-cc-jcb: "\f24b";
146 | $fa-var-cc-mastercard: "\f1f1";
147 | $fa-var-cc-paypal: "\f1f4";
148 | $fa-var-cc-stripe: "\f1f5";
149 | $fa-var-cc-visa: "\f1f0";
150 | $fa-var-certificate: "\f0a3";
151 | $fa-var-chain: "\f0c1";
152 | $fa-var-chain-broken: "\f127";
153 | $fa-var-check: "\f00c";
154 | $fa-var-check-circle: "\f058";
155 | $fa-var-check-circle-o: "\f05d";
156 | $fa-var-check-square: "\f14a";
157 | $fa-var-check-square-o: "\f046";
158 | $fa-var-chevron-circle-down: "\f13a";
159 | $fa-var-chevron-circle-left: "\f137";
160 | $fa-var-chevron-circle-right: "\f138";
161 | $fa-var-chevron-circle-up: "\f139";
162 | $fa-var-chevron-down: "\f078";
163 | $fa-var-chevron-left: "\f053";
164 | $fa-var-chevron-right: "\f054";
165 | $fa-var-chevron-up: "\f077";
166 | $fa-var-child: "\f1ae";
167 | $fa-var-chrome: "\f268";
168 | $fa-var-circle: "\f111";
169 | $fa-var-circle-o: "\f10c";
170 | $fa-var-circle-o-notch: "\f1ce";
171 | $fa-var-circle-thin: "\f1db";
172 | $fa-var-clipboard: "\f0ea";
173 | $fa-var-clock-o: "\f017";
174 | $fa-var-clone: "\f24d";
175 | $fa-var-close: "\f00d";
176 | $fa-var-cloud: "\f0c2";
177 | $fa-var-cloud-download: "\f0ed";
178 | $fa-var-cloud-upload: "\f0ee";
179 | $fa-var-cny: "\f157";
180 | $fa-var-code: "\f121";
181 | $fa-var-code-fork: "\f126";
182 | $fa-var-codepen: "\f1cb";
183 | $fa-var-codiepie: "\f284";
184 | $fa-var-coffee: "\f0f4";
185 | $fa-var-cog: "\f013";
186 | $fa-var-cogs: "\f085";
187 | $fa-var-columns: "\f0db";
188 | $fa-var-comment: "\f075";
189 | $fa-var-comment-o: "\f0e5";
190 | $fa-var-commenting: "\f27a";
191 | $fa-var-commenting-o: "\f27b";
192 | $fa-var-comments: "\f086";
193 | $fa-var-comments-o: "\f0e6";
194 | $fa-var-compass: "\f14e";
195 | $fa-var-compress: "\f066";
196 | $fa-var-connectdevelop: "\f20e";
197 | $fa-var-contao: "\f26d";
198 | $fa-var-copy: "\f0c5";
199 | $fa-var-copyright: "\f1f9";
200 | $fa-var-creative-commons: "\f25e";
201 | $fa-var-credit-card: "\f09d";
202 | $fa-var-credit-card-alt: "\f283";
203 | $fa-var-crop: "\f125";
204 | $fa-var-crosshairs: "\f05b";
205 | $fa-var-css3: "\f13c";
206 | $fa-var-cube: "\f1b2";
207 | $fa-var-cubes: "\f1b3";
208 | $fa-var-cut: "\f0c4";
209 | $fa-var-cutlery: "\f0f5";
210 | $fa-var-dashboard: "\f0e4";
211 | $fa-var-dashcube: "\f210";
212 | $fa-var-database: "\f1c0";
213 | $fa-var-deaf: "\f2a4";
214 | $fa-var-deafness: "\f2a4";
215 | $fa-var-dedent: "\f03b";
216 | $fa-var-delicious: "\f1a5";
217 | $fa-var-desktop: "\f108";
218 | $fa-var-deviantart: "\f1bd";
219 | $fa-var-diamond: "\f219";
220 | $fa-var-digg: "\f1a6";
221 | $fa-var-dollar: "\f155";
222 | $fa-var-dot-circle-o: "\f192";
223 | $fa-var-download: "\f019";
224 | $fa-var-dribbble: "\f17d";
225 | $fa-var-drivers-license: "\f2c2";
226 | $fa-var-drivers-license-o: "\f2c3";
227 | $fa-var-dropbox: "\f16b";
228 | $fa-var-drupal: "\f1a9";
229 | $fa-var-edge: "\f282";
230 | $fa-var-edit: "\f044";
231 | $fa-var-eercast: "\f2da";
232 | $fa-var-eject: "\f052";
233 | $fa-var-ellipsis-h: "\f141";
234 | $fa-var-ellipsis-v: "\f142";
235 | $fa-var-empire: "\f1d1";
236 | $fa-var-envelope: "\f0e0";
237 | $fa-var-envelope-o: "\f003";
238 | $fa-var-envelope-open: "\f2b6";
239 | $fa-var-envelope-open-o: "\f2b7";
240 | $fa-var-envelope-square: "\f199";
241 | $fa-var-envira: "\f299";
242 | $fa-var-eraser: "\f12d";
243 | $fa-var-etsy: "\f2d7";
244 | $fa-var-eur: "\f153";
245 | $fa-var-euro: "\f153";
246 | $fa-var-exchange: "\f0ec";
247 | $fa-var-exclamation: "\f12a";
248 | $fa-var-exclamation-circle: "\f06a";
249 | $fa-var-exclamation-triangle: "\f071";
250 | $fa-var-expand: "\f065";
251 | $fa-var-expeditedssl: "\f23e";
252 | $fa-var-external-link: "\f08e";
253 | $fa-var-external-link-square: "\f14c";
254 | $fa-var-eye: "\f06e";
255 | $fa-var-eye-slash: "\f070";
256 | $fa-var-eyedropper: "\f1fb";
257 | $fa-var-fa: "\f2b4";
258 | $fa-var-facebook: "\f09a";
259 | $fa-var-facebook-f: "\f09a";
260 | $fa-var-facebook-official: "\f230";
261 | $fa-var-facebook-square: "\f082";
262 | $fa-var-fast-backward: "\f049";
263 | $fa-var-fast-forward: "\f050";
264 | $fa-var-fax: "\f1ac";
265 | $fa-var-feed: "\f09e";
266 | $fa-var-female: "\f182";
267 | $fa-var-fighter-jet: "\f0fb";
268 | $fa-var-file: "\f15b";
269 | $fa-var-file-archive-o: "\f1c6";
270 | $fa-var-file-audio-o: "\f1c7";
271 | $fa-var-file-code-o: "\f1c9";
272 | $fa-var-file-excel-o: "\f1c3";
273 | $fa-var-file-image-o: "\f1c5";
274 | $fa-var-file-movie-o: "\f1c8";
275 | $fa-var-file-o: "\f016";
276 | $fa-var-file-pdf-o: "\f1c1";
277 | $fa-var-file-photo-o: "\f1c5";
278 | $fa-var-file-picture-o: "\f1c5";
279 | $fa-var-file-powerpoint-o: "\f1c4";
280 | $fa-var-file-sound-o: "\f1c7";
281 | $fa-var-file-text: "\f15c";
282 | $fa-var-file-text-o: "\f0f6";
283 | $fa-var-file-video-o: "\f1c8";
284 | $fa-var-file-word-o: "\f1c2";
285 | $fa-var-file-zip-o: "\f1c6";
286 | $fa-var-files-o: "\f0c5";
287 | $fa-var-film: "\f008";
288 | $fa-var-filter: "\f0b0";
289 | $fa-var-fire: "\f06d";
290 | $fa-var-fire-extinguisher: "\f134";
291 | $fa-var-firefox: "\f269";
292 | $fa-var-first-order: "\f2b0";
293 | $fa-var-flag: "\f024";
294 | $fa-var-flag-checkered: "\f11e";
295 | $fa-var-flag-o: "\f11d";
296 | $fa-var-flash: "\f0e7";
297 | $fa-var-flask: "\f0c3";
298 | $fa-var-flickr: "\f16e";
299 | $fa-var-floppy-o: "\f0c7";
300 | $fa-var-folder: "\f07b";
301 | $fa-var-folder-o: "\f114";
302 | $fa-var-folder-open: "\f07c";
303 | $fa-var-folder-open-o: "\f115";
304 | $fa-var-font: "\f031";
305 | $fa-var-font-awesome: "\f2b4";
306 | $fa-var-fonticons: "\f280";
307 | $fa-var-fort-awesome: "\f286";
308 | $fa-var-forumbee: "\f211";
309 | $fa-var-forward: "\f04e";
310 | $fa-var-foursquare: "\f180";
311 | $fa-var-free-code-camp: "\f2c5";
312 | $fa-var-frown-o: "\f119";
313 | $fa-var-futbol-o: "\f1e3";
314 | $fa-var-gamepad: "\f11b";
315 | $fa-var-gavel: "\f0e3";
316 | $fa-var-gbp: "\f154";
317 | $fa-var-ge: "\f1d1";
318 | $fa-var-gear: "\f013";
319 | $fa-var-gears: "\f085";
320 | $fa-var-genderless: "\f22d";
321 | $fa-var-get-pocket: "\f265";
322 | $fa-var-gg: "\f260";
323 | $fa-var-gg-circle: "\f261";
324 | $fa-var-gift: "\f06b";
325 | $fa-var-git: "\f1d3";
326 | $fa-var-git-square: "\f1d2";
327 | $fa-var-github: "\f09b";
328 | $fa-var-github-alt: "\f113";
329 | $fa-var-github-square: "\f092";
330 | $fa-var-gitlab: "\f296";
331 | $fa-var-gittip: "\f184";
332 | $fa-var-glass: "\f000";
333 | $fa-var-glide: "\f2a5";
334 | $fa-var-glide-g: "\f2a6";
335 | $fa-var-globe: "\f0ac";
336 | $fa-var-google: "\f1a0";
337 | $fa-var-google-plus: "\f0d5";
338 | $fa-var-google-plus-circle: "\f2b3";
339 | $fa-var-google-plus-official: "\f2b3";
340 | $fa-var-google-plus-square: "\f0d4";
341 | $fa-var-google-wallet: "\f1ee";
342 | $fa-var-graduation-cap: "\f19d";
343 | $fa-var-gratipay: "\f184";
344 | $fa-var-grav: "\f2d6";
345 | $fa-var-group: "\f0c0";
346 | $fa-var-h-square: "\f0fd";
347 | $fa-var-hacker-news: "\f1d4";
348 | $fa-var-hand-grab-o: "\f255";
349 | $fa-var-hand-lizard-o: "\f258";
350 | $fa-var-hand-o-down: "\f0a7";
351 | $fa-var-hand-o-left: "\f0a5";
352 | $fa-var-hand-o-right: "\f0a4";
353 | $fa-var-hand-o-up: "\f0a6";
354 | $fa-var-hand-paper-o: "\f256";
355 | $fa-var-hand-peace-o: "\f25b";
356 | $fa-var-hand-pointer-o: "\f25a";
357 | $fa-var-hand-rock-o: "\f255";
358 | $fa-var-hand-scissors-o: "\f257";
359 | $fa-var-hand-spock-o: "\f259";
360 | $fa-var-hand-stop-o: "\f256";
361 | $fa-var-handshake-o: "\f2b5";
362 | $fa-var-hard-of-hearing: "\f2a4";
363 | $fa-var-hashtag: "\f292";
364 | $fa-var-hdd-o: "\f0a0";
365 | $fa-var-header: "\f1dc";
366 | $fa-var-headphones: "\f025";
367 | $fa-var-heart: "\f004";
368 | $fa-var-heart-o: "\f08a";
369 | $fa-var-heartbeat: "\f21e";
370 | $fa-var-history: "\f1da";
371 | $fa-var-home: "\f015";
372 | $fa-var-hospital-o: "\f0f8";
373 | $fa-var-hotel: "\f236";
374 | $fa-var-hourglass: "\f254";
375 | $fa-var-hourglass-1: "\f251";
376 | $fa-var-hourglass-2: "\f252";
377 | $fa-var-hourglass-3: "\f253";
378 | $fa-var-hourglass-end: "\f253";
379 | $fa-var-hourglass-half: "\f252";
380 | $fa-var-hourglass-o: "\f250";
381 | $fa-var-hourglass-start: "\f251";
382 | $fa-var-houzz: "\f27c";
383 | $fa-var-html5: "\f13b";
384 | $fa-var-i-cursor: "\f246";
385 | $fa-var-id-badge: "\f2c1";
386 | $fa-var-id-card: "\f2c2";
387 | $fa-var-id-card-o: "\f2c3";
388 | $fa-var-ils: "\f20b";
389 | $fa-var-image: "\f03e";
390 | $fa-var-imdb: "\f2d8";
391 | $fa-var-inbox: "\f01c";
392 | $fa-var-indent: "\f03c";
393 | $fa-var-industry: "\f275";
394 | $fa-var-info: "\f129";
395 | $fa-var-info-circle: "\f05a";
396 | $fa-var-inr: "\f156";
397 | $fa-var-instagram: "\f16d";
398 | $fa-var-institution: "\f19c";
399 | $fa-var-internet-explorer: "\f26b";
400 | $fa-var-intersex: "\f224";
401 | $fa-var-ioxhost: "\f208";
402 | $fa-var-italic: "\f033";
403 | $fa-var-joomla: "\f1aa";
404 | $fa-var-jpy: "\f157";
405 | $fa-var-jsfiddle: "\f1cc";
406 | $fa-var-key: "\f084";
407 | $fa-var-keyboard-o: "\f11c";
408 | $fa-var-krw: "\f159";
409 | $fa-var-language: "\f1ab";
410 | $fa-var-laptop: "\f109";
411 | $fa-var-lastfm: "\f202";
412 | $fa-var-lastfm-square: "\f203";
413 | $fa-var-leaf: "\f06c";
414 | $fa-var-leanpub: "\f212";
415 | $fa-var-legal: "\f0e3";
416 | $fa-var-lemon-o: "\f094";
417 | $fa-var-level-down: "\f149";
418 | $fa-var-level-up: "\f148";
419 | $fa-var-life-bouy: "\f1cd";
420 | $fa-var-life-buoy: "\f1cd";
421 | $fa-var-life-ring: "\f1cd";
422 | $fa-var-life-saver: "\f1cd";
423 | $fa-var-lightbulb-o: "\f0eb";
424 | $fa-var-line-chart: "\f201";
425 | $fa-var-link: "\f0c1";
426 | $fa-var-linkedin: "\f0e1";
427 | $fa-var-linkedin-square: "\f08c";
428 | $fa-var-linode: "\f2b8";
429 | $fa-var-linux: "\f17c";
430 | $fa-var-list: "\f03a";
431 | $fa-var-list-alt: "\f022";
432 | $fa-var-list-ol: "\f0cb";
433 | $fa-var-list-ul: "\f0ca";
434 | $fa-var-location-arrow: "\f124";
435 | $fa-var-lock: "\f023";
436 | $fa-var-long-arrow-down: "\f175";
437 | $fa-var-long-arrow-left: "\f177";
438 | $fa-var-long-arrow-right: "\f178";
439 | $fa-var-long-arrow-up: "\f176";
440 | $fa-var-low-vision: "\f2a8";
441 | $fa-var-magic: "\f0d0";
442 | $fa-var-magnet: "\f076";
443 | $fa-var-mail-forward: "\f064";
444 | $fa-var-mail-reply: "\f112";
445 | $fa-var-mail-reply-all: "\f122";
446 | $fa-var-male: "\f183";
447 | $fa-var-map: "\f279";
448 | $fa-var-map-marker: "\f041";
449 | $fa-var-map-o: "\f278";
450 | $fa-var-map-pin: "\f276";
451 | $fa-var-map-signs: "\f277";
452 | $fa-var-mars: "\f222";
453 | $fa-var-mars-double: "\f227";
454 | $fa-var-mars-stroke: "\f229";
455 | $fa-var-mars-stroke-h: "\f22b";
456 | $fa-var-mars-stroke-v: "\f22a";
457 | $fa-var-maxcdn: "\f136";
458 | $fa-var-meanpath: "\f20c";
459 | $fa-var-medium: "\f23a";
460 | $fa-var-medkit: "\f0fa";
461 | $fa-var-meetup: "\f2e0";
462 | $fa-var-meh-o: "\f11a";
463 | $fa-var-mercury: "\f223";
464 | $fa-var-microchip: "\f2db";
465 | $fa-var-microphone: "\f130";
466 | $fa-var-microphone-slash: "\f131";
467 | $fa-var-minus: "\f068";
468 | $fa-var-minus-circle: "\f056";
469 | $fa-var-minus-square: "\f146";
470 | $fa-var-minus-square-o: "\f147";
471 | $fa-var-mixcloud: "\f289";
472 | $fa-var-mobile: "\f10b";
473 | $fa-var-mobile-phone: "\f10b";
474 | $fa-var-modx: "\f285";
475 | $fa-var-money: "\f0d6";
476 | $fa-var-moon-o: "\f186";
477 | $fa-var-mortar-board: "\f19d";
478 | $fa-var-motorcycle: "\f21c";
479 | $fa-var-mouse-pointer: "\f245";
480 | $fa-var-music: "\f001";
481 | $fa-var-navicon: "\f0c9";
482 | $fa-var-neuter: "\f22c";
483 | $fa-var-newspaper-o: "\f1ea";
484 | $fa-var-object-group: "\f247";
485 | $fa-var-object-ungroup: "\f248";
486 | $fa-var-odnoklassniki: "\f263";
487 | $fa-var-odnoklassniki-square: "\f264";
488 | $fa-var-opencart: "\f23d";
489 | $fa-var-openid: "\f19b";
490 | $fa-var-opera: "\f26a";
491 | $fa-var-optin-monster: "\f23c";
492 | $fa-var-outdent: "\f03b";
493 | $fa-var-pagelines: "\f18c";
494 | $fa-var-paint-brush: "\f1fc";
495 | $fa-var-paper-plane: "\f1d8";
496 | $fa-var-paper-plane-o: "\f1d9";
497 | $fa-var-paperclip: "\f0c6";
498 | $fa-var-paragraph: "\f1dd";
499 | $fa-var-paste: "\f0ea";
500 | $fa-var-pause: "\f04c";
501 | $fa-var-pause-circle: "\f28b";
502 | $fa-var-pause-circle-o: "\f28c";
503 | $fa-var-paw: "\f1b0";
504 | $fa-var-paypal: "\f1ed";
505 | $fa-var-pencil: "\f040";
506 | $fa-var-pencil-square: "\f14b";
507 | $fa-var-pencil-square-o: "\f044";
508 | $fa-var-percent: "\f295";
509 | $fa-var-phone: "\f095";
510 | $fa-var-phone-square: "\f098";
511 | $fa-var-photo: "\f03e";
512 | $fa-var-picture-o: "\f03e";
513 | $fa-var-pie-chart: "\f200";
514 | $fa-var-pied-piper: "\f2ae";
515 | $fa-var-pied-piper-alt: "\f1a8";
516 | $fa-var-pied-piper-pp: "\f1a7";
517 | $fa-var-pinterest: "\f0d2";
518 | $fa-var-pinterest-p: "\f231";
519 | $fa-var-pinterest-square: "\f0d3";
520 | $fa-var-plane: "\f072";
521 | $fa-var-play: "\f04b";
522 | $fa-var-play-circle: "\f144";
523 | $fa-var-play-circle-o: "\f01d";
524 | $fa-var-plug: "\f1e6";
525 | $fa-var-plus: "\f067";
526 | $fa-var-plus-circle: "\f055";
527 | $fa-var-plus-square: "\f0fe";
528 | $fa-var-plus-square-o: "\f196";
529 | $fa-var-podcast: "\f2ce";
530 | $fa-var-power-off: "\f011";
531 | $fa-var-print: "\f02f";
532 | $fa-var-product-hunt: "\f288";
533 | $fa-var-puzzle-piece: "\f12e";
534 | $fa-var-qq: "\f1d6";
535 | $fa-var-qrcode: "\f029";
536 | $fa-var-question: "\f128";
537 | $fa-var-question-circle: "\f059";
538 | $fa-var-question-circle-o: "\f29c";
539 | $fa-var-quora: "\f2c4";
540 | $fa-var-quote-left: "\f10d";
541 | $fa-var-quote-right: "\f10e";
542 | $fa-var-ra: "\f1d0";
543 | $fa-var-random: "\f074";
544 | $fa-var-ravelry: "\f2d9";
545 | $fa-var-rebel: "\f1d0";
546 | $fa-var-recycle: "\f1b8";
547 | $fa-var-reddit: "\f1a1";
548 | $fa-var-reddit-alien: "\f281";
549 | $fa-var-reddit-square: "\f1a2";
550 | $fa-var-refresh: "\f021";
551 | $fa-var-registered: "\f25d";
552 | $fa-var-remove: "\f00d";
553 | $fa-var-renren: "\f18b";
554 | $fa-var-reorder: "\f0c9";
555 | $fa-var-repeat: "\f01e";
556 | $fa-var-reply: "\f112";
557 | $fa-var-reply-all: "\f122";
558 | $fa-var-resistance: "\f1d0";
559 | $fa-var-retweet: "\f079";
560 | $fa-var-rmb: "\f157";
561 | $fa-var-road: "\f018";
562 | $fa-var-rocket: "\f135";
563 | $fa-var-rotate-left: "\f0e2";
564 | $fa-var-rotate-right: "\f01e";
565 | $fa-var-rouble: "\f158";
566 | $fa-var-rss: "\f09e";
567 | $fa-var-rss-square: "\f143";
568 | $fa-var-rub: "\f158";
569 | $fa-var-ruble: "\f158";
570 | $fa-var-rupee: "\f156";
571 | $fa-var-s15: "\f2cd";
572 | $fa-var-safari: "\f267";
573 | $fa-var-save: "\f0c7";
574 | $fa-var-scissors: "\f0c4";
575 | $fa-var-scribd: "\f28a";
576 | $fa-var-search: "\f002";
577 | $fa-var-search-minus: "\f010";
578 | $fa-var-search-plus: "\f00e";
579 | $fa-var-sellsy: "\f213";
580 | $fa-var-send: "\f1d8";
581 | $fa-var-send-o: "\f1d9";
582 | $fa-var-server: "\f233";
583 | $fa-var-share: "\f064";
584 | $fa-var-share-alt: "\f1e0";
585 | $fa-var-share-alt-square: "\f1e1";
586 | $fa-var-share-square: "\f14d";
587 | $fa-var-share-square-o: "\f045";
588 | $fa-var-shekel: "\f20b";
589 | $fa-var-sheqel: "\f20b";
590 | $fa-var-shield: "\f132";
591 | $fa-var-ship: "\f21a";
592 | $fa-var-shirtsinbulk: "\f214";
593 | $fa-var-shopping-bag: "\f290";
594 | $fa-var-shopping-basket: "\f291";
595 | $fa-var-shopping-cart: "\f07a";
596 | $fa-var-shower: "\f2cc";
597 | $fa-var-sign-in: "\f090";
598 | $fa-var-sign-language: "\f2a7";
599 | $fa-var-sign-out: "\f08b";
600 | $fa-var-signal: "\f012";
601 | $fa-var-signing: "\f2a7";
602 | $fa-var-simplybuilt: "\f215";
603 | $fa-var-sitemap: "\f0e8";
604 | $fa-var-skyatlas: "\f216";
605 | $fa-var-skype: "\f17e";
606 | $fa-var-slack: "\f198";
607 | $fa-var-sliders: "\f1de";
608 | $fa-var-slideshare: "\f1e7";
609 | $fa-var-smile-o: "\f118";
610 | $fa-var-snapchat: "\f2ab";
611 | $fa-var-snapchat-ghost: "\f2ac";
612 | $fa-var-snapchat-square: "\f2ad";
613 | $fa-var-snowflake-o: "\f2dc";
614 | $fa-var-soccer-ball-o: "\f1e3";
615 | $fa-var-sort: "\f0dc";
616 | $fa-var-sort-alpha-asc: "\f15d";
617 | $fa-var-sort-alpha-desc: "\f15e";
618 | $fa-var-sort-amount-asc: "\f160";
619 | $fa-var-sort-amount-desc: "\f161";
620 | $fa-var-sort-asc: "\f0de";
621 | $fa-var-sort-desc: "\f0dd";
622 | $fa-var-sort-down: "\f0dd";
623 | $fa-var-sort-numeric-asc: "\f162";
624 | $fa-var-sort-numeric-desc: "\f163";
625 | $fa-var-sort-up: "\f0de";
626 | $fa-var-soundcloud: "\f1be";
627 | $fa-var-space-shuttle: "\f197";
628 | $fa-var-spinner: "\f110";
629 | $fa-var-spoon: "\f1b1";
630 | $fa-var-spotify: "\f1bc";
631 | $fa-var-square: "\f0c8";
632 | $fa-var-square-o: "\f096";
633 | $fa-var-stack-exchange: "\f18d";
634 | $fa-var-stack-overflow: "\f16c";
635 | $fa-var-star: "\f005";
636 | $fa-var-star-half: "\f089";
637 | $fa-var-star-half-empty: "\f123";
638 | $fa-var-star-half-full: "\f123";
639 | $fa-var-star-half-o: "\f123";
640 | $fa-var-star-o: "\f006";
641 | $fa-var-steam: "\f1b6";
642 | $fa-var-steam-square: "\f1b7";
643 | $fa-var-step-backward: "\f048";
644 | $fa-var-step-forward: "\f051";
645 | $fa-var-stethoscope: "\f0f1";
646 | $fa-var-sticky-note: "\f249";
647 | $fa-var-sticky-note-o: "\f24a";
648 | $fa-var-stop: "\f04d";
649 | $fa-var-stop-circle: "\f28d";
650 | $fa-var-stop-circle-o: "\f28e";
651 | $fa-var-street-view: "\f21d";
652 | $fa-var-strikethrough: "\f0cc";
653 | $fa-var-stumbleupon: "\f1a4";
654 | $fa-var-stumbleupon-circle: "\f1a3";
655 | $fa-var-subscript: "\f12c";
656 | $fa-var-subway: "\f239";
657 | $fa-var-suitcase: "\f0f2";
658 | $fa-var-sun-o: "\f185";
659 | $fa-var-superpowers: "\f2dd";
660 | $fa-var-superscript: "\f12b";
661 | $fa-var-support: "\f1cd";
662 | $fa-var-table: "\f0ce";
663 | $fa-var-tablet: "\f10a";
664 | $fa-var-tachometer: "\f0e4";
665 | $fa-var-tag: "\f02b";
666 | $fa-var-tags: "\f02c";
667 | $fa-var-tasks: "\f0ae";
668 | $fa-var-taxi: "\f1ba";
669 | $fa-var-telegram: "\f2c6";
670 | $fa-var-television: "\f26c";
671 | $fa-var-tencent-weibo: "\f1d5";
672 | $fa-var-terminal: "\f120";
673 | $fa-var-text-height: "\f034";
674 | $fa-var-text-width: "\f035";
675 | $fa-var-th: "\f00a";
676 | $fa-var-th-large: "\f009";
677 | $fa-var-th-list: "\f00b";
678 | $fa-var-themeisle: "\f2b2";
679 | $fa-var-thermometer: "\f2c7";
680 | $fa-var-thermometer-0: "\f2cb";
681 | $fa-var-thermometer-1: "\f2ca";
682 | $fa-var-thermometer-2: "\f2c9";
683 | $fa-var-thermometer-3: "\f2c8";
684 | $fa-var-thermometer-4: "\f2c7";
685 | $fa-var-thermometer-empty: "\f2cb";
686 | $fa-var-thermometer-full: "\f2c7";
687 | $fa-var-thermometer-half: "\f2c9";
688 | $fa-var-thermometer-quarter: "\f2ca";
689 | $fa-var-thermometer-three-quarters: "\f2c8";
690 | $fa-var-thumb-tack: "\f08d";
691 | $fa-var-thumbs-down: "\f165";
692 | $fa-var-thumbs-o-down: "\f088";
693 | $fa-var-thumbs-o-up: "\f087";
694 | $fa-var-thumbs-up: "\f164";
695 | $fa-var-ticket: "\f145";
696 | $fa-var-times: "\f00d";
697 | $fa-var-times-circle: "\f057";
698 | $fa-var-times-circle-o: "\f05c";
699 | $fa-var-times-rectangle: "\f2d3";
700 | $fa-var-times-rectangle-o: "\f2d4";
701 | $fa-var-tint: "\f043";
702 | $fa-var-toggle-down: "\f150";
703 | $fa-var-toggle-left: "\f191";
704 | $fa-var-toggle-off: "\f204";
705 | $fa-var-toggle-on: "\f205";
706 | $fa-var-toggle-right: "\f152";
707 | $fa-var-toggle-up: "\f151";
708 | $fa-var-trademark: "\f25c";
709 | $fa-var-train: "\f238";
710 | $fa-var-transgender: "\f224";
711 | $fa-var-transgender-alt: "\f225";
712 | $fa-var-trash: "\f1f8";
713 | $fa-var-trash-o: "\f014";
714 | $fa-var-tree: "\f1bb";
715 | $fa-var-trello: "\f181";
716 | $fa-var-tripadvisor: "\f262";
717 | $fa-var-trophy: "\f091";
718 | $fa-var-truck: "\f0d1";
719 | $fa-var-try: "\f195";
720 | $fa-var-tty: "\f1e4";
721 | $fa-var-tumblr: "\f173";
722 | $fa-var-tumblr-square: "\f174";
723 | $fa-var-turkish-lira: "\f195";
724 | $fa-var-tv: "\f26c";
725 | $fa-var-twitch: "\f1e8";
726 | $fa-var-twitter: "\f099";
727 | $fa-var-twitter-square: "\f081";
728 | $fa-var-umbrella: "\f0e9";
729 | $fa-var-underline: "\f0cd";
730 | $fa-var-undo: "\f0e2";
731 | $fa-var-universal-access: "\f29a";
732 | $fa-var-university: "\f19c";
733 | $fa-var-unlink: "\f127";
734 | $fa-var-unlock: "\f09c";
735 | $fa-var-unlock-alt: "\f13e";
736 | $fa-var-unsorted: "\f0dc";
737 | $fa-var-upload: "\f093";
738 | $fa-var-usb: "\f287";
739 | $fa-var-usd: "\f155";
740 | $fa-var-user: "\f007";
741 | $fa-var-user-circle: "\f2bd";
742 | $fa-var-user-circle-o: "\f2be";
743 | $fa-var-user-md: "\f0f0";
744 | $fa-var-user-o: "\f2c0";
745 | $fa-var-user-plus: "\f234";
746 | $fa-var-user-secret: "\f21b";
747 | $fa-var-user-times: "\f235";
748 | $fa-var-users: "\f0c0";
749 | $fa-var-vcard: "\f2bb";
750 | $fa-var-vcard-o: "\f2bc";
751 | $fa-var-venus: "\f221";
752 | $fa-var-venus-double: "\f226";
753 | $fa-var-venus-mars: "\f228";
754 | $fa-var-viacoin: "\f237";
755 | $fa-var-viadeo: "\f2a9";
756 | $fa-var-viadeo-square: "\f2aa";
757 | $fa-var-video-camera: "\f03d";
758 | $fa-var-vimeo: "\f27d";
759 | $fa-var-vimeo-square: "\f194";
760 | $fa-var-vine: "\f1ca";
761 | $fa-var-vk: "\f189";
762 | $fa-var-volume-control-phone: "\f2a0";
763 | $fa-var-volume-down: "\f027";
764 | $fa-var-volume-off: "\f026";
765 | $fa-var-volume-up: "\f028";
766 | $fa-var-warning: "\f071";
767 | $fa-var-wechat: "\f1d7";
768 | $fa-var-weibo: "\f18a";
769 | $fa-var-weixin: "\f1d7";
770 | $fa-var-whatsapp: "\f232";
771 | $fa-var-wheelchair: "\f193";
772 | $fa-var-wheelchair-alt: "\f29b";
773 | $fa-var-wifi: "\f1eb";
774 | $fa-var-wikipedia-w: "\f266";
775 | $fa-var-window-close: "\f2d3";
776 | $fa-var-window-close-o: "\f2d4";
777 | $fa-var-window-maximize: "\f2d0";
778 | $fa-var-window-minimize: "\f2d1";
779 | $fa-var-window-restore: "\f2d2";
780 | $fa-var-windows: "\f17a";
781 | $fa-var-won: "\f159";
782 | $fa-var-wordpress: "\f19a";
783 | $fa-var-wpbeginner: "\f297";
784 | $fa-var-wpexplorer: "\f2de";
785 | $fa-var-wpforms: "\f298";
786 | $fa-var-wrench: "\f0ad";
787 | $fa-var-xing: "\f168";
788 | $fa-var-xing-square: "\f169";
789 | $fa-var-y-combinator: "\f23b";
790 | $fa-var-y-combinator-square: "\f1d4";
791 | $fa-var-yahoo: "\f19e";
792 | $fa-var-yc: "\f23b";
793 | $fa-var-yc-square: "\f1d4";
794 | $fa-var-yelp: "\f1e9";
795 | $fa-var-yen: "\f157";
796 | $fa-var-yoast: "\f2b1";
797 | $fa-var-youtube: "\f167";
798 | $fa-var-youtube-play: "\f16a";
799 | $fa-var-youtube-square: "\f166";
800 |
801 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "animated";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 | @import "screen-reader";
19 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/synthetic_css/_synthetic_offline.sass:
--------------------------------------------------------------------------------
1 | =bg($x)
2 | background-color: #dec6a1
3 | background-image: url($x)
4 | background-size: cover
5 | background-attachment: fixed
6 |
7 |
8 | body
9 | &.syn
10 | +bg('紙背景花紋.webp')
11 | font-family: 'Noto Serif SC'
12 | button, input, textarea
13 | font-family: 'Noto Serif SC'
14 |
15 | &.synth
16 | @extend .syn
17 | margin: 0px
18 | strong, b
19 | font-weight: normal
20 | text-shadow: 0px 0px 2px rgba(0, 0, 0, 1)
21 | h1, h2, h3, h4, h5
22 | font-weight: normal
23 | hr
24 | border: none
25 | border-top: 1px solid rgba(120, 50 ,0 ,0.5)
26 | ::-moz-focus-inner
27 | border: none
28 | ::-moz-focus-outer
29 | border: none
30 |
31 | header
32 | &.syn
33 | background: rgba(0, 0, 0, 0.3)
34 | box-shadow: 0px 0px 2vh rgba(0, 0, 0, 0.4)
35 | &.synth
36 | @extend .syn
37 | display: flex
38 | justify-content: center
39 | align-items: center
40 |
41 | div
42 | &.syn
43 | +bg('紙背景花紋模糊.webp')
44 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6)
45 | &.synth
46 | @extend .syn
47 | margin: 0.5vw
48 | padding: 0.5vw
49 | border-radius: 0.5vw
50 | overflow-y: auto
51 | &::-webkit-scrollbar
52 | cursor: pointer
53 | width: 20px
54 | background-image: -webkit-linear-gradient(0deg, transparent 40%, rgba(0,0,0,0.2)40%,rgba(0,0,0,0.2)60%,transparent 60%, transparent)
55 | border-radius: 16px
56 | &::-webkit-scrollbar-thumb
57 | border-radius: 0.5vw
58 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.35), 0px 0px 10px rgba(255, 255, 255, 1) inset
59 | background: rgba(255,255,200,0.65)
60 | backdrop-filter: blur(4px)
61 |
62 | table
63 | &.syn
64 | border-radius: 2px
65 | border-collapse: collapse
66 | border-style: hidden
67 | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5)
68 | th
69 | background-color: rgba(0, 0, 0, 0.08)
70 | td,th
71 | padding: 0.2em 1em
72 | text-align: center
73 | vertical-align: center
74 | border: 1px solid rgba(0, 0, 0, 0.5)
75 | &.synth
76 | @extend .syn
77 |
78 | button, a
79 | &.syn
80 | $shadow_range: 0.8vw
81 |
82 | outline: none
83 | border: none
84 | -webkit-user-select: none
85 | text-decoration: none
86 |
87 | color: inherit
88 | cursor: pointer
89 |
90 | +bg('./紙背景花紋模糊.webp')
91 |
92 | box-shadow: 0px 0px $shadow_range rgba(0, 0, 0, 0.6), 0px 0px $shadow_range/2 rgba(0, 0, 0, 0) inset
93 | filter: brightness(1.05) hue-rotate(-6deg)
94 |
95 | transition: box-shadow 0.2s, filter 0.1s
96 | &:enabled
97 | &:hover
98 | box-shadow: 0px 0px $shadow_range/2 rgba(0, 0, 0, 0.7), 0px 0px $shadow_range/2 rgba(0, 0, 0, 0) inset
99 | filter: brightness(1.1) hue-rotate(-12deg)
100 | &:active
101 | box-shadow: 0px 0px $shadow_range/2 rgba(0, 0, 0, 0), 0px 0px $shadow_range/2 rgba(0, 0, 0, 0.6) inset
102 | filter: blur(0.1vw)
103 | &:disabled
104 | cursor: not-allowed
105 | color: rgba(0, 0, 0, 0.6)
106 |
107 | &.synth
108 | @extend .syn
109 | font-size: inherit
110 | display: inline-block
111 | padding: 0.5vw
112 | margin: 0.5vw
113 | border-radius: 0.5vw
114 |
115 |
116 | blockquote
117 | &.syn
118 | color: rgba(0, 0, 60, 1)
119 | border-left: 3px solid rgba(0, 0, 0, 0.4)
120 | &.synth
121 | @extend .syn
122 | padding-left: 6px
123 | margin-left: 6px
124 |
125 | img
126 | &.syn
127 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6)
128 | border-radius: 0.5vw
129 | &.synth
130 | @extend .syn
131 | margin: 0.5vw
132 |
133 |
134 | hr
135 | &.syn
136 | width: 90%
137 | &.synth
138 | border: none !important
139 | height: 6px
140 | border-radius: 40%
141 | background: rgba(0, 0, 0, 0.2)
142 |
143 | input[type="range"]
144 | &.syn
145 | outline: none
146 | -webkit-appearance: none
147 | -moz-appearance: none
148 | background: linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.2), rgba(0,0,0,0.3))
149 | border-radius: 5px
150 | height: 5px
151 | transition: all 0.2s
152 | &:hover
153 | transform: scaleY(2)
154 | // 其實乘好不總是1我也不知道怎麼辦……
155 | &::-webkit-slider-thumb
156 | transform: scaleY(0.5)
157 | &::-moz-range-thumb
158 | transform: scaleY(0.5)
159 |
160 | &::-webkit-slider-thumb
161 | transition: all 0.2s
162 | cursor: pointer
163 | -webkit-appearance: none
164 | height: 20px
165 | width: 20px
166 | border-radius: 100%
167 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px rgba(255, 255, 255, 1) inset
168 | background: rgba(255,255,200,0.5)
169 | &::-moz-range-thumb
170 | transition: all 0.2s
171 | cursor: pointer
172 | height: 20px
173 | width: 20px
174 | border-radius: 100%
175 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px rgba(255, 255, 255, 1) inset
176 | background: rgba(255,255,200,0.5)
177 | &.synth
178 | @extend .syn
179 |
180 | input[type="checkbox"]
181 | &.syn
182 | -webkit-appearance: none
183 | -moz-appearance: none
184 | outline: none
185 | cursor: pointer
186 | height: 20px
187 | width: 20px
188 | border-radius: 100%
189 | background-color: rgba(0,0,0,0.15)
190 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0), 0px 0px 10px rgba(0, 0, 0, 0.4) inset
191 | transition: all 0.2s
192 |
193 | display: flex
194 | justify-content: center
195 | align-items: center
196 | &::before
197 | font-size: 16px
198 | content: '✗'
199 | color: rgba(0,0,0,0)
200 | text-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8)
201 | &:checked
202 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px rgba(255, 255, 255, 1) inset
203 | background: rgba(255,255,200,0.5)
204 | &::before
205 | content: '✓'
206 | text-shadow: 0px 0px 2px rgba(255, 0, 0, 0.8)
207 | &.synth
208 | @extend .syn
209 |
210 | input[type="text"], input[type="password"], input[type="number"]
211 | &.syn
212 | background: rgba(0,0,0,0)
213 | outline: none
214 | border: solid 1px rgba(0,0,0,0.3)
215 | border-radius: 2px
216 | padding: 2px
217 |
218 | &.synth
219 | @extend .syn
220 | border: none
221 | border-radius: 0px
222 | border-bottom: solid 1px rgba(55,55,0,0.6)
223 | border-top: solid 1px rgba(0,0,0,0)
224 | text-align: center
225 | &:hover
226 | padding: 0px 2px
227 | border-top: solid 3px rgba(0,0,0,0)
228 | border-bottom: solid 3px rgba(55,55,0,0.4)
229 |
230 | textarea
231 | &.syn
232 | background: rgba(0,0,0,0)
233 | outline: none
234 | border: solid 1px rgba(0,0,0,0.3)
235 | border-radius: 2px
236 |
237 | progress
238 | &.syn
239 | -webkit-appearance: none
240 | -moz-appearence: none
241 | appearance: none
242 | background: transparent
243 | border: 1px solid rgba(0, 0, 0, 0.15)
244 | border-radius: 3px
245 | box-shadow: 0px 0px 8px rgba(0,0,0,0.3) inset
246 | background: rgba(0,0,0,0.2)
247 | &::-webkit-progress-bar
248 | background: transparent
249 | &::-webkit-progress-value
250 | background: transparent
251 | border-radius: 3px
252 | border-right: 1px solid rgba(0, 0, 0, 0.3)
253 | backdrop-filter: saturate(0.8) contrast(1.8) brightness(1.3)
254 |
255 | &::-moz-progress-bar
256 | +bg('紙背景花紋模糊.webp')
257 | border-radius: 3px
258 | filter: brightness(0.8) saturate(0.8) contrast(1.8) brightness(1.3)
259 |
260 | &.synth
261 | @extend .syn
262 | display: flex
263 | justify-content: center
264 | align-items: center
265 | height: 24px
266 | margin: 4px
267 | &::after
268 | content: attr(value)"/"attr(max)
269 | position: absolute
270 | opacity: 0.75
271 | text-shadow: 0px 0px 3px rgba(0, 0, 0, 1)
272 | color: #ffd
273 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/synthetic_css/synthetic_offline.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 | body.syn, body.synth {
3 | background-color: #dec6a1;
4 | background-image: url("紙背景花紋.webp");
5 | background-size: cover;
6 | background-attachment: fixed;
7 | font-family: "Noto Serif SC"; }
8 | body.syn button, body.synth button, body.syn input, body.synth input, body.syn textarea, body.synth textarea {
9 | font-family: "Noto Serif SC"; }
10 | body.synth {
11 | margin: 0px; }
12 | body.synth strong, body.synth b {
13 | font-weight: normal;
14 | text-shadow: 0px 0px 2px black; }
15 | body.synth h1, body.synth h2, body.synth h3, body.synth h4, body.synth h5 {
16 | font-weight: normal; }
17 | body.synth hr {
18 | border: none;
19 | border-top: 1px solid rgba(120, 50, 0, 0.5); }
20 | body.synth ::-moz-focus-inner {
21 | border: none; }
22 | body.synth ::-moz-focus-outer {
23 | border: none; }
24 |
25 | header.syn, header.synth {
26 | background: rgba(0, 0, 0, 0.3);
27 | box-shadow: 0px 0px 2vh rgba(0, 0, 0, 0.4); }
28 | header.synth {
29 | display: flex;
30 | justify-content: center;
31 | align-items: center; }
32 |
33 | div.syn, div.synth {
34 | background-color: #dec6a1;
35 | background-image: url("紙背景花紋模糊.webp");
36 | background-size: cover;
37 | background-attachment: fixed;
38 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6); }
39 | div.synth {
40 | margin: 0.5vw;
41 | padding: 0.5vw;
42 | border-radius: 0.5vw;
43 | overflow-y: auto; }
44 | div.synth::-webkit-scrollbar {
45 | cursor: pointer;
46 | width: 20px;
47 | background-image: -webkit-linear-gradient(0deg, transparent 40%, rgba(0, 0, 0, 0.2) 40%, rgba(0, 0, 0, 0.2) 60%, transparent 60%, transparent);
48 | border-radius: 16px; }
49 | div.synth::-webkit-scrollbar-thumb {
50 | border-radius: 0.5vw;
51 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.35), 0px 0px 10px white inset;
52 | background: rgba(255, 255, 200, 0.65);
53 | backdrop-filter: blur(4px); }
54 |
55 | table.syn, table.synth {
56 | border-radius: 2px;
57 | border-collapse: collapse;
58 | border-style: hidden;
59 | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5); }
60 | table.syn th, table.synth th {
61 | background-color: rgba(0, 0, 0, 0.08); }
62 | table.syn td, table.synth td, table.syn th, table.synth th {
63 | padding: 0.2em 1em;
64 | text-align: center;
65 | vertical-align: center;
66 | border: 1px solid rgba(0, 0, 0, 0.5); }
67 |
68 | button.syn, button.synth, a.syn, a.synth {
69 | outline: none;
70 | border: none;
71 | -webkit-user-select: none;
72 | text-decoration: none;
73 | color: inherit;
74 | cursor: pointer;
75 | background-color: #dec6a1;
76 | background-image: url("./紙背景花紋模糊.webp");
77 | background-size: cover;
78 | background-attachment: fixed;
79 | box-shadow: 0px 0px 0.8vw rgba(0, 0, 0, 0.6), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset;
80 | filter: brightness(1.05) hue-rotate(-6deg);
81 | transition: box-shadow 0.2s, filter 0.1s; }
82 | button.syn:enabled:hover, button.synth:enabled:hover, a.syn:enabled:hover, a.synth:enabled:hover {
83 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0.7), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset;
84 | box-shadow-filter: brightness(1.1) hue-rotate(-12deg); }
85 | button.syn:enabled:active, button.synth:enabled:active, a.syn:enabled:active, a.synth:enabled:active {
86 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0), 0px 0px 0.4vw rgba(0, 0, 0, 0.6) inset;
87 | filter: blur(0.1vw); }
88 | button.syn:disabled, button.synth:disabled, a.syn:disabled, a.synth:disabled {
89 | cursor: not-allowed;
90 | color: rgba(0, 0, 0, 0.6); }
91 | button.synth, a.synth {
92 | font-size: inherit;
93 | display: inline-block;
94 | padding: 0.5vw;
95 | margin: 0.5vw;
96 | border-radius: 0.5vw; }
97 |
98 | blockquote.syn, blockquote.synth {
99 | color: #00003c;
100 | border-left: 3px solid rgba(0, 0, 0, 0.4); }
101 | blockquote.synth {
102 | padding-left: 6px;
103 | margin-left: 6px; }
104 |
105 | img.syn, img.synth {
106 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6);
107 | border-radius: 0.5vw; }
108 | img.synth {
109 | margin: 0.5vw; }
110 |
111 | hr.syn {
112 | width: 90%; }
113 | hr.synth {
114 | border: none !important;
115 | height: 6px;
116 | border-radius: 40%;
117 | background: rgba(0, 0, 0, 0.2); }
118 |
119 | input[type="range"].syn, input[type="range"].synth {
120 | outline: none;
121 | -webkit-appearance: none;
122 | -moz-appearance: none;
123 | background: linear-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.3));
124 | border-radius: 5px;
125 | height: 5px;
126 | transition: all 0.2s; }
127 | input[type="range"].syn:hover, input[type="range"].synth:hover {
128 | transform: scaleY(2); }
129 | input[type="range"].syn:hover::-webkit-slider-thumb, input[type="range"].synth:hover::-webkit-slider-thumb {
130 | transform: scaleY(0.5); }
131 | input[type="range"].syn:hover::-moz-range-thumb, input[type="range"].synth:hover::-moz-range-thumb {
132 | transform: scaleY(0.5); }
133 | input[type="range"].syn::-webkit-slider-thumb, input[type="range"].synth::-webkit-slider-thumb {
134 | transition: all 0.2s;
135 | cursor: pointer;
136 | -webkit-appearance: none;
137 | height: 20px;
138 | width: 20px;
139 | border-radius: 100%;
140 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px white inset;
141 | background: rgba(255, 255, 200, 0.5); }
142 | input[type="range"].syn::-moz-range-thumb, input[type="range"].synth::-moz-range-thumb {
143 | transition: all 0.2s;
144 | cursor: pointer;
145 | height: 20px;
146 | width: 20px;
147 | border-radius: 100%;
148 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px white inset;
149 | background: rgba(255, 255, 200, 0.5); }
150 |
151 | input[type="checkbox"].syn, input[type="checkbox"].synth {
152 | -webkit-appearance: none;
153 | -moz-appearance: none;
154 | outline: none;
155 | cursor: pointer;
156 | height: 20px;
157 | width: 20px;
158 | border-radius: 100%;
159 | background-color: rgba(0, 0, 0, 0.15);
160 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0), 0px 0px 10px rgba(0, 0, 0, 0.4) inset;
161 | transition: all 0.2s;
162 | display: flex;
163 | justify-content: center;
164 | align-items: center; }
165 | input[type="checkbox"].syn::before, input[type="checkbox"].synth::before {
166 | font-size: 16px;
167 | content: "✗";
168 | color: rgba(0, 0, 0, 0);
169 | text-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8); }
170 | input[type="checkbox"].syn:checked, input[type="checkbox"].synth:checked {
171 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px white inset;
172 | background: rgba(255, 255, 200, 0.5); }
173 | input[type="checkbox"].syn:checked::before, input[type="checkbox"].synth:checked::before {
174 | content: "✓";
175 | text-shadow: 0px 0px 2px rgba(255, 0, 0, 0.8); }
176 |
177 | input[type="text"].syn, input[type="text"].synth, input[type="password"].syn, input[type="password"].synth, input[type="number"].syn, input[type="number"].synth {
178 | background: rgba(0, 0, 0, 0);
179 | outline: none;
180 | border: solid 1px rgba(0, 0, 0, 0.3);
181 | border-radius: 2px;
182 | padding: 2px; }
183 | input[type="text"].synth, input[type="password"].synth, input[type="number"].synth {
184 | border: none;
185 | border-radius: 0px;
186 | border-bottom: solid 1px rgba(55, 55, 0, 0.6);
187 | border-top: solid 1px rgba(0, 0, 0, 0);
188 | text-align: center; }
189 | input[type="text"].synth:hover, input[type="password"].synth:hover, input[type="number"].synth:hover {
190 | padding: 0px 2px;
191 | border-top: solid 3px rgba(0, 0, 0, 0);
192 | border-bottom: solid 3px rgba(55, 55, 0, 0.4); }
193 |
194 | textarea.syn {
195 | background: rgba(0, 0, 0, 0);
196 | outline: none;
197 | border: solid 1px rgba(0, 0, 0, 0.3);
198 | border-radius: 2px; }
199 |
200 | progress.syn, progress.synth {
201 | -webkit-appearance: none;
202 | -moz-appearence: none;
203 | appearance: none;
204 | background: transparent;
205 | border: 1px solid rgba(0, 0, 0, 0.15);
206 | border-radius: 3px;
207 | box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.3) inset;
208 | background: rgba(0, 0, 0, 0.2); }
209 | progress.syn::-webkit-progress-bar, progress.synth::-webkit-progress-bar {
210 | background: transparent; }
211 | progress.syn::-webkit-progress-value, progress.synth::-webkit-progress-value {
212 | background: transparent;
213 | border-radius: 3px;
214 | border-right: 1px solid rgba(0, 0, 0, 0.3);
215 | backdrop-filter: saturate(0.8) contrast(1.8) brightness(1.3); }
216 | progress.syn::-moz-progress-bar, progress.synth::-moz-progress-bar {
217 | background-color: #dec6a1;
218 | background-image: url("紙背景花紋模糊.webp");
219 | background-size: cover;
220 | background-attachment: fixed;
221 | border-radius: 3px;
222 | filter: brightness(0.8) saturate(0.8) contrast(1.8) brightness(1.3); }
223 | progress.synth {
224 | display: flex;
225 | justify-content: center;
226 | align-items: center;
227 | height: 24px;
228 | margin: 4px; }
229 | progress.synth::after {
230 | content: attr(value) "/" attr(max);
231 | position: absolute;
232 | opacity: 0.75;
233 | text-shadow: 0px 0px 3px black;
234 | color: #ffd; }
235 |
236 | /*# sourceMappingURL=synthetic.css.map */
237 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋.webp
--------------------------------------------------------------------------------
/librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋模糊.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋模糊.webp
--------------------------------------------------------------------------------
/librian/librian本體/前端/默認標題畫面/定位.coffee:
--------------------------------------------------------------------------------
1 | window.onload = ->
2 | x = y = now_x = now_y = 0;
3 | body = document.querySelector('body')
4 | body.onmousemove = (e) =>
5 | now_x = e.pageX
6 | now_y = e.pageY
7 | 循环 = ->
8 | x = (x*9 + now_x)/10
9 | y = (y*9 + now_y)/10
10 | body.style.setProperty('--x', "#{-x/100}px")
11 | body.style.setProperty('--y', "#{-y/100}px")
12 | body.style.setProperty('--s', "#{x/20}deg")
13 | setTimeout(循环, 15)
14 | 循环()
--------------------------------------------------------------------------------
/librian/librian本體/前端/默認標題畫面/定位.js:
--------------------------------------------------------------------------------
1 | // Generated by CoffeeScript 2.5.0
2 | (function() {
3 | window.onload = function() {
4 | var body, now_x, now_y, x, y, 循环;
5 | x = y = now_x = now_y = 0;
6 | body = document.querySelector('body');
7 | body.onmousemove = (e) => {
8 | now_x = e.pageX;
9 | return now_y = e.pageY;
10 | };
11 | 循环 = function() {
12 | x = (x * 9 + now_x) / 10;
13 | y = (y * 9 + now_y) / 10;
14 | body.style.setProperty('--x', `${-x / 100}px`);
15 | body.style.setProperty('--y', `${-y / 100}px`);
16 | body.style.setProperty('--s', `${x / 20}deg`);
17 | return setTimeout(循环, 15);
18 | };
19 | return 循环();
20 | };
21 |
22 | }).call(this);
23 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/默認標題畫面/標題.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
11 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/librian/librian本體/前端/默認標題畫面/標題.ptml:
--------------------------------------------------------------------------------
1 | html:
2 | head:
3 | meta http-equiv="Content-Type" content="text/html; charset=utf-8";
4 | link rel='stylesheet' href='./樣式.css';
5 | script src="./定位.js":
6 | body.synth:
7 | div#bb:
8 | div#bg2:
9 | div.主:
10 | div:
11 | a href='javascript:山彥.開始();':
12 | 開始遊戲
13 | div:
14 | a href='javascript:山彥.讀檔畫面();':
15 | 繼續遊戲
16 | div:
17 | a href='javascript:山彥.退出();':
18 | 退出
--------------------------------------------------------------------------------
/librian/librian本體/前端/默認標題畫面/樣式.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 思源宋體SemiBold;
3 | src: url('../dist/NotoSerifSC-SemiBold.otf');
4 | }
5 |
6 | @keyframes a {
7 | 0% {
8 | opacity: 0;
9 | }
10 | 100% {
11 | opacity: 1;
12 | }
13 | }
14 |
15 | :root {
16 | --x: 0px;
17 | --y: 0px;
18 | }
19 |
20 | body {
21 | font-family: 思源宋體SemiBold !important;
22 | font-size: 1.6vw;
23 | text-shadow: 0px 0px 5px #FFF;
24 | overflow: hidden;
25 | animation-name: a;
26 | animation-duration: 1s;
27 | animation-delay: 0.2s;
28 | animation-fill-mode: both;
29 | background-color: #dec6a1;
30 | background-image: url('../dist/紙背景花紋.webp');
31 | background-size: cover;
32 | background-attachment: fixed;
33 | }
34 |
35 | a {
36 | padding: 1vw 1.5vw;
37 | display: inline-block;
38 | outline: none;
39 | border: none;
40 | -webkit-user-select: none;
41 | text-decoration: none;
42 | color: inherit;
43 | cursor: pointer;
44 | background-image: url('../dist/紙背景花紋模糊.webp');
45 | background-size: cover;
46 | background-attachment: fixed;
47 | box-shadow: 0px 0px 0.8vw rgba(0, 0, 0, 0.6), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset;
48 | filter: brightness(1.05) hue-rotate(-6deg);
49 | transition: box-shadow 0.2s, filter 0.1s;
50 | font-size: inherit;
51 | margin: 0.5vw;
52 | border-radius: 0.5vw;
53 | }
54 |
55 | a:hover {
56 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0.7), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset;
57 | filter: brightness(1.1) hue-rotate(-12deg);
58 | }
59 |
60 | a:active {
61 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0), 0px 0px 0.4vw rgba(0, 0, 0, 0.6) inset;
62 | filter: blur(0.1vw);
63 | }
64 |
65 | #bb {
66 | filter: drop-shadow(var(--x) var(--y) 0.8vw rgba(0, 0, 0, 0.6));
67 | position: fixed;
68 | top: 0;
69 | left: 0;
70 | width: 100%;
71 | height: 100%;
72 | margin: 0;
73 | padding: 0;
74 | z-index: -1;
75 | }
76 |
77 | #bg2 {
78 | -webkit-mask-image: url('虛僞的假面.png');
79 | -webkit-mask-size: cover;
80 | filter: hue-rotate(var(--s));
81 | background: url('../dist/紙背景花紋模糊.webp');
82 | background-size: cover;
83 | width: 100%;
84 | height: 100%;
85 | }
86 |
87 | .主 {
88 | font-size: 250%;
89 | line-height: 150%;
90 | margin-left: 50%;
91 | margin-top: 10%;
92 | }
93 |
94 | .主>div {
95 | margin: 8%;
96 | }
--------------------------------------------------------------------------------
/librian/librian本體/前端/默認標題畫面/虛僞的假面.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/默認標題畫面/虛僞的假面.png
--------------------------------------------------------------------------------
/librian/librian本體/土特產/liber.sublime-syntax:
--------------------------------------------------------------------------------
1 | %YAML 1.2
2 | ---
3 | # See http://www.sublimetext.com/docs/3/syntax.html
4 | file_extensions:
5 | - play
6 | - liber
7 | scope: source.liber
8 |
9 | contexts:
10 | main:
11 | - include: 註釋
12 | - include: 對話
13 | - include: 嵌入py
14 | - include: 嵌入html
15 | - include: 嵌入js
16 | - include: 躍點
17 | - include: 功能
18 | - include: 鏡頭
19 | - include: 鏡頭
20 | - include: 跳轉
21 | - include: 圖片
22 | - include: 持續
23 | - include: 旁白
24 |
25 | 註釋:
26 | - match: '^#'
27 | scope: punctuation.definition.comment.liber
28 | push:
29 | - meta_scope: comment.line.double-slash.liber
30 | - match: $
31 | pop: true
32 |
33 | 躍點:
34 | - match: '\*'
35 | push:
36 | - meta_scope: keyword.control.label.liber
37 | - match: $
38 | pop: true
39 |
40 | 功能:
41 | - match: '^>'
42 | scope: support.function.builtin.liber
43 | push:
44 | - match: '$'
45 | pop: true
46 | - match: '(?=\S+\(.*\))'
47 | push:
48 | - include: 'scope:source.python'
49 | with_prototype:
50 | - match: $
51 | pop: true
52 | - match: '\w+\b'
53 | scope: variable.function.liber
54 | push:
55 | - meta_include_prototype: true
56 | - meta_scope: variable.parameter.liber
57 | - match: '$'
58 | pop: true
59 | - match: '$'
60 | pop: true
61 |
62 | 對話:
63 | - match: '(^[^\)]+?)(?=(?=[ ::\||🐴\(\[「"])(?:\s*[\||🐴]\s*([^\s\)]*?))?\s*\[[^\]\s]*?\]\s*?(?![\(「"::])$)'
64 | scope: entity.name.tag.liber
65 | push:
66 | - match: '[\||🐴]'
67 | scope: keyword.operator.binary.liber
68 | - match: '\[\S*\]'
69 | scope: invalid.illegal.missing-attribute.liber
70 | - match: $
71 | pop: true
72 | - match: (^[^>+-?"「 ]\S*?)(?=(?=[ ::\||🐴\(\[「"])(?:[\||🐴]\s*(\S*?))?(?:\s*(\(.+?)?|\s*(\[.+?)?)*(\s*(?:[::].*)|\s*(?:[「"].*)?$))
73 | scope: entity.name.tag.liber
74 | push:
75 | - include: 文本
76 | - match: '(?:\[\S*\]|\(\S*\))\s*(?:\[\S*\]|\(\S*\))\s*(?:\[\S*\]|\(\S*\))+'
77 | scope: invalid.illegal.unexpected-attribute.liber
78 | - match: '(\[\S*\]\s*\(\S*\))'
79 | scope: invalid.illegal.attribute-order.liber
80 | - match: '[\)\]]'
81 | scope: invalid.illegal.stray-bracket-end.liber
82 | - match: '\('
83 | scope: punctuation.definition.delimeter.parenthesis.liber
84 | push:
85 | - meta_scope: entity.other.attribute-name.liber
86 | - match: '\s'
87 | pop: true
88 | - match: '\)'
89 | pop: true
90 | - match: '\['
91 | scope: punctuation.definition.delimeter.brackets.liber
92 | push:
93 | - meta_scope: entity.other.attribute-name.liber
94 | - match: \s
95 | pop: true
96 | - match: '\]'
97 | pop: true
98 | - match: '\s+[\||🐴]\s+|\s+[\||🐴]|[\||🐴]\s+'
99 | scope: invalid.illegal.extra-spaces.liber
100 | - match: '[\||🐴]'
101 | scope: keyword.operator.binary.liber
102 | - match: '(?<=.)[::]'
103 | scope: keyword.operator.binary.liber
104 | - match: '(?<=(」|"))'
105 | pop: true
106 | - match: '$'
107 | pop: true
108 |
109 | 鏡頭:
110 | - match: '^[+-]'
111 | scope: support.function.builtin.liber
112 | push:
113 | - match: '$'
114 | pop: true
115 | - match: ''
116 | push:
117 | - include: 'scope:source.yaml'
118 | with_prototype:
119 | - match: $
120 | pop: true
121 |
122 | 旁白:
123 | - match: ^.+
124 | scope: text.plain.liber
125 |
126 | 文本:
127 | - match: '「[\s\S]*?'
128 | scope: punctuation.definition.string.liber
129 | push:
130 | - meta_scope: string.quoted.ideographic.liber
131 | - match: '」'
132 | scope: punctuation.definition.string.liber
133 | pop: true
134 | - match: '"[\s\S]*?'
135 | scope: punctuation.definition.string.liber
136 | push:
137 | - meta_scope: string.quoted.double.liber
138 | - match: '"'
139 | scope: punctuation.definition.string.liber
140 | pop: true
141 | - match: '(?<=[::]).+'
142 | push:
143 | - meta_scope: string.quoted.liber
144 | - match: '$'
145 | pop: true
146 |
147 | 跳轉:
148 | - match: ^(\?)\s*(.+?)\s*(->)\s*(\S+?)\s*(,?)\s*(\S+)$
149 | captures:
150 | 1: support.function.builtin.liber
151 | 2: variable.parameter.liber
152 | 3: keyword.operator.binary.liber
153 | 4: variable.function.liber
154 | 5: punctuation.separator.liber
155 | 6: variable.function.liber
156 |
157 |
158 | 圖片:
159 | - match: ^(={3,})(.+)$$
160 | captures:
161 | 1: support.function.builtin.liber
162 | 2: variable.parameter.liber
163 |
164 | 持續:
165 | - match: ^(@)\s*(\S+?)\s*([\|+-])?\s*([^\|+-]+?)$
166 | captures:
167 | 1: support.function.builtin.liber
168 | 2: variable.parameter.liber
169 | 3: keyword.operator.binary.liber
170 | 4: variable.function.liber
171 |
172 | 嵌入html:
173 | - match: '^(```(HTML|html)?)$'
174 | scope: support.function.liber
175 | push:
176 | - match: '```'
177 | scope: support.function.liber
178 | pop: true
179 |
180 | - match: '\s*'
181 | push:
182 | - include: 'scope:text.html.basic'
183 | with_prototype:
184 | - match: '(?=(```))'
185 | pop: true
186 | 嵌入py:
187 | - match: '^(```(py|python)?)$'
188 | scope: support.function.liber
189 | push:
190 | - match: '```'
191 | scope: support.function.liber
192 | pop: true
193 |
194 | - match: '\s*'
195 | push:
196 | - include: 'scope:source.python'
197 | with_prototype:
198 | - match: '(?=(```))'
199 | pop: true
200 | 嵌入js:
201 | - match: '^(```(js|javascript)?)$'
202 | scope: support.function.liber
203 | push:
204 | - match: '```'
205 | scope: support.function.liber
206 | pop: true
207 |
208 | - match: '\s*'
209 | push:
210 | - include: 'scope:source.js'
211 | with_prototype:
212 | - match: '(?=(```))'
213 | pop: true
214 |
215 |
--------------------------------------------------------------------------------
/librian/librian本體/土特產/protobuf.cson:
--------------------------------------------------------------------------------
1 | scopeName: 'source.liber'
2 | name: 'liber'
3 | fileTypes: ['liber','play']
4 | patterns: [
5 | {
6 | begin: '^(```(py|python)?)$'
7 | end: '^(```)$'
8 | beginCaptures:
9 | 1:
10 | name: 'operator'
11 | 2:
12 | name: 'storage.inline'
13 | endCaptures:
14 | 1:
15 | name: 'operator'
16 | patterns: [
17 | {
18 | include: 'source.python'
19 | }
20 | ]
21 | }
22 | {
23 | begin: '^(```(js|javascript)?)$'
24 | end: '^(```)$'
25 | beginCaptures:
26 | 1:
27 | name: 'operator'
28 | 2:
29 | name: 'storage.inline'
30 | endCaptures:
31 | 1:
32 | name: 'operator'
33 | patterns: [
34 | {
35 | include: 'source.js'
36 | }
37 | ]
38 | }
39 | {
40 | begin: '(?=<)'
41 | end: '(?<=>)'
42 | patterns: [
43 | {
44 | include: 'text.html.basic'
45 | }
46 | ]
47 | }
48 | {
49 | match: '^#.*?$'
50 | name: 'comment'
51 | }
52 | {
53 | match: '^([@\\+\\-\\>\\*]|={3,})(.*?)$'
54 | captures:
55 | 1:
56 | name: 'operator'
57 | 2:
58 | name: 'support.function'
59 | }
60 | {
61 | match: '^(((?:([^|]*?)\\|)?(.*?)) (\\(.*?\\))?)$'
62 | captures:
63 | 1:
64 | name: '人物名和表情'
65 | 2:
66 | name: '人物名'
67 | patterns: [
68 | {
69 | match: '^(.*?)(?:\\|.*)?$'
70 | name: '$1'
71 | }
72 | ]
73 | 3:
74 | name: 'comment'
75 | 4:
76 | name: 'comment'
77 | 5:
78 | name: 'storage.inline'
79 | }
80 | {
81 | begin: '^(((?:([^|]*?)\\|)?(.*?)) (\\(.*?\\))?)(?=「)'
82 | beginCaptures:
83 | 1:
84 | name: '人物名和表情'
85 | 2:
86 | name: '人物名'
87 | patterns: [
88 | {
89 | match: '^(.*?)(?:\\|.*)?$'
90 | name: '$1'
91 | }
92 | ]
93 | 3:
94 | name: 'keyword'
95 | 4:
96 | name: 'entity.name.type'
97 | 5:
98 | name: 'storage.inline'
99 |
100 | contentName: '對話.string'
101 | patterns: [
102 | {
103 | match: '「'
104 | name: 'punctuation'
105 | }
106 | {
107 | begin: '(?=<)'
108 | end: '(?<=>)'
109 | patterns: [
110 | {
111 | include: 'text.html.basic'
112 | }
113 | ]
114 | }
115 | ]
116 |
117 | end: '」'
118 | endCaptures:
119 | 0:
120 | name: 'punctuation'
121 | }
122 |
123 | {
124 | match: '「.*?」'
125 | name: 'storage.liber'
126 | }
127 | ]
128 |
129 |
--------------------------------------------------------------------------------
/librian/librian本體/土特產/syntax_demo.liber:
--------------------------------------------------------------------------------
1 | #測試
2 |
3 | #一、不同參數與不同空格,全角引號
4 | 潘大爺「你好啊!」
5 | 潘大爺 「你好啊!」
6 | 潘大爺 「你好啊!」
7 | 潘大爺(笑)「你好啊!」
8 | 潘大爺 (笑)「你好啊!」
9 | 潘大爺 (笑)「你好啊!」
10 | 潘大爺[灰]「你好啊!」
11 | 潘大爺 [灰]「你好啊!」
12 | 潘大爺 [灰]「你好啊!」
13 | 潘大爺(笑)[灰]「你好啊!」
14 | 潘大爺 (笑)[灰]「你好啊!」
15 | 潘大爺 (笑)[灰]「你好啊!」
16 | 潘大爺(笑)[灰]「你好啊!」
17 | 潘大爺 (笑) [灰] 「你好啊!」
18 | 潘大爺 (笑) [灰] 「你好啊!」
19 | #二、將「一」換成雙引號
20 | 潘大爺"你好啊!"
21 | 潘大爺 "你好啊!"
22 | 潘大爺 "你好啊!"
23 | 潘大爺(笑)"你好啊!"
24 | 潘大爺 (笑)"你好啊!"
25 | 潘大爺 (笑)"你好啊!"
26 | 潘大爺[灰]"你好啊!"
27 | 潘大爺 [灰]"你好啊!"
28 | 潘大爺 [灰]"你好啊!"
29 | 潘大爺(笑)[灰]"你好啊!"
30 | 潘大爺 (笑)[灰]"你好啊!"
31 | 潘大爺 (笑)[灰]"你好啊!"
32 | 潘大爺(笑)[灰]"你好啊!"
33 | 潘大爺 (笑) [灰] "你好啊!"
34 | 潘大爺 (笑) [灰] "你好啊!"
35 | #三、在「一」的基礎上增加了別稱
36 | 潘大爺|牛逼人「你好啊!」
37 | 潘大爺|牛逼人 「你好啊!」
38 | 潘大爺|牛逼人 「你好啊!」
39 | 潘大爺|牛逼人(笑)「你好啊!」
40 | 潘大爺|牛逼人 (笑)「你好啊!」
41 | 潘大爺|牛逼人 (笑)「你好啊!」
42 | 潘大爺|牛逼人[灰]「你好啊!」
43 | 潘大爺|牛逼人 [灰]「你好啊!」
44 | 潘大爺|牛逼人 [灰]「你好啊!」
45 | 潘大爺|牛逼人(笑)[灰]「你好啊!」
46 | 潘大爺|牛逼人 (笑)[灰]「你好啊!」
47 | 潘大爺|牛逼人 (笑)[灰]「你好啊!」
48 | 潘大爺|牛逼人(笑)[灰]「你好啊!」
49 | 潘大爺|牛逼人 (笑) [灰] 「你好啊!」
50 | 潘大爺|牛逼人 (笑) [灰] 「你好啊!」
51 | #四、在「二」的基礎上增加了別稱
52 | 潘大爺|牛逼人"你好啊!"
53 | 潘大爺|牛逼人 "你好啊!"
54 | 潘大爺|牛逼人 "你好啊!"
55 | 潘大爺|牛逼人(笑)"你好啊!"
56 | 潘大爺|牛逼人 (笑)"你好啊!"
57 | 潘大爺|牛逼人 (笑)"你好啊!"
58 | 潘大爺|牛逼人[灰]"你好啊!"
59 | 潘大爺|牛逼人 [灰]"你好啊!"
60 | 潘大爺|牛逼人 [灰]"你好啊!"
61 | 潘大爺|牛逼人(笑)[灰]"你好啊!"
62 | 潘大爺|牛逼人 (笑)[灰]"你好啊!"
63 | 潘大爺|牛逼人 (笑)[灰]"你好啊!"
64 | 潘大爺|牛逼人(笑)[灰]"你好啊!"
65 | 潘大爺|牛逼人 (笑) [灰] "你好啊!"
66 | 潘大爺|牛逼人 (笑) [灰] "你好啊!"
67 | #五、將「一」替換為冒號表達式,半角冒號
68 | 潘大爺:你好啊!
69 | 潘大爺 :你好啊!
70 | 潘大爺 :你好啊!
71 | 潘大爺(笑):你好啊!
72 | 潘大爺 (笑):你好啊!
73 | 潘大爺 (笑):你好啊!
74 | 潘大爺[灰]:你好啊!
75 | 潘大爺 [灰]:你好啊!
76 | 潘大爺 [灰]:你好啊!
77 | 潘大爺(笑)[灰]:你好啊!
78 | 潘大爺 (笑)[灰]:你好啊!
79 | 潘大爺 (笑)[灰]:你好啊!
80 | 潘大爺(笑)[灰]:你好啊!
81 | 潘大爺 (笑) [灰] :你好啊!
82 | 潘大爺 (笑) [灰] :你好啊!
83 | #六、將「五」換成全角冒號
84 | 潘大爺:你好啊!
85 | 潘大爺 :你好啊!
86 | 潘大爺 :你好啊!
87 | 潘大爺(笑):你好啊!
88 | 潘大爺 (笑):你好啊!
89 | 潘大爺 (笑):你好啊!
90 | 潘大爺[灰]:你好啊!
91 | 潘大爺 [灰]:你好啊!
92 | 潘大爺 [灰]:你好啊!
93 | 潘大爺(笑)[灰]:你好啊!
94 | 潘大爺 (笑)[灰]:你好啊!
95 | 潘大爺 (笑)[灰]:你好啊!
96 | 潘大爺(笑)[灰]:你好啊!
97 | 潘大爺 (笑) [灰] :你好啊!
98 | 潘大爺 (笑) [灰] :你好啊!
99 | #七、在「五」的基礎上增加了別稱
100 | 潘大爺|牛逼人:你好啊!
101 | 潘大爺|牛逼人 :你好啊!
102 | 潘大爺|牛逼人 :你好啊!
103 | 潘大爺|牛逼人(笑):你好啊!
104 | 潘大爺|牛逼人 (笑):你好啊!
105 | 潘大爺|牛逼人 (笑):你好啊!
106 | 潘大爺|牛逼人[灰]:你好啊!
107 | 潘大爺|牛逼人 [灰]:你好啊!
108 | 潘大爺|牛逼人 [灰]:你好啊!
109 | 潘大爺|牛逼人(笑)[灰]:你好啊!
110 | 潘大爺|牛逼人 (笑)[灰]:你好啊!
111 | 潘大爺|牛逼人 (笑)[灰]:你好啊!
112 | 潘大爺|牛逼人(笑)[灰]:你好啊!
113 | 潘大爺|牛逼人 (笑) [灰] :你好啊!
114 | 潘大爺|牛逼人 (笑) [灰] :你好啊!
115 | #八、在「六」的基礎上增加了別稱
116 | 潘大爺|牛逼人:你好啊!
117 | 潘大爺|牛逼人 :你好啊!
118 | 潘大爺|牛逼人 :你好啊!
119 | 潘大爺|牛逼人(笑):你好啊!
120 | 潘大爺|牛逼人 (笑):你好啊!
121 | 潘大爺|牛逼人 (笑):你好啊!
122 | 潘大爺|牛逼人[灰]:你好啊!
123 | 潘大爺|牛逼人 [灰]:你好啊!
124 | 潘大爺|牛逼人 [灰]:你好啊!
125 | 潘大爺|牛逼人(笑)[灰]:你好啊!
126 | 潘大爺|牛逼人 (笑)[灰]:你好啊!
127 | 潘大爺|牛逼人 (笑)[灰]:你好啊!
128 | 潘大爺|牛逼人(笑)[灰]:你好啊!
129 | 潘大爺|牛逼人 (笑) [灰] :你好啊!
130 | 潘大爺|牛逼人 (笑) [灰] :你好啊!
131 | #九、在「一」的基礎上增加了換行
132 | 潘大爺「你好
133 | 啊!」
134 | 潘大爺 「你好
135 | 啊!」
136 | 潘大爺 「你好
137 | 啊!」
138 | 潘大爺(笑)「你好
139 | 啊!」
140 | 潘大爺 (笑)「你好
141 | 啊!」
142 | 潘大爺 (笑)「你好
143 | 啊!」
144 | 潘大爺[灰]「你好
145 | 啊!」
146 | 潘大爺 [灰]「你好
147 | 啊!」
148 | 潘大爺 [灰]「你好
149 | 啊!」
150 | 潘大爺(笑)[灰]「你好
151 | 啊!」
152 | 潘大爺 (笑)[灰]「你好
153 | 啊!」
154 | 潘大爺 (笑)[灰]「你好
155 | 啊!」
156 | 潘大爺(笑)[灰]「你好
157 | 啊!」
158 | 潘大爺 (笑) [灰] 「你好
159 | 啊!」
160 | 潘大爺 (笑) [灰] 「你好
161 | 啊!」
162 | #十、在「二·」的基礎上增加了換行
163 | 潘大爺"你好
164 | 啊!"
165 | 潘大爺 "你好
166 | 啊!"
167 | 潘大爺 "你好
168 | 啊!"
169 | 潘大爺(笑)"你好
170 | 啊!"
171 | 潘大爺 (笑)"你好
172 | 啊!"
173 | 潘大爺 (笑)"你好
174 | 啊!"
175 | 潘大爺[灰]"你好
176 | 啊!"
177 | 潘大爺 [灰]"你好
178 | 啊!"
179 | 潘大爺 [灰]"你好
180 | 啊!"
181 | 潘大爺(笑)[灰]"你好
182 | 啊!"
183 | 潘大爺 (笑)[灰]"你好
184 | 啊!"
185 | 潘大爺 (笑)[灰]"你好
186 | 啊!"
187 | 潘大爺(笑)[灰]"你好
188 | 啊!"
189 | 潘大爺 (笑) [灰] "你好
190 | 啊!"
191 | 潘大爺 (笑) [灰] "你好
192 | 啊!"
193 | #十一、在「三」的基礎上增加了換行
194 | 潘大爺|牛逼人「你好
195 | 啊!」
196 | 潘大爺|牛逼人 「你好
197 | 啊!」
198 | 潘大爺|牛逼人 「你好
199 | 啊!」
200 | 潘大爺|牛逼人(笑)「你好
201 | 啊!」
202 | 潘大爺|牛逼人 (笑)「你好
203 | 啊!」
204 | 潘大爺|牛逼人 (笑)「你好
205 | 啊!」
206 | 潘大爺|牛逼人[灰]「你好
207 | 啊!」
208 | 潘大爺|牛逼人 [灰]「你好
209 | 啊!」
210 | 潘大爺|牛逼人 [灰]「你好
211 | 啊!」
212 | 潘大爺|牛逼人(笑)[灰]「你好
213 | 啊!」
214 | 潘大爺|牛逼人 (笑)[灰]「你好
215 | 啊!」
216 | 潘大爺|牛逼人 (笑)[灰]「你好
217 | 啊!」
218 | 潘大爺|牛逼人(笑)[灰]「你好
219 | 啊!」
220 | 潘大爺|牛逼人 (笑) [灰] 「你好
221 | 啊!」
222 | 潘大爺|牛逼人 (笑) [灰] 「你好
223 | 啊!」
224 | #十二、在「四」的基礎上增加了換行
225 | 潘大爺|牛逼人"你好
226 | 啊!"
227 | 潘大爺|牛逼人 "你好
228 | 啊!"
229 | 潘大爺|牛逼人 "你好
230 | 啊!"
231 | 潘大爺|牛逼人(笑)"你好
232 | 啊!"
233 | 潘大爺|牛逼人 (笑)"你好
234 | 啊!"
235 | 潘大爺|牛逼人 (笑)"你好
236 | 啊!"
237 | 潘大爺|牛逼人[灰]"你好
238 | 啊!"
239 | 潘大爺|牛逼人 [灰]"你好
240 | 啊!"
241 | 潘大爺|牛逼人 [灰]"你好
242 | 啊!"
243 | 潘大爺|牛逼人(笑)[灰]"你好
244 | 啊!"
245 | 潘大爺|牛逼人 (笑)[灰]"你好
246 | 啊!"
247 | 潘大爺|牛逼人 (笑)[灰]"你好
248 | 啊!"
249 | 潘大爺|牛逼人(笑)[灰]"你好
250 | 啊!"
251 | 潘大爺|牛逼人 (笑) [灰] "你好
252 | 啊!"
253 | 潘大爺|牛逼人 (笑) [灰] "你好
254 | 啊!"
255 | #十三、無對話
256 | 潘大爺(笑)
257 | 潘大爺 (笑)
258 | 潘大爺 (笑)
259 | 潘大爺(笑)[灰]
260 | 潘大爺 (笑)[灰]
261 | 潘大爺 (笑)[灰]
262 | 潘大爺(笑)[灰]
263 | 潘大爺 (笑) [灰]
264 | 潘大爺 (笑) [灰]
265 | #十四、在「十三」的基礎上添加了別稱,半角豎線
266 | 潘大爺|牛逼人(笑)
267 | 潘大爺|牛逼人 (笑)
268 | 潘大爺|牛逼人 (笑)
269 | 潘大爺|牛逼人(笑)[灰]
270 | 潘大爺|牛逼人 (笑)[灰]
271 | 潘大爺|牛逼人 (笑)[灰]
272 | 潘大爺|牛逼人(笑)[灰]
273 | 潘大爺|牛逼人 (笑) [灰]
274 | 潘大爺|牛逼人 (笑) [灰]
275 | #十五、將「十四」換成全角豎線
276 | 潘大爺|牛逼人(笑)
277 | 潘大爺|牛逼人 (笑)
278 | 潘大爺|牛逼人 (笑)
279 | 潘大爺|牛逼人(笑)[灰]
280 | 潘大爺|牛逼人 (笑)[灰]
281 | 潘大爺|牛逼人 (笑)[灰]
282 | 潘大爺|牛逼人(笑)[灰]
283 | 潘大爺|牛逼人 (笑) [灰]
284 | 潘大爺|牛逼人 (笑) [灰]
285 | #十六、將「十四」換成表情符號「馬」
286 | 潘大爺🐴牛逼人(笑)
287 | 潘大爺🐴牛逼人 (笑)
288 | 潘大爺🐴牛逼人 (笑)
289 | 潘大爺🐴牛逼人(笑)[灰]
290 | 潘大爺🐴牛逼人 (笑)[灰]
291 | 潘大爺🐴牛逼人 (笑)[灰]
292 | 潘大爺🐴牛逼人(笑)[灰]
293 | 潘大爺🐴牛逼人 (笑) [灰]
294 | 潘大爺🐴牛逼人 (笑) [灰]
295 |
296 | #十七、py代碼塊
297 | ```py
298 | def isPrime(n) :
299 | if (n <= 1) :
300 | return False
301 | if (n <= 3) :
302 | return True
303 | if (n % 2 == 0 or n % 3 == 0) :
304 | return False
305 | i = 5
306 | while(i * i <= n) :
307 | if (n % i == 0 or n % (i + 2) == 0) :
308 | return False
309 | i = i + 6
310 | return True
311 | ```
312 | #十八、python代碼塊
313 | ```python
314 | def is_prime(n) :
315 | if n <= 1 :
316 | return False
317 | if n <= 3 :
318 | return True
319 | if n%2 == 0 or n%3 == 0:
320 | return False
321 | i = 5
322 | while i*i <= n :
323 | if n%i == 0 or n % (i+2) == 0:
324 | return False
325 | i = i + 6
326 | return True
327 | ```
328 | #十九、js代碼塊
329 | ```js
330 | function isPrime(n) {
331 | if (n <= 1) return false;
332 | if (n <= 3) return true;
333 | if (n%2 == 0 || n%3 == 0) return false;
334 | var i = 5;
335 | while (i*i <= n) {
336 | if (n%i == 0 || n % (i+2) == 0) {
337 | return false;
338 | }
339 | i = i + 6;
340 | }
341 | return true;
342 | }
343 | ```
344 | #二十、javascript代碼塊
345 | ```javascript
346 | function isPrime(n) {
347 | if (n <= 1) return false;
348 | if (n <= 3) return true;
349 | if (n%2 == 0 || n%3 == 0) return false;
350 | var i = 5;
351 | while (i*i <= n) {
352 | if (n%i == 0 || n % (i+2) == 0) {
353 | return false;
354 | }
355 | i = i + 6;
356 | }
357 | return true;
358 | }
359 | ```
360 | #二十一、html代碼塊
361 | ```html
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 | ```
372 | #二十二、HTML代碼塊
373 | ```HTML
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 | ```
384 |
385 | #二十三、劇本命令
386 | > BG 魔王城內
387 | > 背景 染紅的街道.png
388 | > BG 潘大爺神殿 1.5 "50% 50%"
389 |
390 | > BGM 愉快的音樂.mp3
391 | > 背景音樂 不愉快的音樂 0.5
392 | > BGM None
393 |
394 | > SE 跳的聲音.mp3
395 |
396 | > CG 極夜大戰
397 | > CG None
398 |
399 | > EF bg 灰
400 |
401 | > VIDEO OP.webm
402 | > 視頻 ED.mp4 True
403 | #二十四、外部語言函數調用與多余空格
404 | > BG('家裏.png')
405 | > BGM('打架的聲音.mp3')
406 |
407 | > BG 河上.png
408 | >BG 河上.png
409 |
410 | > BG "教室 夜.png"
411 |
412 | #二十五、插入圖片
413 | ===第一章
414 | === 第一章
415 | === 第一章
416 | ======第一章
417 | ====== 第一章
418 | ====== 第一章
419 | =========第一章
420 | ========= 第一章
421 | ========= 第一章
422 |
423 | #二十六、鏡頭變換
424 | +{潘大爺: [100, 120, 1.5]}
425 | + {潘大爺: [100, 120, 1.5]}
426 | + {潘大爺: [100, 120, 1.5]}
427 | +{舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]}
428 | + {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]}
429 | + {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]}
430 | +[舟舟, 潘大爺]
431 | + [舟舟, 潘大爺]
432 | + [舟舟, 潘大爺]
433 | -{潘大爺: [100, 120, 1.5]}
434 | - {潘大爺: [100, 120, 1.5]}
435 | - {潘大爺: [100, 120, 1.5]}
436 | -{舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]}
437 | - {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]}
438 | - {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]}
439 | -[舟舟, 潘大爺]
440 | - [舟舟, 潘大爺]
441 | - [舟舟, 潘大爺]
442 |
443 | #二十七、快速跳轉
444 | ?接受治療->壞結局.liber
445 | ? 接受治療 -> 壞結局.liber
446 | ? 接受治療 -> 壞結局.liber
447 | ?接受治療->壞結局.liber, 這里
448 | ? 接受治療 -> 壞結局.liber, 這里
449 | ? 接受治療 -> 壞結局.liber, 這里
450 |
451 | #二十八、人物操作
452 | @潘大爺+西裝
453 | @ 潘大爺 + 西裝
454 | @ 潘大爺 + 西裝
455 | @潘大爺-西裝
456 | @ 潘大爺 - 西裝
457 | @ 潘大爺 - 西裝
458 |
459 | #二十九、躍點
460 | *這里
461 | * 這里
462 | * 這里
463 |
464 | #三十、旁白
465 | 這是旁白
466 | :這個也是旁白「雖然有引號」
467 | :這個也是旁白"雖然有引號"
468 | :這個也是旁白:雖然有冒號
469 | :這個也是旁白 「雖然有引號」
470 | :這個也是旁白 "雖然有引號"
471 | :這個也是旁白 :雖然有冒號
472 | :這個也是旁白 「雖然有引號」
473 | :這個也是旁白 "雖然有引號"
474 | :這個也是旁白 :雖然有冒號
475 |
476 |
477 | #反面教材
478 |
479 | #缺少參數
480 | 潘大爺[灰]
481 | 潘大爺 [灰]
482 | 潘大爺 [灰]
483 | 潘大爺|牛逼人[灰]
484 | 潘大爺|牛逼人 [灰]
485 | 潘大爺|牛逼人 [灰]
486 | #參數順序錯誤
487 | 潘大爺[灰](笑)「你好啊!」
488 | 潘大爺 [灰](笑)
489 | 潘大爺 [灰](笑)「你好啊!」
490 | 潘大爺|牛逼人[灰](笑)
491 | 潘大爺|牛逼人 [灰](笑)「你好啊!」
492 | 潘大爺|牛逼人 [灰](笑)
493 | #多余參數
494 | 潘大爺(笑)[灰][灰]「你好啊!」
495 | 潘大爺 (笑)[灰][灰]
496 | 潘大爺 (笑)[灰][灰]「你好啊!」
497 | 潘大爺|牛逼人(笑)(笑)[灰]
498 | 潘大爺|牛逼人 (笑)(笑)[灰]「你好啊!」
499 | 潘大爺|牛逼人 (笑)(笑)[灰]
500 | #多余空格
501 | 潘大爺| 牛逼人"你好啊!"
502 | 潘大爺| 牛逼人 (笑) "你好啊!"
503 | 潘大爺| [灰] "你好啊!"
504 | 潘大爺| (笑) [灰] "你好啊!"
505 | #括號錯誤
506 | 潘大爺|牛逼人)"你好啊!"
507 | 潘大爺|牛逼人]"你好啊!"
508 | 潘大爺|牛逼人)]"你好啊!"
509 |
--------------------------------------------------------------------------------
/librian/librian本體/土特產/導出pdf用/紙樣式.css:
--------------------------------------------------------------------------------
1 | html {
2 | font-size: 18px;
3 | font-family: 方正标雅宋_GBK;
4 | }
5 |
6 | small {
7 | font-size: 85%;
8 | }
9 |
10 | @page {
11 | size: A4;
12 | margin: 1.5cm;
13 | margin-bottom: 2cm;
14 | background: url('./紙背景花紋印刷.webp');
15 | background-size: 125%;
16 | background-position: 50% 50%;
17 | counter-increment: page;
18 |
19 | @bottom-center {
20 | color: rgba(0, 0, 0, 0.5);
21 | content: '—— 'counter(page) ' ——';
22 | padding-bottom: 1cm;
23 | }
24 | }
25 |
26 | p.旁白:before {
27 | content: ' ';
28 | }
29 |
30 | p>* {
31 | vertical-align: top;
32 | }
33 |
34 | .旁白 {
35 | color: #000;
36 | }
37 |
38 | .語 {
39 | color: rgba(0, 0, 80, 1);
40 | white-space: pre;
41 | display: inline-block;
42 | padding-left: 6px;
43 | margin-left: 6px;
44 | border-left: 3px solid rgba(0, 0, 0, 0.4);
45 | }
46 |
47 | .躍點 {
48 | font-size: 80%;
49 | color: rgba(0, 0, 111, 0.5);
50 | }
51 |
52 | .顏 {
53 | color: rgba(0, 0, 0, 0.5);
54 | padding-left: 6px;
55 | }
56 |
57 | .註釋 {
58 | font-size: 80%;
59 | color: rgba(0, 0, 0, 0.5);
60 | }
61 |
62 | .人物操作 {
63 | font-size: 80%;
64 | color: rgba(0, 0, 0, 0.5);
65 | }
66 |
67 | .函數調用 {
68 | font-size: 80%;
69 | width: 80%;
70 | padding: 0.6rem 1rem;
71 | border-radius: 2px;
72 | background-color: rgba(0, 0, 0, 0.1);
73 | display: inline-block;
74 | white-space: pre;
75 | }
76 |
77 | .引用 {
78 | font-size: 95%;
79 | color: #030;
80 | }
81 |
82 | .標點 {
83 | color: #300;
84 | }
85 |
86 | .代, .插入 {
87 | background: url('./紙背景插入.webp');
88 | background-size: cover;
89 | background-position: fixed;
90 | border: 1px solid rgba(0, 0, 0, 0.4);
91 | border-radius: 2px;
92 | font-family: 方正中雅宋_GBK;
93 | padding: 4px;
94 | }
95 |
96 | .插入 {
97 | text-align: center;
98 | font-size: 120%;
99 | }
100 |
--------------------------------------------------------------------------------
/librian/librian本體/土特產/導出pdf用/紙背景插入.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/土特產/導出pdf用/紙背景插入.webp
--------------------------------------------------------------------------------
/librian/librian本體/土特產/導出pdf用/紙背景花紋印刷.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/土特產/導出pdf用/紙背景花紋印刷.webp
--------------------------------------------------------------------------------
/librian/librian本體/導出文件.py:
--------------------------------------------------------------------------------
1 | import os
2 | import re
3 | import logging
4 | import argparse
5 |
6 | import opencc
7 |
8 | from Librian虛擬機 import 讀者
9 | from Librian虛擬機 import 角色
10 |
11 | cc = opencc.OpenCC('t2s')
12 |
13 | 此處 = os.path.dirname(os.path.abspath(__file__))
14 |
15 |
16 | class 虛狀態:
17 | def __init__(self):
18 | self.額外信息 = ()
19 | self.內容 = {}
20 |
21 | def 導出(self):
22 | return {'內容': self.內容, '額外信息': self.額外信息}
23 |
24 |
25 | class 虛讀者(讀者.讀者):
26 | def __init__(self, 初始劇本, 簡化字=False):
27 | super().__init__(初始劇本)
28 | self.簡化字 = 簡化字
29 |
30 | def 步進(self):
31 | self.狀態 = 虛狀態()
32 | s = self.下一句()
33 | 類型 = s['類型']
34 | if 類型 == '終焉':
35 | self.狀態.額外信息 = ('終焉',)
36 | if 類型 in ('註釋', '躍點'):
37 | self.狀態.內容 = f'{s[類型]} \n'
38 | if 類型 == '函數調用':
39 | self.狀態.內容 = f'{s["原文"]} \n'
40 | if 類型 == '插入圖':
41 | self.狀態.內容 = f'{s["插入圖"]}
'
42 | if 類型 == '旁白':
43 | 旁白 = self.打標點(self.化(s["旁白"]))
44 | self.狀態.內容 = f'{旁白}
\n'
45 | if 類型 == '人物操作':
46 | 人物名 = s['人物名']
47 | 目標 = s['目標']
48 | if s['操作符'] == '+':
49 | self.狀態.內容 = f'{self.化(人物名)} + {self.化(目標)}
\n'
50 | if s['操作符'] == '|':
51 | 角色.取角色(人物名).顯示名字 = s['目標']
52 | self.狀態.內容 = ''
53 | if 類型 in ('人物對話', '人物表情'):
54 | 替代顯示名字 = 角色.取角色(s['名']).顯示名字
55 | 名字 = s['代'] or 替代顯示名字 or s['名']
56 | self.狀態.內容 = f'{self.化(名字)} '
57 | if s['顏']:
58 | self.狀態.內容 += f'{s["顏"]} '
59 | if 類型 == '人物對話':
60 | self.狀態.內容 += f'{self.化(s["語"])} '
61 | self.狀態.內容 += f'
'
62 |
63 | if '之後的空白' in s:
64 | self.狀態.內容 += ' \n' * s['之後的空白']
65 |
66 | def 化(self, s):
67 | if self.簡化字:
68 | return cc.convert(s)
69 | return s
70 |
71 | def 打標點(self, 句):
72 | 句 = re.sub('([,。?!…——])', '\\1 ', 句)
73 | 句 = re.sub('(「.*?」)', '\\1 ', 句)
74 | return 句
75 |
76 | def 導出html(self, 帶css=False):
77 | head = f' \n'
78 | if 帶css:
79 | for css in 參數.css:
80 | head += f' \n'
81 |
82 | return head + self.body內容()
83 |
84 | def body內容(self):
85 | t = list(self.迭代器())
86 | return '\n'.join([i['內容'] for i in t])
87 |
88 |
89 | if __name__ == '__main__':
90 | 參數 = argparse.ArgumentParser(description='劇本文件生成pdf')
91 | 參數.add_argument('--play', type=str, required=True)
92 | 參數.add_argument('--css', type=str, action='append')
93 | 參數.add_argument('--out', type=str)
94 | 參數.add_argument('--chs', action='store_true')
95 | 參數.add_argument('--html', action='store_true')
96 | 參數 = 參數.parse_args()
97 |
98 | if not 參數.css:
99 | 參數.css = [os.path.join(此處, './資源/導出pdf用/紙樣式.css')]
100 |
101 | 讀 = 虛讀者(參數.play, 參數.chs)
102 | if 參數.html:
103 | with open(參數.out, 'w', encoding='utf8') as f2:
104 | f2.write(讀.導出html(帶css=True))
105 | else:
106 | from weasyprint import HTML, CSS
107 | HTML(string=讀.導出html()).write_pdf(參數.out, stylesheets=參數.css)
108 |
--------------------------------------------------------------------------------
/librian/librian本體/山彥.py:
--------------------------------------------------------------------------------
1 | import os
2 | import json
3 | import time
4 | import pickle
5 | import logging
6 | import datetime
7 |
8 | import yaml
9 | from rimo_utils import good_open
10 | from rimo_utils.cef_tools.vue_ob import vue_ob
11 |
12 | from librian.librian_util import 文件, 加載器, 路徑
13 |
14 | from .librian虛擬機 import 讀者
15 | from .librian虛擬機 import 虛擬機環境
16 |
17 | from .環境 import 配置
18 |
19 |
20 | def 綁定(app, 標題url):
21 | 讀者實例 = 讀者.讀者(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}')
22 | app.frame.set_browser_object("山彥", 極山彥(app.frame, app.frame.browser, 讀者實例, 標題url))
23 |
24 |
25 | class 山彥(vue_ob):
26 | def __init__(self, 窗口, 瀏覽器, 讀者, 標題url):
27 | super().__init__()
28 | self.窗口 = 窗口
29 | self.瀏覽器 = 瀏覽器
30 | self.讀者 = 讀者
31 | self.標題url = 標題url
32 |
33 | def js(self, x):
34 | self.瀏覽器.ExecuteJavascript(x)
35 |
36 | def 取檔(self, callback):
37 | 檔表 = os.listdir(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔')
38 | 檔表 = sorted(檔表, reverse=True)
39 | 檔信息表 = []
40 | for i in 檔表:
41 | try:
42 | with open(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔/{i}', 'rb') as f:
43 | 存檔信息 = pickle.load(f)['存檔信息']
44 | 檔信息表.append({
45 | '名字': i,
46 | '描述': 存檔信息['描述'],
47 | '截圖': 存檔信息['截圖'],
48 | '時間': datetime.datetime.fromtimestamp(存檔信息['存檔時間']).strftime('%Y-%m-%d %H:%M'),
49 | })
50 | except Exception as e:
51 | logging.exception(e)
52 | logging.warning(f'存檔「{i}」有問題。')
53 | callback.Call(檔信息表)
54 |
55 | def 存檔(self, 文件名, 描述, 截圖):
56 | 存檔信息 = {
57 | '描述': 描述,
58 | '截圖': 截圖,
59 | '存檔時間': time.time(),
60 | }
61 | self.讀者.存檔(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔/{文件名}', 存檔信息)
62 |
63 | def 讀檔(self, 文件名):
64 | self.讀者.讀檔(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔/{文件名}')
65 | self.更新(瞬間化=True)
66 |
67 | def 快速存檔(self):
68 | self.讀者.存檔(f'{虛擬機環境.工程路徑}/存檔資料/快速存檔.pkl')
69 | self.js('_py演出.提示("存檔好了。")')
70 |
71 | def 快速讀檔(self):
72 | self.讀者.讀檔(f'{虛擬機環境.工程路徑}/存檔資料/快速存檔.pkl')
73 | self.更新(瞬間化=True)
74 |
75 | def 切換全屏(self):
76 | self.窗口.toggleFullScreen()
77 |
78 | def 退出(self):
79 | exit()
80 |
81 | def vue更新(self, 內容):
82 | t = self.vue.用戶設置 if '用戶設置' in self.vue._內容 else None
83 | if t != 內容['用戶設置']:
84 | with open(f'{虛擬機環境.工程路徑}/存檔資料/用戶設置.yaml', 'w', encoding='utf8') as f:
85 | f.write(yaml.dump(內容['用戶設置']))
86 | super().vue更新(內容)
87 |
88 |
89 | class 演出山彥(山彥):
90 | def 回標題(self):
91 | self.讀者.__init__(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}')
92 | self.js(f'window.location.href={self.標題url.__repr__()}')
93 |
94 | def 步進(self):
95 | if 配置['編寫模式']:
96 | return
97 | self.讀者.步進()
98 |
99 | def 更新(self, 瞬間化=False):
100 | 狀態 = self.讀者.狀態.導出()
101 | self.js(f'_py演出.改變演出狀態({json.dumps(狀態)},{json.dumps(瞬間化)})')
102 |
103 | def 狀態回調(self, 步進, callback):
104 | if 步進:
105 | self.步進()
106 | 狀態 = self.讀者.狀態.導出()
107 | callback.Call(狀態)
108 |
109 | def 初始化(self, callback):
110 | self.vue.圖片文件夾 = 虛擬機環境.工程路徑 / 虛擬機環境.圖片文件夾
111 | self.vue.音樂文件夾 = 虛擬機環境.工程路徑 / 虛擬機環境.音樂文件夾
112 | self.vue.視頻文件夾 = 虛擬機環境.工程路徑 / 虛擬機環境.視頻文件夾
113 | self.vue.psd立繪路徑 = 虛擬機環境.psd立繪路徑
114 | self.vue.自定css = [虛擬機環境.工程路徑 / i for i in 虛擬機環境.自定css]
115 | self.vue.主題css = os.path.join('主題', 虛擬機環境.主題css + '.css').replace('\\', '/')
116 | self.vue.解析度 = 虛擬機環境.主解析度
117 | self.vue.邊界 = 配置['顯示繪圖邊界']
118 | self.vue.翻譯 = 虛擬機環境.翻譯
119 |
120 | 用戶設置 = 加載器.yaml(f'{虛擬機環境.工程路徑}/存檔資料/用戶設置.yaml')
121 | if 用戶設置:
122 | self.vue.用戶設置 = 用戶設置
123 | callback.Call()
124 |
125 | def 選(self, 參數):
126 | t = self.讀者.狀態.選項[參數][1]
127 | self.讀者.狀態.選項 = []
128 | t()
129 | logging.debug(f'選擇了「{參數}」。')
130 | self.讀者.步進()
131 | self.更新()
132 |
133 |
134 | class 帶標題山彥(演出山彥):
135 | def 開始(self):
136 | self.步進()
137 | self.js(f'window.location.href={文件.轉爲網址路徑(路徑.librian本體 / "前端/adv.html").__repr__()};')
138 |
139 | def 讀檔畫面(self):
140 | self.js(f'window.location.href={(文件.轉爲網址路徑(路徑.librian本體 / "./前端/adv.html")+"?入口=讀檔").__repr__()};')
141 |
142 | def 從劇本開始(self, 劇本):
143 | 入口 = f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}'
144 | self.讀者.__init__(f'{os.path.dirname(入口)}/{劇本}')
145 | self.開始()
146 |
147 |
148 | class 極山彥(帶標題山彥):
149 | def __init__(self, *li, **d):
150 | super().__init__(*li, **d)
151 | if 配置['編寫模式']:
152 | import threading
153 |
154 | def 監視():
155 | 原字 = ''
156 | while True:
157 | with good_open(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}') as f:
158 | 字 = f.read()
159 | if 字 != 原字:
160 | self.更新終態()
161 | 原字 = 字
162 | t = threading.Thread(target=監視)
163 | t.setDaemon(True)
164 | t.start()
165 |
166 | def 更新終態(self):
167 | self.讀者.從一而終(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}')
168 | self.更新()
169 |
170 | def 初始化(self, *li, **d):
171 | super().初始化(*li, **d)
172 | if 配置['編寫模式']:
173 | self.更新終態()
174 |
--------------------------------------------------------------------------------
/librian/librian本體/幻象.py:
--------------------------------------------------------------------------------
1 | import os
2 | import json
3 | import shutil
4 | from pathlib import Path
5 |
6 | from .環境 import 配置
7 |
8 | from librian.librian_util import 路徑
9 |
10 | from .librian虛擬機 import 虛擬機環境
11 | from .librian虛擬機 import 讀者
12 |
13 |
14 |
15 | def 演出固化(劇本文件):
16 | 讀者實例 = 讀者.讀者(劇本文件)
17 | 演出步 = list(讀者實例.迭代器())
18 | return 演出步
19 |
20 |
21 | def 生成虛擬核心():
22 | 圖片文件夾 = 路徑.虛擬相對前端路徑(虛擬機環境.圖片文件夾)
23 | 音樂文件夾 = 路徑.虛擬相對前端路徑(虛擬機環境.音樂文件夾)
24 | 視頻文件夾 = 路徑.虛擬相對前端路徑(虛擬機環境.視頻文件夾)
25 | psd立繪路徑 = 路徑.虛擬相對前端路徑(os.path.relpath(虛擬機環境.psd立繪路徑, start=虛擬機環境.工程路徑))
26 | 自定css = [路徑.虛擬相對前端路徑(i) for i in 虛擬機環境.自定css]
27 | 主題css = os.path.join('主題', 虛擬機環境.主題css + '.css').replace('\\', '/')
28 |
29 | 演出步 = 演出固化(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}')
30 |
31 | 虛擬核心 = {
32 | '作品名': 虛擬機環境.標題,
33 | '解析度': 虛擬機環境.主解析度,
34 | '邊界': int(配置["顯示繪圖邊界"]),
35 | '圖片文件夾': 圖片文件夾,
36 | '音樂文件夾': 音樂文件夾,
37 | '視頻文件夾': 視頻文件夾,
38 | 'psd立繪路徑': psd立繪路徑,
39 | '自定css': 自定css,
40 | '主題css': 主題css,
41 | '演出步': 演出步
42 | }
43 | json數據 = json.dumps(虛擬核心, indent=2, ensure_ascii=False)
44 | return f'window.虛擬核心 = {json數據}'
45 |
46 |
47 | def 幻象化(目標路徑):
48 | 目標路徑 = Path(目標路徑)
49 | 依賴 = [
50 | '黑科技',
51 | 'librian/librian本體/前端/dist',
52 | 'librian/librian本體/前端/素材',
53 | 'librian/librian本體/前端/主題',
54 | 'librian/librian本體/前端/adv.html',
55 | 虛擬機環境.工程路徑.relative_to(路徑.librian外層),
56 | ]
57 | for i in 依賴:
58 | 源路徑 = 路徑.librian外層 / i
59 | if 源路徑.is_dir():
60 | shutil.copytree(源路徑, 目標路徑 / i)
61 | elif 源路徑.is_file():
62 | shutil.copy(源路徑, 目標路徑 / i)
63 | else:
64 | raise Exception('哈?')
65 |
66 | with open(目標路徑 / 'librian/librian本體/前端/虛擬核心.js', 'w', encoding='utf-8') as f:
67 | f.write(生成虛擬核心())
68 |
69 | with open(目標路徑 / '說明.txt', 'w', encoding='utf-8') as f:
70 | f.write('因爲它有一些奇怪的操作所以不能直接拉進瀏覽器運行。\n你需要自建服務器,一個可行的方法是安裝http-server,在這個路徑啓動。然後「http://localhost:8080/librian/librian本體/前端/adv.html」。')
71 |
--------------------------------------------------------------------------------
/librian/librian本體/環境.py:
--------------------------------------------------------------------------------
1 | import os
2 | import logging
3 |
4 | import yaml
5 | yaml.warnings({'YAMLLoadWarning': False})
6 |
7 |
8 | def 導入全局配置(a):
9 | 配置.update(a)
10 | logging.debug(配置)
11 |
12 |
13 | with open(os.path.split(os.path.realpath(__file__))[0] + '/配置.yaml', encoding='utf8') as f:
14 | 配置 = yaml.load(f)
15 | logging_config = {
16 | 'format': '【%(filename)s - %(lineno)s】(%(levelname)s): %(message)s',
17 | }
18 | if 配置['額外信息']:
19 | logging_config['level'] = logging.INFO
20 | logging.basicConfig(**logging_config)
21 |
--------------------------------------------------------------------------------
/librian/librian本體/窗口.py:
--------------------------------------------------------------------------------
1 | import logging
2 |
3 | from librian.librian_util import 文件
4 | try:
5 | from rimo_utils.cef_tools import wxcef
6 | except ModuleNotFoundError:
7 | logging.warning('沒能import wx,改爲使用pyside2。')
8 | from rimo_utils.cef_tools import qtcef as wxcef
9 |
10 | from librian.librian_util import 路徑
11 |
12 | from . import 山彥
13 | from .環境 import 配置
14 |
15 | from .librian虛擬機 import 虛擬機環境
16 |
17 |
18 |
19 | def 啓動app():
20 | if 配置['編寫模式']:
21 | url = 路徑.librian本體 / '前端/adv.html'
22 | elif 虛擬機環境.標題畫面:
23 | url = f'{虛擬機環境.工程路徑}/{虛擬機環境.標題畫面}'
24 | else:
25 | url = 路徑.librian本體 / '前端/默認標題畫面/標題.html'
26 |
27 | 標題url = 文件.轉爲網址路徑(url)
28 |
29 | if 虛擬機環境.圖標:
30 | 圖標 = f'{虛擬機環境.工程路徑}/{虛擬機環境.圖標}'
31 | else:
32 | 圖標 = 路徑.librian本體 / '資源/librian.ico'
33 |
34 | app, 瀏覽器 = wxcef.group(
35 | title=虛擬機環境.標題,
36 | url=標題url,
37 | icon=圖標,
38 | size=虛擬機環境.主解析度
39 | )
40 | 山彥.綁定(app, 標題url=標題url)
41 |
42 | return app
43 |
--------------------------------------------------------------------------------
/librian/librian本體/資源/Librian小.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/資源/Librian小.png
--------------------------------------------------------------------------------
/librian/librian本體/資源/librian.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/資源/librian.ico
--------------------------------------------------------------------------------
/librian/librian本體/配置.yaml:
--------------------------------------------------------------------------------
1 | # 顯示log級別的信息
2 | 額外信息: False
3 |
4 | # 在html界面上顯示div的界線
5 | 顯示繪圖邊界: False
6 |
7 | # 對於嚴重錯誤在except中停止程序
8 | 嚴格模式: True
9 |
10 | # 編寫的同時顯示
11 | 編寫模式: False
12 |
13 | # 編寫模式從特定劇本進入
14 | 編寫模式起點: []
--------------------------------------------------------------------------------
/librian/librian閱讀器/配置.json:
--------------------------------------------------------------------------------
1 | {
2 | "文件列表": [
3 | {"名字": "測試用", "文件": "劇本/入口.json"}
4 | ],
5 | "自定css": [],
6 | "簡化字": true
7 | }
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Librian: 簡明強大的 Galgame | Visual Novel 引擎
2 |
3 | [](https://github.com/RimoChan/Librian/stargazers)
4 | [](https://en.wikipedia.org/wiki/Microsoft_Windows)
5 | [](https://github.com/RimoChan/Librian/releases)
6 | [](https://www.codacy.com/manual/s60481235/Librian?utm_source=github.com&utm_medium=referral&utm_content=RimoChan/Librian&utm_campaign=Badge_Grade)
7 | [](https://github.com/RimoChan/Librian/blob/master/LICENSE)
8 | 
9 |
10 | ——來像 Markdown 一樣寫 Galgame 劇本吧!
11 |
12 | Librian 是容易上手的 Galgame 引擎,Librian 由 Python 和 JavaScript 編寫而成,基於 CEFPython 前端。
13 |
14 | Librian 適用於快速高效的 ADV 實現,能將你的奇思妙想迅速轉換爲成果——你只需提供素材文件和简单的劇本就能做出 Galgame!
15 |
16 | Librian 是面向劇本的引擎,賣點是:
17 |
18 | - 輕快便捷的原型開發。
19 | - 用戶友好。
20 | - 高度可擴展性。
21 |
22 | ## 一分鐘的演示視頻
23 |
24 | [](https://librian.net/視頻/轉.webm)
25 |
26 | ## 劇本格式
27 |
28 | ```liber
29 | > BG 中庭.jpg
30 | + [舟舟, 潘大爺]
31 | 中庭。潘大爺在散步。
32 | 舟舟 (微笑)「啊!校長!終於找到你了!」
33 | 潘大爺 「舟舟!來得正是時候!」
34 | 潘大爺 (微笑)「來看看我新發明的催眠調教裝置!」
35 | 舟舟 (驚)「真有這種發明!?」
36 | ```
37 |
38 | 不需要任何其他標記或代碼,一小段劇本就完成了。
39 |
40 | 準備好立繪和背景後,運行 Librian 主程序並啓動工程——演出是這樣的效果。
41 | 
42 |
43 | ## 中文文檔
44 |
45 | 如果你想瞭解詳細的使用方法,可以直接閱讀 Librian 的中文文檔——[https://doc.librian.net](https://doc.librian.net/site/主頁.html)。
46 |
47 | 你可以輕鬆定製你的遊戲,包括特效、畫面樣式、甚至聯網,快來探索吧!
48 |
49 | ## 快速上手
50 |
51 | + 直接下載打包的 [release 版本](https://github.com/RimoChan/Librian/releases) (推薦) 。
52 | - release 版本也附帶了 [librian 面板](https://github.com/RimoChan/Librian)。
53 |
54 | + 或者使用 `pip install librian` 來安裝 librian。
55 | - 這需要本地 Python 爲 3.6 或 3.7 版本
56 | - 它不太穩定,所以最好先更新一下 pip 和 setuptools,要是裝不上我也沒辦法……
57 |
58 | ## Liber 分析器
59 |
60 | Liber 分析器是 Librian 用來分析劇本語言 Liber 的工具。
61 | 如果你想要開發自己的 Galgame 引擎或者做一些很酷的事情,它會有所助益。
62 |
63 | 它的倉庫在
64 |
65 | 你可以直接用 `pip install liber` 來安裝它。
66 |
67 | ## 贊助
68 |
69 | 如果你覺得 Librian 對你的工作或學習有幫助,歡迎給作者介紹一些可愛的女朋友。
70 |
71 | 最好是蘿莉,要那種會坐在腿上蹭蹭,喊「歐尼醬」的。
72 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | liber>=1.0.1
2 | rimo_utils>=1.4.1
3 | cefpython3>=66.0
4 | wxPython>=4.0.4
5 | cloudpickle>=1.2.2
6 | opencc>=1.1.1
7 | PyYAML>=5.2
8 | fire>=0.2.1
9 | dulwich>=0.19.14
10 | requests>=2.24.0
11 | libsass>=0.20.0
12 | AppKit>=0.2.8 ; sys_platform == 'darwin'
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | import setuptools
2 |
3 | import librian
4 |
5 |
6 | setuptools.setup(
7 | name='librian',
8 | version=librian.__version__,
9 | author='RimoChan',
10 | author_email='the@librian.net',
11 | description='librian',
12 | long_description=open('readme.md', encoding='utf8').read(),
13 | long_description_content_type='text/markdown',
14 | url='https://github.com/RimoChan/librian',
15 | packages=[
16 | 'librian',
17 | 'librian.librian_util',
18 | 'librian.librian本體',
19 | 'librian.librian本體.librian虛擬機',
20 | ],
21 | package_data={
22 | 'librian.librian本體': [
23 | '前端/*', '前端/dist/*', '前端/默認標題畫面/*', '前端/黑科技/**/*', '前端/黑科技/**/**/*',
24 | '資源/*',
25 | '配置.yaml',
26 | ],
27 | },
28 | classifiers=[
29 | 'Programming Language :: Python :: 3',
30 | 'Operating System :: OS Independent',
31 | ],
32 | install_requires=[
33 | 'liber>=1.0.1',
34 | 'rimo_utils>=1.4.1',
35 | 'cefpython3>=66.0',
36 | 'wxPython>=4.0.4',
37 | 'cloudpickle>=1.2.2',
38 | 'opencc>=1.1.1',
39 | 'PyYAML>=5.2',
40 | 'fire>=0.2.1',
41 | 'requests>=2.24.0',
42 | 'libsass>=0.20.0',
43 | 'AppKit>=0.2.8 ; sys_platform == "darwin"',
44 | ],
45 | python_requires='>=3.6, <=3.7',
46 | )
47 |
--------------------------------------------------------------------------------
/文檔/Librian2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/文檔/Librian2.jpg
--------------------------------------------------------------------------------
/文檔/樣例_潘大爺.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/文檔/樣例_潘大爺.jpg
--------------------------------------------------------------------------------
/文檔/視頻佔位.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/文檔/視頻佔位.jpg
--------------------------------------------------------------------------------