Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Open sidebar
project
drupal
Commits
df2cf40d
Commit
df2cf40d
authored
Oct 26, 2008
by
Dries
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- Patch
#266358
by Rob Loach, mfer: use array in drupal_add_css().
parent
617fe51e
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
132 additions
and
53 deletions
+132
-53
includes/common.inc
includes/common.inc
+60
-31
includes/locale.inc
includes/locale.inc
+1
-1
includes/theme.inc
includes/theme.inc
+1
-1
includes/theme.maintenance.inc
includes/theme.maintenance.inc
+5
-5
modules/block/block.admin.inc
modules/block/block.admin.inc
+1
-1
modules/color/color.module
modules/color/color.module
+2
-2
modules/dblog/dblog.module
modules/dblog/dblog.module
+1
-1
modules/help/help.admin.inc
modules/help/help.admin.inc
+1
-1
modules/openid/openid.module
modules/openid/openid.module
+1
-1
modules/openid/openid.pages.inc
modules/openid/openid.pages.inc
+1
-1
modules/search/search.module
modules/search/search.module
+1
-1
modules/simpletest/simpletest.module
modules/simpletest/simpletest.module
+1
-1
modules/simpletest/tests/common.test
modules/simpletest/tests/common.test
+50
-0
modules/system/system.module
modules/system/system.module
+4
-4
modules/tracker/tracker.pages.inc
modules/tracker/tracker.pages.inc
+1
-1
modules/user/user.module
modules/user/user.module
+1
-1
No files found.
includes/common.inc
View file @
df2cf40d
...
@@ -1731,55 +1731,84 @@ function drupal_add_link($attributes) {
...
@@ -1731,55 +1731,84 @@ function drupal_add_link($attributes) {
* file added to the list, if exists in the same directory. This CSS file
* file added to the list, if exists in the same directory. This CSS file
* should contain overrides for properties which should be reversed or
* should contain overrides for properties which should be reversed or
* otherwise different in a right-to-left display.
* otherwise different in a right-to-left display.
* @param $type
* @param $options
* (optional) The type of stylesheet that is being added. Types are: module
* (optional) A string defining the type of CSS that is being added in the
* or theme.
* $path parameter ('module' or 'theme'), or an associative array of
* @param $media
* additional options, with the following keys:
* (optional) The media type for the stylesheet, e.g., all, print, screen.
* - 'type'
* @param $preprocess
* The type of stylesheet that is being added. Types are: module or
* (optional) Should this CSS file be aggregated and compressed if this
* theme. Defaults to 'module'.
* feature has been turned on under the performance section?
* - 'media'
*
* The media type for the stylesheet, e.g., all, print, screen. Defaults
* What does this actually mean?
* to 'all'.
* CSS preprocessing is the process of aggregating a bunch of separate CSS
* - 'preprocess':
* files into one file that is then compressed by removing all extraneous
* Allow this CSS file to be aggregated and compressed if the Optimize
* white space.
* CSS feature has been turned on under the performance section. Defaults
*
* to TRUE.
* The reason for merging the CSS files is outlined quite thoroughly here:
*
* http://www.die.net/musings/page_load_time/
* What does this actually mean?
* "Load fewer external objects. Due to request overhead, one bigger file
* CSS preprocessing is the process of aggregating a bunch of separate CSS
* just loads faster than two smaller ones half its size."
* files into one file that is then compressed by removing all extraneous
*
* white space.
* However, you should *not* preprocess every file as this can lead to
*
* redundant caches. You should set $preprocess = FALSE when:
* The reason for merging the CSS files is outlined quite thoroughly here:
*
* http://www.die.net/musings/page_load_time/
* - Your styles are only used rarely on the site. This could be a special
* "Load fewer external objects. Due to request overhead, one bigger file
* admin page, the homepage, or a handful of pages that does not represent
* just loads faster than two smaller ones half its size."
* the majority of the pages on your site.
*
*
* However, you should *not* preprocess every file as this can lead to
* Typical candidates for caching are for example styles for nodes across
* redundant caches. You should set $preprocess = FALSE when your styles
* the site, or used in the theme.
* are only used rarely on the site. This could be a special admin page,
* the homepage, or a handful of pages that does not represent the
* majority of the pages on your site.
*
* Typical candidates for caching are for example styles for nodes across
* the site, or used in the theme.
* @param $reset
* (optional) Resets the currently loaded cascading stylesheets.
* @return
* @return
* An array of CSS files.
* An array of CSS files.
*/
*/
function
drupal_add_css
(
$path
=
NULL
,
$
type
=
'module'
,
$media
=
'all'
,
$
p
re
process
=
TRU
E
)
{
function
drupal_add_css
(
$path
=
NULL
,
$
options
=
NULL
,
$re
set
=
FALS
E
)
{
static
$css
=
array
();
static
$css
=
array
();
global
$language
;
global
$language
;
// Request made to reset the CSS added so far.
if
(
$reset
)
{
$css
=
array
();
}
// Create an array of CSS files for each media type first, since each type needs to be served
// Create an array of CSS files for each media type first, since each type needs to be served
// to the browser differently.
// to the browser differently.
if
(
isset
(
$path
))
{
if
(
isset
(
$path
))
{
// Construct the options, taking the defaults into consideration.
if
(
isset
(
$options
))
{
if
(
!
is_array
(
$options
))
{
$options
=
array
(
'type'
=>
$options
);
}
}
else
{
$options
=
array
();
}
$options
+=
array
(
'type'
=>
'module'
,
'media'
=>
'all'
,
'preprocess'
=>
TRUE
);
$media
=
$options
[
'media'
];
$type
=
$options
[
'type'
];
// This check is necessary to ensure proper cascading of styles and is faster than an asort().
// This check is necessary to ensure proper cascading of styles and is faster than an asort().
if
(
!
isset
(
$css
[
$media
]))
{
if
(
!
isset
(
$css
[
$media
]))
{
$css
[
$media
]
=
array
(
'module'
=>
array
(),
'theme'
=>
array
());
$css
[
$media
]
=
array
(
'module'
=>
array
(),
'theme'
=>
array
());
}
}
$css
[
$media
][
$type
][
$path
]
=
$preprocess
;
$css
[
$media
][
$type
][
$path
]
=
$
options
[
'
preprocess
'
]
;
// If the current language is RTL, add the CSS file with RTL overrides.
// If the current language is RTL, add the CSS file with RTL overrides.
if
(
defined
(
'LANGUAGE_RTL'
)
&&
$language
->
direction
==
LANGUAGE_RTL
)
{
if
(
defined
(
'LANGUAGE_RTL'
)
&&
$language
->
direction
==
LANGUAGE_RTL
)
{
$rtl_path
=
str_replace
(
'.css'
,
'-rtl.css'
,
$path
);
$rtl_path
=
str_replace
(
'.css'
,
'-rtl.css'
,
$path
);
if
(
file_exists
(
$rtl_path
))
{
if
(
file_exists
(
$rtl_path
))
{
$css
[
$media
][
$type
][
$rtl_path
]
=
$preprocess
;
$css
[
$media
][
$type
][
$rtl_path
]
=
$
options
[
'
preprocess
'
]
;
}
}
}
}
}
}
...
...
includes/locale.inc
View file @
df2cf40d
...
@@ -2215,7 +2215,7 @@ function _locale_rebuild_js($langcode = NULL) {
...
@@ -2215,7 +2215,7 @@ function _locale_rebuild_js($langcode = NULL) {
*/
*/
function
_locale_translate_language_list
(
$translation
,
$limit_language
)
{
function
_locale_translate_language_list
(
$translation
,
$limit_language
)
{
// Add CSS
// Add CSS
drupal_add_css
(
drupal_get_path
(
'module'
,
'locale'
)
.
'/locale.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'locale'
)
.
'/locale.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
$languages
=
language_list
();
$languages
=
language_list
();
unset
(
$languages
[
'en'
]);
unset
(
$languages
[
'en'
]);
...
...
includes/theme.inc
View file @
df2cf40d
...
@@ -133,7 +133,7 @@ function _init_theme($theme, $base_theme = array(), $registry_callback = '_theme
...
@@ -133,7 +133,7 @@ function _init_theme($theme, $base_theme = array(), $registry_callback = '_theme
// And now add the stylesheets properly
// And now add the stylesheets properly
foreach
(
$final_stylesheets
as
$media
=>
$stylesheets
)
{
foreach
(
$final_stylesheets
as
$media
=>
$stylesheets
)
{
foreach
(
$stylesheets
as
$stylesheet
)
{
foreach
(
$stylesheets
as
$stylesheet
)
{
drupal_add_css
(
$stylesheet
,
'theme'
,
$media
);
drupal_add_css
(
$stylesheet
,
array
(
'type'
=>
'theme'
,
'media'
=>
$media
)
)
;
}
}
}
}
...
...
includes/theme.maintenance.inc
View file @
df2cf40d
...
@@ -62,11 +62,11 @@ function _drupal_maintenance_theme() {
...
@@ -62,11 +62,11 @@ function _drupal_maintenance_theme() {
// These are usually added from system_init() -except maintenance.css.
// These are usually added from system_init() -except maintenance.css.
// When the database is inactive it's not called so we add it here.
// When the database is inactive it's not called so we add it here.
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/defaults.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/defaults.css'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system.css'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system-menus.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system-menus.css'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/maintenance.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/maintenance.css'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/admin.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/admin.css'
);
}
}
/**
/**
...
...
modules/block/block.admin.inc
View file @
df2cf40d
...
@@ -28,7 +28,7 @@ function block_admin_display($theme = NULL) {
...
@@ -28,7 +28,7 @@ function block_admin_display($theme = NULL) {
function
block_admin_display_form
(
&
$form_state
,
$blocks
,
$theme
=
NULL
)
{
function
block_admin_display_form
(
&
$form_state
,
$blocks
,
$theme
=
NULL
)
{
global
$theme_key
,
$custom_theme
;
global
$theme_key
,
$custom_theme
;
drupal_add_css
(
drupal_get_path
(
'module'
,
'block'
)
.
'/block.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'block'
)
.
'/block.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
// If non-default theme configuration has been selected, set the custom theme.
// If non-default theme configuration has been selected, set the custom theme.
$custom_theme
=
isset
(
$theme
)
?
$theme
:
variable_get
(
'theme_default'
,
'garland'
);
$custom_theme
=
isset
(
$theme
)
?
$theme
:
variable_get
(
'theme_default'
,
'garland'
);
...
...
modules/color/color.module
View file @
df2cf40d
...
@@ -153,11 +153,11 @@ function color_scheme_form(&$form_state, $theme) {
...
@@ -153,11 +153,11 @@ function color_scheme_form(&$form_state, $theme) {
$info
=
color_get_info
(
$theme
);
$info
=
color_get_info
(
$theme
);
// Add Farbtastic color picker.
// Add Farbtastic color picker.
drupal_add_css
(
'misc/farbtastic/farbtastic.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
'misc/farbtastic/farbtastic.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
drupal_add_js
(
'misc/farbtastic/farbtastic.js'
);
drupal_add_js
(
'misc/farbtastic/farbtastic.js'
);
// Add custom CSS and JS.
// Add custom CSS and JS.
drupal_add_css
(
$base
.
'/color.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
$base
.
'/color.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
drupal_add_js
(
$base
.
'/color.js'
);
drupal_add_js
(
$base
.
'/color.js'
);
drupal_add_js
(
array
(
'color'
=>
array
(
drupal_add_js
(
array
(
'color'
=>
array
(
'reference'
=>
color_get_palette
(
$theme
,
TRUE
)
'reference'
=>
color_get_palette
(
$theme
,
TRUE
)
...
...
modules/dblog/dblog.module
View file @
df2cf40d
...
@@ -83,7 +83,7 @@ function dblog_menu() {
...
@@ -83,7 +83,7 @@ function dblog_menu() {
function
dblog_init
()
{
function
dblog_init
()
{
if
(
arg
(
0
)
==
'admin'
&&
arg
(
1
)
==
'reports'
)
{
if
(
arg
(
0
)
==
'admin'
&&
arg
(
1
)
==
'reports'
)
{
// Add the CSS for this module
// Add the CSS for this module
drupal_add_css
(
drupal_get_path
(
'module'
,
'dblog'
)
.
'/dblog.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'dblog'
)
.
'/dblog.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
}
}
}
}
...
...
modules/help/help.admin.inc
View file @
df2cf40d
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
*/
*/
function
help_main
()
{
function
help_main
()
{
// Add CSS
// Add CSS
drupal_add_css
(
drupal_get_path
(
'module'
,
'help'
)
.
'/help.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'help'
)
.
'/help.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
$output
=
'<h2>'
.
t
(
'Help topics'
)
.
'</h2><p>'
.
t
(
'Help is available on the following items:'
)
.
'</p>'
.
help_links_as_list
();
$output
=
'<h2>'
.
t
(
'Help topics'
)
.
'</h2><p>'
.
t
(
'Help is available on the following items:'
)
.
'</p>'
.
help_links_as_list
();
return
$output
;
return
$output
;
}
}
...
...
modules/openid/openid.module
View file @
df2cf40d
...
@@ -75,7 +75,7 @@ function openid_user_insert(&$edit, &$account, $category = NULL) {
...
@@ -75,7 +75,7 @@ function openid_user_insert(&$edit, &$account, $category = NULL) {
*/
*/
function
openid_form_alter
(
&
$form
,
$form_state
,
$form_id
)
{
function
openid_form_alter
(
&
$form
,
$form_state
,
$form_id
)
{
if
(
$form_id
==
'user_login_block'
||
$form_id
==
'user_login'
)
{
if
(
$form_id
==
'user_login_block'
||
$form_id
==
'user_login'
)
{
drupal_add_css
(
drupal_get_path
(
'module'
,
'openid'
)
.
'/openid.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'openid'
)
.
'/openid.css'
);
drupal_add_js
(
drupal_get_path
(
'module'
,
'openid'
)
.
'/openid.js'
);
drupal_add_js
(
drupal_get_path
(
'module'
,
'openid'
)
.
'/openid.js'
);
if
(
!
empty
(
$form_state
[
'post'
][
'openid_identifier'
]))
{
if
(
!
empty
(
$form_state
[
'post'
][
'openid_identifier'
]))
{
$form
[
'name'
][
'#required'
]
=
FALSE
;
$form
[
'name'
][
'#required'
]
=
FALSE
;
...
...
modules/openid/openid.pages.inc
View file @
df2cf40d
...
@@ -29,7 +29,7 @@ function openid_authentication_page() {
...
@@ -29,7 +29,7 @@ function openid_authentication_page() {
*/
*/
function
openid_user_identities
(
$account
)
{
function
openid_user_identities
(
$account
)
{
drupal_set_title
(
$account
->
name
);
drupal_set_title
(
$account
->
name
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'openid'
)
.
'/openid.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'openid'
)
.
'/openid.css'
);
// Check to see if we got a response
// Check to see if we got a response
$result
=
openid_complete
();
$result
=
openid_complete
();
...
...
modules/search/search.module
View file @
df2cf40d
...
@@ -1031,7 +1031,7 @@ function search_get_keys() {
...
@@ -1031,7 +1031,7 @@ function search_get_keys() {
function
search_form
(
&
$form_state
,
$action
=
''
,
$keys
=
''
,
$type
=
NULL
,
$prompt
=
NULL
)
{
function
search_form
(
&
$form_state
,
$action
=
''
,
$keys
=
''
,
$type
=
NULL
,
$prompt
=
NULL
)
{
// Add CSS
// Add CSS
drupal_add_css
(
drupal_get_path
(
'module'
,
'search'
)
.
'/search.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'search'
)
.
'/search.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
if
(
!
$action
)
{
if
(
!
$action
)
{
$action
=
url
(
'search/'
.
$type
);
$action
=
url
(
'search/'
.
$type
);
...
...
modules/simpletest/simpletest.module
View file @
df2cf40d
...
@@ -199,7 +199,7 @@ function simpletest_test_form() {
...
@@ -199,7 +199,7 @@ function simpletest_test_form() {
}
}
function
theme_simpletest_test_table
(
$table
)
{
function
theme_simpletest_test_table
(
$table
)
{
drupal_add_css
(
drupal_get_path
(
'module'
,
'simpletest'
)
.
'/simpletest.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'simpletest'
)
.
'/simpletest.css'
);
drupal_add_js
(
drupal_get_path
(
'module'
,
'simpletest'
)
.
'/simpletest.js'
,
'module'
);
drupal_add_js
(
drupal_get_path
(
'module'
,
'simpletest'
)
.
'/simpletest.js'
,
'module'
);
// Create header for test selection table.
// Create header for test selection table.
...
...
modules/simpletest/tests/common.test
View file @
df2cf40d
...
@@ -114,6 +114,56 @@ class DrupalTagsHandlingTestCase extends DrupalWebTestCase {
...
@@ -114,6 +114,56 @@ class DrupalTagsHandlingTestCase extends DrupalWebTestCase {
}
}
}
}
/**
* Test the Drupal CSS system.
*/
class
CascadingStylesheetsTestCase
extends
DrupalWebTestCase
{
/**
* Implementation of getInfo().
*/
function
getInfo
()
{
return
array
(
'name'
=>
t
(
'Cascading stylesheets'
),
'description'
=>
t
(
'Tests adding various cascading stylesheets to the page.'
),
'group'
=>
t
(
'System'
)
);
}
/**
* Implementation of setUp().
*/
function
setUp
()
{
parent
::
setUp
();
// Reset drupal_add_css() before each test.
drupal_add_css
(
NULL
,
NULL
,
TRUE
);
}
/**
* Check default stylesheets as empty.
*/
function
testDefault
()
{
$this
->
assertEqual
(
array
(),
drupal_add_css
(),
t
(
'Default CSS is empty.'
));
}
/**
* Tests adding a file stylesheet.
*/
function
testAddFile
()
{
$path
=
drupal_get_path
(
'module'
,
'simpletest'
)
.
'/simpletest.css'
;
$css
=
drupal_add_css
(
$path
);
$this
->
assertEqual
(
$css
[
'all'
][
'module'
][
$path
],
TRUE
,
t
(
'Adding a CSS file caches it properly.'
));
}
/**
* Tests rendering the stylesheets.
*/
function
testRenderFile
()
{
$css
=
drupal_get_path
(
'module'
,
'simpletest'
)
.
'/simpletest.css'
;
drupal_add_css
(
$css
);
$this
->
assertTrue
(
strpos
(
drupal_get_css
(),
$css
)
>
0
,
t
(
'Rendered CSS includes the added stylesheet.'
));
}
}
/**
/**
* Test drupal_http_request().
* Test drupal_http_request().
*/
*/
...
...
modules/system/system.module
View file @
df2cf40d
...
@@ -706,13 +706,13 @@ function system_init() {
...
@@ -706,13 +706,13 @@ function system_init() {
if
(
arg
(
0
)
==
'admin'
||
(
variable_get
(
'node_admin_theme'
,
'0'
)
&&
arg
(
0
)
==
'node'
&&
(
arg
(
1
)
==
'add'
||
arg
(
2
)
==
'edit'
)))
{
if
(
arg
(
0
)
==
'admin'
||
(
variable_get
(
'node_admin_theme'
,
'0'
)
&&
arg
(
0
)
==
'node'
&&
(
arg
(
1
)
==
'add'
||
arg
(
2
)
==
'edit'
)))
{
global
$custom_theme
;
global
$custom_theme
;
$custom_theme
=
variable_get
(
'admin_theme'
,
'0'
);
$custom_theme
=
variable_get
(
'admin_theme'
,
'0'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/admin.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/admin.css'
);
}
}
// Add the CSS for this module.
// Add the CSS for this module.
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/defaults.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/defaults.css'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system.css'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system-menus.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'system'
)
.
'/system-menus.css'
);
}
}
/**
/**
...
...
modules/tracker/tracker.pages.inc
View file @
df2cf40d
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
*/
*/
function
tracker_page
(
$account
=
NULL
,
$set_title
=
FALSE
)
{
function
tracker_page
(
$account
=
NULL
,
$set_title
=
FALSE
)
{
// Add CSS
// Add CSS
drupal_add_css
(
drupal_get_path
(
'module'
,
'tracker'
)
.
'/tracker.css'
,
'module'
,
'all'
,
FALSE
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'tracker'
)
.
'/tracker.css'
,
array
(
'preprocess'
=>
FALSE
)
)
;
if
(
$account
)
{
if
(
$account
)
{
if
(
$set_title
)
{
if
(
$set_title
)
{
...
...
modules/user/user.module
View file @
df2cf40d
...
@@ -1120,7 +1120,7 @@ function user_menu() {
...
@@ -1120,7 +1120,7 @@ function user_menu() {
}
}
function
user_init
()
{
function
user_init
()
{
drupal_add_css
(
drupal_get_path
(
'module'
,
'user'
)
.
'/user.css'
,
'module'
);
drupal_add_css
(
drupal_get_path
(
'module'
,
'user'
)
.
'/user.css'
);
}
}
function
user_uid_optional_load
(
$arg
)
{
function
user_uid_optional_load
(
$arg
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment