当前位置: 首页>>代码示例>>PHP>>正文


PHP action_menu::set_alignment方法代码示例

本文整理汇总了PHP中action_menu::set_alignment方法的典型用法代码示例。如果您正苦于以下问题:PHP action_menu::set_alignment方法的具体用法?PHP action_menu::set_alignment怎么用?PHP action_menu::set_alignment使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在action_menu的用法示例。


在下文中一共展示了action_menu::set_alignment方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。

示例1: build_html_tree

 /**
  * Recursive function for building the table holding the grade categories and items,
  * with CSS indentation and styles.
  *
  * @param array   $element The current tree element being rendered
  * @param boolean $totals Whether or not to print category grade items (category totals)
  * @param array   $parents An array of parent categories for the current element (used for indentation and row classes)
  *
  * @return string HTML
  */
 public function build_html_tree($element, $totals, $parents, $level, &$row_count)
 {
     global $CFG, $COURSE, $PAGE, $OUTPUT;
     $object = $element['object'];
     $eid = $element['eid'];
     $object->name = $this->gtree->get_element_header($element, true, true, true, true, true);
     $object->stripped_name = $this->gtree->get_element_header($element, false, false, false);
     $is_category_item = false;
     if ($element['type'] == 'categoryitem' || $element['type'] == 'courseitem') {
         $is_category_item = true;
     }
     $rowclasses = array();
     foreach ($parents as $parent_eid) {
         $rowclasses[] = $parent_eid;
     }
     $moveaction = '';
     $actionsmenu = new action_menu();
     $actionsmenu->set_menu_trigger(get_string('edit'));
     $actionsmenu->set_owner_selector('grade-item-' . $eid);
     $actionsmenu->set_alignment(action_menu::TL, action_menu::BL);
     if (!$is_category_item && ($icon = $this->gtree->get_edit_icon($element, $this->gpr, true))) {
         $actionsmenu->add($icon);
     }
     // MDL-49281 if grade_item already has calculation, it should be editable even if global setting is off.
     $type = $element['type'];
     $iscalculated = ($type == 'item' or $type == 'courseitem' or $type == 'categoryitem') && $object->is_calculated();
     $icon = $this->gtree->get_calculation_icon($element, $this->gpr, true);
     if ($iscalculated || $this->show_calculations && $icon) {
         $actionsmenu->add($icon);
     }
     if ($element['type'] == 'item' or $element['type'] == 'category' and $element['depth'] > 1) {
         if ($this->element_deletable($element)) {
             $aurl = new moodle_url('index.php', array('id' => $COURSE->id, 'action' => 'delete', 'eid' => $eid, 'sesskey' => sesskey()));
             $icon = new action_menu_link_secondary($aurl, new pix_icon('t/delete', get_string('delete')), get_string('delete'));
             $actionsmenu->add($icon);
         }
         $aurl = new moodle_url('index.php', array('id' => $COURSE->id, 'action' => 'moveselect', 'eid' => $eid, 'sesskey' => sesskey()));
         $moveaction .= $OUTPUT->action_icon($aurl, new pix_icon('t/move', get_string('move')));
     }
     if ($icon = $this->gtree->get_hiding_icon($element, $this->gpr, true)) {
         $actionsmenu->add($icon);
     }
     if ($icon = $this->gtree->get_reset_icon($element, $this->gpr, true)) {
         $actionsmenu->add($icon);
     }
     $actions = $OUTPUT->render($actionsmenu);
     $returnrows = array();
     $root = false;
     $id = required_param('id', PARAM_INT);
     /// prepare move target if needed
     $last = '';
     /// print the list items now
     if ($this->moving == $eid) {
         // do not diplay children
         $cell = new html_table_cell();
         $cell->colspan = 12;
         $cell->attributes['class'] = $element['type'] . ' moving column-name level' . ($level + 1) . ' level' . ($level % 2 ? 'even' : 'odd');
         $cell->text = $object->name . ' (' . get_string('move') . ')';
         return array(new html_table_row(array($cell)));
     }
     if ($element['type'] == 'category') {
         $level++;
         $this->categories[$object->id] = $object->stripped_name;
         $category = grade_category::fetch(array('id' => $object->id));
         $item = $category->get_grade_item();
         // Add aggregation coef input if not a course item and if parent category has correct aggregation type
         $dimmed = $item->is_hidden() ? 'dimmed_text' : '';
         // Before we print the category's row, we must find out how many rows will appear below it (for the filler cell's rowspan)
         $aggregation_position = grade_get_setting($COURSE->id, 'aggregationposition', $CFG->grade_aggregationposition);
         $category_total_data = null;
         // Used if aggregationposition is set to "last", so we can print it last
         $html_children = array();
         $row_count = 0;
         foreach ($element['children'] as $child_el) {
             $moveto = null;
             if (empty($child_el['object']->itemtype)) {
                 $child_el['object']->itemtype = false;
             }
             if (($child_el['object']->itemtype == 'course' || $child_el['object']->itemtype == 'category') && !$totals) {
                 continue;
             }
             $child_eid = $child_el['eid'];
             $first = '';
             if ($child_el['object']->itemtype == 'course' || $child_el['object']->itemtype == 'category') {
                 $first = array('first' => 1);
                 $child_eid = $eid;
             }
             if ($this->moving && $this->moving != $child_eid) {
                 $strmove = get_string('move');
                 $strmovehere = get_string('movehere');
//.........这里部分代码省略.........
开发者ID:gabrielrosset,项目名称:moodle,代码行数:101,代码来源:lib.php

示例2: col_userid

 /**
  * Format a column of data for display.
  *
  * @param stdClass $row
  * @return string
  */
 public function col_userid(stdClass $row)
 {
     global $USER;
     $edit = '';
     $actions = array();
     $urlparams = array('id' => $this->assignment->get_course_module()->id, 'rownum' => $this->rownum, 'action' => 'grade');
     $url = new moodle_url('/mod/assign/view.php', $urlparams);
     $noimage = null;
     if (!$row->grade) {
         $description = get_string('grade');
     } else {
         $description = get_string('updategrade', 'assign');
     }
     $actions['grade'] = new action_menu_link_secondary($url, $noimage, $description);
     // Everything we need is in the row.
     $submission = $row;
     $flags = $row;
     if ($this->assignment->get_instance()->teamsubmission) {
         // Use the cache for this.
         $submission = false;
         $group = false;
         $this->get_group_and_submission($row->id, $group, $submission, -1);
     }
     $submissionsopen = $this->assignment->submissions_open($row->id, true, $submission, $flags, $this->gradinginfo);
     $caneditsubmission = $this->assignment->can_edit_submission($row->id, $USER->id);
     // Hide for offline assignments.
     if ($this->assignment->is_any_submission_plugin_enabled()) {
         if (!$row->status || $row->status == ASSIGN_SUBMISSION_STATUS_DRAFT || !$this->assignment->get_instance()->submissiondrafts) {
             if (!$row->locked) {
                 $urlparams = array('id' => $this->assignment->get_course_module()->id, 'userid' => $row->id, 'action' => 'lock', 'sesskey' => sesskey(), 'page' => $this->currpage);
                 $url = new moodle_url('/mod/assign/view.php', $urlparams);
                 $description = get_string('preventsubmissionsshort', 'assign');
                 $actions['lock'] = new action_menu_link_secondary($url, $noimage, $description);
             } else {
                 $urlparams = array('id' => $this->assignment->get_course_module()->id, 'userid' => $row->id, 'action' => 'unlock', 'sesskey' => sesskey(), 'page' => $this->currpage);
                 $url = new moodle_url('/mod/assign/view.php', $urlparams);
                 $description = get_string('allowsubmissionsshort', 'assign');
                 $actions['unlock'] = new action_menu_link_secondary($url, $noimage, $description);
             }
         }
         if ($submissionsopen && $USER->id != $row->id && $caneditsubmission) {
             $urlparams = array('id' => $this->assignment->get_course_module()->id, 'userid' => $row->id, 'action' => 'editsubmission', 'sesskey' => sesskey(), 'page' => $this->currpage);
             $url = new moodle_url('/mod/assign/view.php', $urlparams);
             $description = get_string('editsubmission', 'assign');
             $actions['editsubmission'] = new action_menu_link_secondary($url, $noimage, $description);
         }
     }
     if (($this->assignment->get_instance()->duedate || $this->assignment->get_instance()->cutoffdate) && $this->hasgrantextension) {
         $urlparams = array('id' => $this->assignment->get_course_module()->id, 'userid' => $row->id, 'action' => 'grantextension', 'sesskey' => sesskey(), 'page' => $this->currpage);
         $url = new moodle_url('/mod/assign/view.php', $urlparams);
         $description = get_string('grantextension', 'assign');
         $actions['grantextension'] = new action_menu_link_secondary($url, $noimage, $description);
     }
     if ($row->status == ASSIGN_SUBMISSION_STATUS_SUBMITTED && $this->assignment->get_instance()->submissiondrafts) {
         $urlparams = array('id' => $this->assignment->get_course_module()->id, 'userid' => $row->id, 'action' => 'reverttodraft', 'sesskey' => sesskey(), 'page' => $this->currpage);
         $url = new moodle_url('/mod/assign/view.php', $urlparams);
         $description = get_string('reverttodraftshort', 'assign');
         $actions['reverttodraft'] = new action_menu_link_secondary($url, $noimage, $description);
     }
     if ($row->status == ASSIGN_SUBMISSION_STATUS_DRAFT && $this->assignment->get_instance()->submissiondrafts && $caneditsubmission && $submissionsopen && $row->id != $USER->id) {
         $urlparams = array('id' => $this->assignment->get_course_module()->id, 'userid' => $row->id, 'action' => 'submitotherforgrading', 'sesskey' => sesskey(), 'page' => $this->currpage);
         $url = new moodle_url('/mod/assign/view.php', $urlparams);
         $description = get_string('submitforgrading', 'assign');
         $actions['submitforgrading'] = new action_menu_link_secondary($url, $noimage, $description);
     }
     $ismanual = $this->assignment->get_instance()->attemptreopenmethod == ASSIGN_ATTEMPT_REOPEN_METHOD_MANUAL;
     $hassubmission = !empty($row->status);
     $notreopened = $hassubmission && $row->status != ASSIGN_SUBMISSION_STATUS_REOPENED;
     $isunlimited = $this->assignment->get_instance()->maxattempts == ASSIGN_UNLIMITED_ATTEMPTS;
     $hasattempts = $isunlimited || $row->attemptnumber < $this->assignment->get_instance()->maxattempts - 1;
     if ($ismanual && $hassubmission && $notreopened && $hasattempts) {
         $urlparams = array('id' => $this->assignment->get_course_module()->id, 'userid' => $row->id, 'action' => 'addattempt', 'sesskey' => sesskey(), 'page' => $this->currpage);
         $url = new moodle_url('/mod/assign/view.php', $urlparams);
         $description = get_string('addattempt', 'assign');
         $actions['addattempt'] = new action_menu_link_secondary($url, $noimage, $description);
     }
     $menu = new action_menu();
     $menu->set_owner_selector('.gradingtable-actionmenu');
     $menu->set_alignment(action_menu::TL, action_menu::BL);
     $menu->set_constraint('.gradingtable > .no-overflow');
     $menu->set_menu_trigger(get_string('edit'));
     foreach ($actions as $action) {
         $menu->add($action);
     }
     // Prioritise the menu ahead of all other actions.
     $menu->prioritise = true;
     $edit .= $this->output->render($menu);
     return $edit;
 }
开发者ID:antoniorodrigues,项目名称:redes-digitais,代码行数:95,代码来源:gradingtable.php

示例3: course_section_cm_edit_actions

 /**
  * Renders HTML for displaying the sequence of course module editing buttons
  *
  * @see course_get_cm_edit_actions()
  *
  * @param action_link[] $actions Array of action_link objects
  * @param cm_info $mod The module we are displaying actions for.
  * @param array $displayoptions additional display options:
  *     ownerselector => A JS/CSS selector that can be used to find an cm node.
  *         If specified the owning node will be given the class 'action-menu-shown' when the action
  *         menu is being displayed.
  *     constraintselector => A JS/CSS selector that can be used to find the parent node for which to constrain
  *         the action menu to when it is being displayed.
  *     donotenhance => If set to true the action menu that gets displayed won't be enhanced by JS.
  * @return string
  */
 public function course_section_cm_edit_actions($actions, cm_info $mod = null, $displayoptions = array())
 {
     global $CFG;
     if (empty($actions)) {
         return '';
     }
     if (isset($displayoptions['ownerselector'])) {
         $ownerselector = $displayoptions['ownerselector'];
     } else {
         if ($mod) {
             $ownerselector = '#module-' . $mod->id;
         } else {
             debugging('You should upgrade your call to ' . __FUNCTION__ . ' and provide $mod', DEBUG_DEVELOPER);
             $ownerselector = 'li.activity';
         }
     }
     if (isset($displayoptions['constraintselector'])) {
         $constraint = $displayoptions['constraintselector'];
     } else {
         $constraint = '.course-content';
     }
     $menu = new action_menu();
     $menu->set_owner_selector($ownerselector);
     $menu->set_constraint($constraint);
     $menu->set_alignment(action_menu::TR, action_menu::BR);
     $menu->set_menu_trigger(get_string('edit'));
     if (isset($CFG->modeditingmenu) && !$CFG->modeditingmenu || !empty($displayoptions['donotenhance'])) {
         $menu->do_not_enhance();
         // Swap the left/right icons.
         // Normally we have have right, then left but this does not
         // make sense when modactionmenu is disabled.
         $moveright = null;
         $_actions = array();
         foreach ($actions as $key => $value) {
             if ($key === 'moveright') {
                 // Save moveright for later.
                 $moveright = $value;
             } else {
                 if ($moveright) {
                     // This assumes that the order was moveright, moveleft.
                     // If we have a moveright, then we should place it immediately after the current value.
                     $_actions[$key] = $value;
                     $_actions['moveright'] = $moveright;
                     // Clear the value to prevent it being used multiple times.
                     $moveright = null;
                 } else {
                     $_actions[$key] = $value;
                 }
             }
         }
         $actions = $_actions;
         unset($_actions);
     }
     foreach ($actions as $action) {
         if ($action instanceof action_menu_link) {
             $action->add_class('cm-edit-action');
         }
         $menu->add($action);
     }
     $menu->attributes['class'] .= ' section-cm-edit-actions commands';
     // Prioritise the menu ahead of all other actions.
     $menu->prioritise = true;
     return $this->render($menu);
 }
开发者ID:rushi963,项目名称:moodle,代码行数:80,代码来源:renderer.php

示例4: user_menu


//.........这里部分代码省略.........
                    )
                ),
                array('class' => 'meta viewingas')
            );
        }

        // Role.
        if (!empty($opts->metadata['asotherrole'])) {
            $role = core_text::strtolower(preg_replace('#[ ]+#', '-', trim($opts->metadata['rolename'])));
            $usertextcontents .= html_writer::span(
                $opts->metadata['rolename'],
                'meta role role-' . $role
            );
        }

        // User login failures.
        if (!empty($opts->metadata['userloginfail'])) {
            $usertextcontents .= html_writer::span(
                $opts->metadata['userloginfail'],
                'meta loginfailures'
            );
        }

        // MNet.
        if (!empty($opts->metadata['asmnetuser'])) {
            $mnet = strtolower(preg_replace('#[ ]+#', '-', trim($opts->metadata['mnetidprovidername'])));
            $usertextcontents .= html_writer::span(
                $opts->metadata['mnetidprovidername'],
                'meta mnet mnet-' . $mnet
            );
        }

        $returnstr .= html_writer::span(
            html_writer::span($usertextcontents, 'usertext') .
            html_writer::span($avatarcontents, $avatarclasses),
            'userbutton'
        );

        // Create a divider (well, a filler).
        $divider = new action_menu_filler();
        $divider->primary = false;

        $am = new action_menu();
        $am->initialise_js($this->page);
        $am->set_menu_trigger(
            $returnstr
        );
        $am->set_alignment(action_menu::TR, action_menu::BR);
        $am->set_nowrap_on_items();
        if ($withlinks) {
            $navitemcount = count($opts->navitems);
            $idx = 0;
            foreach ($opts->navitems as $key => $value) {

                switch ($value->itemtype) {
                    case 'divider':
                        // If the nav item is a divider, add one and skip link processing.
                        $am->add($divider);
                        break;

                    case 'invalid':
                        // Silently skip invalid entries (should we post a notification?).
                        break;

                    case 'link':
                        // Process this as a link item.
                        $pix = null;
                        if (isset($value->pix) && !empty($value->pix)) {
                            $pix = new pix_icon($value->pix, $value->title, null, array('class' => 'iconsmall'));
                        } else if (isset($value->imgsrc) && !empty($value->imgsrc)) {
                            $value->title = html_writer::img(
                                $value->imgsrc,
                                $value->title,
                                array('class' => 'iconsmall')
                            ) . $value->title;
                        }
                        $al = new action_menu_link_secondary(
                            $value->url,
                            $pix,
                            $value->title,
                            array('class' => 'icon')
                        );
                        $am->add($al);
                        break;
                }

                $idx++;

                // Add dividers after the first item and before the last item.
                if ($idx == 1 || $idx == $navitemcount - 1) {
                    $am->add($divider);
                }
            }
        }

        return html_writer::div(
            $this->render($am),
            $usermenuclasses
        );
    }
开发者ID:afgal,项目名称:moodle-1,代码行数:101,代码来源:outputrenderers.php

示例5: course_section_cm_edit_actions

 /**
  * Renders HTML for displaying the sequence of course module editing buttons
  *
  * @see course_get_cm_edit_actions()
  *
  * @param action_link[] $actions Array of action_link objects
  * @param cm_info $mod The module we are displaying actions for.
  * @param array $displayoptions additional display options:
  *     ownerselector => A JS/CSS selector that can be used to find an cm node.
  *         If specified the owning node will be given the class 'action-menu-shown' when the action
  *         menu is being displayed.
  *     constraintselector => A JS/CSS selector that can be used to find the parent node for which to constrain
  *         the action menu to when it is being displayed.
  *     donotenhance => If set to true the action menu that gets displayed won't be enhanced by JS.
  * @return string
  */
 public function course_section_cm_edit_actions($actions, cm_info $mod = null, $displayoptions = array())
 {
     global $CFG;
     if (empty($actions)) {
         return '';
     }
     if (isset($displayoptions['ownerselector'])) {
         $ownerselector = $displayoptions['ownerselector'];
     } else {
         if ($mod) {
             $ownerselector = '#module-' . $mod->id;
         } else {
             debugging('You should upgrade your call to ' . __FUNCTION__ . ' and provide $mod', DEBUG_DEVELOPER);
             $ownerselector = 'li.activity';
         }
     }
     if (isset($displayoptions['constraintselector'])) {
         $constraint = $displayoptions['constraintselector'];
     } else {
         $constraint = '.course-content';
     }
     $menu = new action_menu();
     $menu->set_owner_selector($ownerselector);
     $menu->set_constraint($constraint);
     $menu->set_alignment(action_menu::TR, action_menu::BR);
     $menu->set_menu_trigger(get_string('edit'));
     foreach ($actions as $action) {
         if ($action instanceof action_menu_link) {
             $action->add_class('cm-edit-action');
         }
         $menu->add($action);
     }
     $menu->attributes['class'] .= ' section-cm-edit-actions commands';
     // Prioritise the menu ahead of all other actions.
     $menu->prioritise = true;
     return $this->render($menu);
 }
开发者ID:janeklb,项目名称:moodle,代码行数:53,代码来源:renderer.php

示例6: add_menu_actions

 /**
  * Returns the add menu that is output once per page.
  * @param structure $structure object containing the structure of the quiz.
  * @param int $page the page number that this menu will add to.
  * @param \moodle_url $pageurl the canonical URL of this page.
  * @param \question_edit_contexts $contexts the relevant question bank contexts.
  * @param array $pagevars the variables from {@link \question_edit_setup()}.
  * @return string HTML to output.
  */
 public function add_menu_actions(structure $structure, $page, \moodle_url $pageurl, \question_edit_contexts $contexts, array $pagevars)
 {
     $actions = $this->edit_menu_actions($structure, $page, $pageurl, $pagevars);
     if (empty($actions)) {
         return '';
     }
     $menu = new \action_menu();
     $menu->set_alignment(\action_menu::TR, \action_menu::BR);
     $menu->set_constraint('.mod-quiz-edit-content');
     $trigger = html_writer::tag('span', get_string('add', 'quiz'), array('class' => 'add-menu'));
     $menu->set_menu_trigger($trigger);
     // The menu appears within an absolutely positioned element causing width problems.
     // Make sure no-wrap is set so that we don't get a squashed menu.
     $menu->set_nowrap_on_items(true);
     // Disable the link if quiz has attempts.
     if (!$structure->can_be_edited()) {
         return $this->render($menu);
     }
     foreach ($actions as $action) {
         if ($action instanceof \action_menu_link) {
             $action->add_class('add-menu');
         }
         $menu->add($action);
     }
     $menu->attributes['class'] .= ' page-add-actions commands';
     // Prioritise the menu ahead of all other actions.
     $menu->prioritise = true;
     return $this->render($menu);
 }
开发者ID:janaece,项目名称:globalclassroom4_clean,代码行数:38,代码来源:edit_renderer.php

示例7: enhance_name_for_edit

 /**
  * Adds editing actions to the question name in the edit mode
  * @param stdClass $item
  * @param HTML_QuickForm_element $element
  */
 protected function enhance_name_for_edit($item, $element)
 {
     global $OUTPUT;
     $menu = new action_menu();
     $menu->set_owner_selector('#' . $this->guess_element_id($item, $element));
     $menu->set_constraint('.feedback_form');
     $menu->set_alignment(action_menu::TR, action_menu::BR);
     $menu->set_menu_trigger(get_string('edit'));
     $menu->prioritise = true;
     $itemobj = feedback_get_item_class($item->typ);
     $actions = $itemobj->edit_actions($item, $this->get_feedback(), $this->get_cm());
     foreach ($actions as $action) {
         $menu->add($action);
     }
     $editmenu = $OUTPUT->render($menu);
     $name = $element->getLabel();
     $name = html_writer::span('', 'itemdd', array('id' => 'feedback_item_box_' . $item->id)) . html_writer::span($name, 'itemname') . html_writer::span($editmenu, 'itemactions');
     $element->setLabel(html_writer::span($name, 'itemtitle'));
 }
开发者ID:gabrielrosset,项目名称:moodle,代码行数:24,代码来源:complete_form.php

示例8: action_menu

 protected function action_menu($actions)
 {
     if (empty($actions)) {
         return '';
     }
     $menu = new action_menu();
     $menu->set_alignment(action_menu::TR, action_menu::BR);
     foreach ($actions as $action) {
         $menu->add($action);
     }
     // Prioritise the menu ahead of all other actions.
     $menu->prioritise = true;
     $output = $this->output->render($menu);
     return str_replace('iconsmall', '', $output);
 }
开发者ID:eSrem,项目名称:moodle-mod_mediagallery,代码行数:15,代码来源:renderer.php

示例9: add_menu_actions

 /**
  * Returns the add menu that is output once per page.
  * @param structure $structure object containing the structure of the quiz.
  * @param int $page the page number that this menu will add to.
  * @param \moodle_url $pageurl the canonical URL of this page.
  * @param \question_edit_contexts $contexts the relevant question bank contexts.
  * @param array $pagevars the variables from {@link \question_edit_setup()}.
  * @return string HTML to output.
  */
 public function add_menu_actions(structure $structure, $page, \moodle_url $pageurl, \question_edit_contexts $contexts, array $pagevars)
 {
     $actions = $this->edit_menu_actions($structure, $page, $pageurl, $pagevars);
     if (empty($actions)) {
         return '';
     }
     $menu = new \action_menu();
     $menu->set_alignment(\action_menu::TR, \action_menu::BR);
     $trigger = html_writer::tag('span', get_string('add', 'quiz'), array('class' => 'add-menu'));
     $menu->set_menu_trigger($trigger);
     // Disable the link if quiz has attempts.
     if (!$structure->can_be_edited()) {
         return $this->render($menu);
     }
     foreach ($actions as $action) {
         if ($action instanceof \action_menu_link) {
             $action->add_class('add-menu');
         }
         $menu->add($action);
     }
     $menu->attributes['class'] .= ' page-add-actions commands';
     // Prioritise the menu ahead of all other actions.
     $menu->prioritise = true;
     return $this->render($menu);
 }
开发者ID:HuiChangZhai,项目名称:moodle,代码行数:34,代码来源:edit_renderer.php


注:本文中的action_menu::set_alignment方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。