📄 demo.pl.txt
字号:
if (lc($elem) eq "entry") { $foundEntry = 0; }}# Callback function that's fired by the Expat XML parser on parsing# a sequence of characters.sub handleXMLchar { my($parser, $chars) = @_; if ($foundEntry) { $parsedEntries[$#parsedEntries]{lc($curElement)} = $chars; }}# We arrive here when the user first comes to the form. The first step is# to have them get a single-use token.sub showIntroPage { my $redirect_url = 'https://www.google.com/accounts/AuthSubRequest?session=1'; $redirect_url .= '&next='; $redirect_url .= uri_escape(getSelfURI()); $redirect_url .= "&scope="; $redirect_url .= uri_escape("http://www.google.com/base/feeds"); print '<html>' . "\n"; print '<head><title>Perl Demo: Google Base API</title>' . "\n"; print '<link rel="stylesheet" type="text/css" href="../../../css/dev_docs.css">' . "\n"; print '</head>' . "\n"; print '<body><center>' . "\n"; print '<table style="width:50%;">' . "\n"; print '<tr>' . "\n"; print '<th colspan="2" style="text-align:center;">Perl Demo: Google Base API</th>' . "\n"; print '</tr>' . "\n"; print '<tr><td>Before you get started, please <a href="' . $redirect_url . '">sign in</a> to your personal Google Base account.</td></tr>' . "\n"; print '</table>' . "\n"; print '</center></body></html>' . "\n";}# Prints the table of recipes the user has already entered# on the left-hand side of the page.sub showRecipeListPane { my $token = shift; print '<td style="width:50%; text-align:center; vertical-align:top">' . "\n"; print '<table>' . "\n"; print '<tr><th colspan="5" style="text-align:center">Recipes you have added</th></tr>' . "\n"; getItems($token); if (@parsedEntries) { print '<tr>' . "\n"; print '<td style="text-align:center"><i>Name</i></td>' . "\n"; print '<td style="text-align:center"><i>Cuisine</i></td>' . "\n"; print '<td style="text-align:center"><i>Serves</i></td>' . "\n"; print '<td colspan="2" style="text-align:center"><i>Actions</i></td>' . "\n"; print '</tr>' . "\n"; foreach my $entry (@parsedEntries) { print '<tr>' . "\n"; print '<td align="left" valign="top"><b><a href="' . $entry->{'alternate'} . '">' . $entry->{'title'} . '</a></b></td>' . "\n"; print '<td style="text-align:center;vertical-align:top">' . $entry->{'g:cuisine'} . '</td>' . "\n"; print '<td style="text-align:center;vertical-align:top">' . $entry->{'g:serving_count'} . '</td>' . "\n"; # Create an Edit button for each existing recipe. print '<td style="text-align:center;vertical-align:top">' . "\n"; print '<form method="post" action="' . getSelfURI() . '" style="margin-top:0;margin-bottom:0;">' . "\n"; print '<input type="hidden" name="action" value="edit">' . "\n"; print '<input type="hidden" name="session_token" value="' . $token . '">' . "\n"; foreach my $key (keys %{$entry}) { print '<input type="hidden" name="' . $key . '" value="' . $entry->{$key} . '">' . "\n"; } print '<input type="submit" value="Edit">' . "\n"; print '</form>' . "\n"; print '</td>' . "\n"; # Create a Delete button for each existing recipe. print '<td style="text-align:center; vertical-align:top">' . "\n"; print '<form method="post" action="' . getSelfURI() . '" style="margin-top:0;margin-bottom:0;">' . "\n"; print '<input type="hidden" name="action" value="delete">' . "\n"; print '<input type="hidden" name="session_token" value="' . $token . '">' . "\n"; print '<input type="hidden" name="link" value="' . $entry->{'id'} . '">' . "\n"; print '<input type="submit" value="Delete">' . "\n"; print '</form>' . "\n"; print '</td>' . "\n"; print '</tr>' . "\n"; } } else { print '<tr><td colspan="5" style="text-align:center;"><i>(none)</i></td></tr>' . "\n"; } # Create a "Delete all" button to demonstrate batch requests. print '<tr><td colspan="5" style="text-align:center;">' . "\n"; print '<form method="post" action="' . getSelfURI() . '" style="margin-top:0;margin-bottom:0;">' . "\n"; print '<input type="hidden" name="action" value="delete_all">' . "\n"; print '<input type="hidden" name="session_token" value="' . $token . '">' . "\n"; for(my $i = 0; $i < @parsedEntries; $i++) { print '<input type="hidden" name="link_' . $i . '" value="' . $parsedEntries[$i]{'id'} . '">' . "\n"; } print '<input type="submit" value="Delete All"'; if (!@parsedEntries) { print ' disabled="true"'; } print '></form></td></tr>' . "\n"; print '</table>' . "\n"; print '</td>' . "\n";}sub showRecipeInsertPane { my $token = shift; print '<td valign="top" width="50%"><table width="100%">' . "\n"; print '<tr><th colspan="2" style="text-align:center;">Insert a new recipe:</th></tr>' . "\n"; print '<form method="post" action="' . getSelfURI() . '">' . "\n"; print '<input type="hidden" name="action" value="insert">' . "\n"; print '<input type="hidden" name="session_token" value="' . $token . '">' . "\n"; print '<tr><td align="right">Title:</td><td>' . '<input type="text" name="recipe_title" class="half"></td></tr>' . "\n"; print '<tr><td align="right">Main ingredient:</td><td>' . '<input type="text" name="main_ingredient" class="half"></td></tr>' . "\n"; print '<tr><td align="right">Cuisine:</td><td>' . '<select name="cuisine" class="half">' . "\n"; foreach my $curCuisine (@cuisines) { print '<option value=' . $curCuisine . '>' . $curCuisine . "\n"; } print '</select></td></tr>' . "\n"; print '<tr><td align="right">Cooking Time:</td>' . '<td><input type="text" name="cooking_time_val" size=2 maxlength=2>' . ' <select name="cooking_time_units"><option value="minutes">' . 'minutes<option value="hours">hours</select></td></tr>' . "\n"; print '<tr><td align="right">Serves:</td><td><input type="text"' . ' name="serves" size=2 maxlength=3></td></tr>' . "\n"; print '<tr><td align="right">Recipe:</td><td><textarea class="full"' . ' name="recipe_text"></textarea></td></tr>' . "\n"; print '<td> </td><td><input type="submit" value="Submit"></td>' . "\n"; print '</form></tr></table>' . "\n"; print '</td>' . "\n";}sub showEditMenu { my @splitCookingTime = split(/\s+/, param('g:cooking_time')); print '<html>' . "\n"; print '<head><title>Perl Demo: Google Base API</title>' . "\n"; print '<link rel="stylesheet" type="text/css" href="../../../css/dev_docs.css">' . "\n"; print '</head>' . "\n"; print '<body><center>' . "\n"; print '<table style="width:50%;">' . "\n"; print '<tr><th colspan="2" style="text-align:center;">Edit recipe:</th></tr>' . "\n"; print '<form method="post" action="' . getSelfURI() . '">' . "\n"; print '<input type="hidden" name="action" value="update">' . "\n"; print '<input type="hidden" name="link" value="' . param('edit') . '">' . "\n"; print '<input type="hidden" name="session_token" value="' . param('session_token') . '">' . "\n"; print '<tr><td align="right">Title:</td>' . "\n"; print '<td><input type="text" name="recipe_title" class="half" value="' . param('title') . '"></td></tr>' . "\n"; print '<tr><td align="right">Main ingredient:</td>' . "\n"; print '<td><input type="text" name="main_ingredient" value="' . param('g:main_ingredient') . '" class="half"></td></tr>' . "\n"; print '<tr><td align="right">Cuisine:</td>' . "\n"; print '<td><select name="cuisine" class="half">' . "\n"; foreach my $curCuisine (@cuisines) { print '<option value="' . $curCuisine . '"'; if ($curCuisine eq param('g:cuisine')) { print ' selected="selected"'; } print '>' . $curCuisine . "</option>\n"; } print '</select></td></tr>' . "\n"; print '<tr><td align="right">Cooking Time:</td>' . '<td><input type="text" name="time_val" size=2 maxlength=2 value="' . $splitCookingTime[0] . '"> ' . "\n"; print '<select name="time_units">' . "\n"; if ($splitCookingTime[1] eq "minutes") { print '<option value="minutes" selected="selected">minutes</option>' . "\n"; print '<option value="hours">hours</option>' . "\n"; } else { print '<option value="minutes">minutes</option>' . "\n"; print '<option value="hours" selected="selected">hours</option>' . "\n"; } print '</select></td></tr>' . "\n"; print '<tr><td align="right">Serves:</td>' . "\n"; print '<td><input type="text" name="serves" value="' . param('g:serving_count') . '" size=2 maxlength=3></td></tr>' . "\n"; print '<tr><td align="right">Recipe:</td>' . "\n"; print '<td><textarea class="full" name="recipe_text">' . param('content') . '</textarea></td></tr>' . "\n"; print '<td> </td><td><input type="submit" value="Update"></td>' . "\n"; print '</form></tr></table>' . "\n"; print '</body></html>' . "\n";}# Displays both the "List of current recipes" and# "Insert a new recipe" panels in a single table.sub showMainMenu { my($tableTitle, $sessionToken) = @_; print '<html>' . "\n"; print '<head><title>Perl Demo: Google Base API</title>' . "\n"; print '<link rel="stylesheet" type="text/css" href="../../../css/dev_docs.css">' . "\n"; print '</head>' . "\n"; print '<body><center>' . "\n"; print '<table style="width:75%;text-align:center;">' . "\n"; print '<tr>' . "\n"; print '<th colspan="2" style="text-align:center">Perl Demo: Google Base API' . "\n"; print '</tr>' . "\n"; print '<tr><td colspan="2" align="center">' . $tableTitle . '</td></tr>' . "\n"; print '<tr>' . "\n"; # Create the two sub-tables. showRecipeListPane($sessionToken); showRecipeInsertPane($sessionToken); # Add a "Sign out" link. print '<tr><th colspan="2" style="text-align:center;">Or click here to ' . ' <a href="http://www.google.com/accounts/Logout">' . 'sign out</a> of your Google account.</th></tr>' . "\n"; # Close the master table. print '</table>' . "\n"; print '</center></body></html>' . "\n";}# We arrive here after the user first authenticates and we get back# a single-use token.sub showFirstAuthScreen { my $singleUseToken = param('token'); my $sessionToken = exchangeToken($singleUseToken); if (!$sessionToken) { showIntroPage(); } else { my $tableTitle = 'Here\'s your <b>single use token:</b> <code>' . $singleUseToken . '</code>' . "\n" . '<br>And here\'s the <b>session token:</b> <code>' . $sessionToken . '</code>'; showMainMenu($tableTitle, $sessionToken); }}# Main logic. Take action based on the GET and POST# parameters, which reflect whether the user has# authenticated and which action they want to perform.print "Content-type: text/html\n\n";if (defined param('token')) { showFirstAuthScreen();} elsif (defined param('session_token')) { if (param('action') eq "insert") { if (postItem()) { showMainMenu('Recipe inserted!', param('session_token')); } else { showMainMenu('Recipe insertion failed.', param('session_token')); } } elsif (param('action') eq "delete") { if (!deleteItem()) { showMainMenu('Item deleted.', param('session_token')); } else { showMainMenu('Item deletion failed.', param('session_token')); } } elsif (param('action') eq "delete_all") { if (batchDelete()) { showMainMenu('All items deleted.', param('session_token')); } else { showMainMenu('Batch deletion failed.', param('session_token')); } } elsif (param('action') eq "edit") { showEditMenu(); } elsif (param('action') eq "update") { if (updateItem()) { showMainMenu('Item successfully updated.', param('session_token')); } else { showMainMenu('Item update failed.', param('session_token')); } } else { showIntroPage(); }} else { showIntroPage(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -