Merge branch 'main' into issue/42-chats-de-la-ia-en-segundo-plano
This commit is contained in:
@@ -0,0 +1,100 @@
|
|||||||
|
# Writing Supabase Edge Functions
|
||||||
|
|
||||||
|
You're an expert in writing TypeScript and Deno JavaScript runtime. Generate **high-quality Supabase Edge Functions** that adhere to the following best practices:
|
||||||
|
|
||||||
|
## Guidelines
|
||||||
|
|
||||||
|
1. Try to use Web APIs and Deno’s core APIs instead of external dependencies (eg: use fetch instead of Axios, use WebSockets API instead of node-ws)
|
||||||
|
2. If you are reusing utility methods between Edge Functions, add them to `supabase/functions/_shared` and import using a relative path. Do NOT have cross dependencies between Edge Functions.
|
||||||
|
3. Do NOT use bare specifiers when importing dependencies. If you need to use an external dependency, make sure it's prefixed with either `npm:` or `jsr:`. For example, `@supabase/supabase-js` should be written as `npm:@supabase/supabase-js`.
|
||||||
|
4. For external imports, always define a version. For example, `npm:@express` should be written as `npm:express@4.18.2`.
|
||||||
|
5. For external dependencies, importing via `npm:` and `jsr:` is preferred. Minimize the use of imports from @`deno.land/x` , `esm.sh` and @`unpkg.com` . If you have a package from one of those CDNs, you can replace the CDN hostname with `npm:` specifier.
|
||||||
|
6. You can also use Node built-in APIs. You will need to import them using `node:` specifier. For example, to import Node process: `import process from "node:process". Use Node APIs when you find gaps in Deno APIs.
|
||||||
|
7. Do NOT use `import { serve } from "https://deno.land/std@0.168.0/http/server.ts"`. Instead use the built-in `Deno.serve`.
|
||||||
|
8. Following environment variables (ie. secrets) are pre-populated in both local and hosted Supabase environments. Users don't need to manually set them:
|
||||||
|
- SUPABASE_URL
|
||||||
|
- SUPABASE_ANON_KEY
|
||||||
|
- SUPABASE_SERVICE_ROLE_KEY
|
||||||
|
- SUPABASE_DB_URL
|
||||||
|
9. To set other environment variables (ie. secrets) users can put them in a env file and run the `supabase secrets set --env-file path/to/env-file`
|
||||||
|
10. A single Edge Function can handle multiple routes. It is recommended to use a library like Express or Hono to handle the routes as it's easier for developer to understand and maintain. Each route must be prefixed with `/function-name` so they are routed correctly.
|
||||||
|
11. File write operations are ONLY permitted on `/tmp` directory. You can use either Deno or Node File APIs.
|
||||||
|
12. Use `EdgeRuntime.waitUntil(promise)` static method to run long-running tasks in the background without blocking response to a request. Do NOT assume it is available in the request / execution context.
|
||||||
|
|
||||||
|
## Example Templates
|
||||||
|
|
||||||
|
### Simple Hello World Function
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
interface reqPayload {
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.info("server started");
|
||||||
|
|
||||||
|
Deno.serve(async (req: Request) => {
|
||||||
|
const { name }: reqPayload = await req.json();
|
||||||
|
const data = {
|
||||||
|
message: `Hello ${name} from foo!`,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Response(JSON.stringify(data), {
|
||||||
|
headers: { "Content-Type": "application/json", Connection: "keep-alive" },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example Function using Node built-in API
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
import { randomBytes } from "node:crypto";
|
||||||
|
import { createServer } from "node:http";
|
||||||
|
import process from "node:process";
|
||||||
|
|
||||||
|
const generateRandomString = (length) => {
|
||||||
|
const buffer = randomBytes(length);
|
||||||
|
return buffer.toString("hex");
|
||||||
|
};
|
||||||
|
|
||||||
|
const randomString = generateRandomString(10);
|
||||||
|
console.log(randomString);
|
||||||
|
|
||||||
|
const server = createServer((req, res) => {
|
||||||
|
const message = `Hello`;
|
||||||
|
res.end(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(9999);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using npm packages in Functions
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
import express from "npm:express@4.18.2";
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
app.get(/(.*)/, (req, res) => {
|
||||||
|
res.send("Welcome to Supabase");
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(8000);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Generate embeddings using built-in @Supabase.ai API
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
const model = new Supabase.ai.Session("gte-small");
|
||||||
|
|
||||||
|
Deno.serve(async (req: Request) => {
|
||||||
|
const params = new URL(req.url).searchParams;
|
||||||
|
const input = params.get("text");
|
||||||
|
const output = await model.run(input, { mean_pool: true, normalize: true });
|
||||||
|
return new Response(JSON.stringify(output), {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Connection: "keep-alive",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
"allowScripts": [
|
"allowScripts": [
|
||||||
"npm:deno@2.6.4",
|
"npm:deno@2.6.4",
|
||||||
"npm:supabase-js@1.0.4",
|
"npm:supabase-js@1.0.4",
|
||||||
"npm:supabase@2.72.6"
|
"npm:supabase@2.75.0"
|
||||||
],
|
],
|
||||||
"imports": {
|
"imports": {
|
||||||
"@openai/openai": "jsr:@openai/openai@^6.16.0",
|
"@openai/openai": "jsr:@openai/openai@^6.16.0",
|
||||||
|
|||||||
@@ -23,12 +23,13 @@
|
|||||||
"npm:@supabase/supabase-js@^2.90.1": "2.90.1",
|
"npm:@supabase/supabase-js@^2.90.1": "2.90.1",
|
||||||
"npm:@toon-format/toon@^2.1.0": "2.1.0",
|
"npm:@toon-format/toon@^2.1.0": "2.1.0",
|
||||||
"npm:@types/bun@^1.3.5": "1.3.5",
|
"npm:@types/bun@^1.3.5": "1.3.5",
|
||||||
|
"npm:citeproc@^2.4.63": "2.4.63",
|
||||||
"npm:deno@^2.6.4": "2.6.4",
|
"npm:deno@^2.6.4": "2.6.4",
|
||||||
"npm:jwt-decode@4": "4.0.0",
|
"npm:jwt-decode@4": "4.0.0",
|
||||||
"npm:openai@6.16.0": "6.16.0_zod@3.25.76",
|
"npm:openai@6.16.0": "6.16.0_zod@3.25.76",
|
||||||
"npm:openai@^4.52.5": "4.104.0_zod@3.25.76",
|
"npm:openai@^4.52.5": "4.104.0_zod@3.25.76",
|
||||||
"npm:openai@^6.16.0": "6.16.0_zod@3.25.76",
|
"npm:openai@^6.16.0": "6.16.0_zod@3.25.76",
|
||||||
"npm:supabase@^2.72.6": "2.72.6",
|
"npm:supabase@2.75.0": "2.75.0",
|
||||||
"npm:zod@3": "3.25.76"
|
"npm:zod@3": "3.25.76"
|
||||||
},
|
},
|
||||||
"jsr": {
|
"jsr": {
|
||||||
@@ -263,6 +264,9 @@
|
|||||||
"chownr@3.0.0": {
|
"chownr@3.0.0": {
|
||||||
"integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="
|
"integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="
|
||||||
},
|
},
|
||||||
|
"citeproc@2.4.63": {
|
||||||
|
"integrity": "sha512-68F95Bp4UbgZU/DBUGQn0qV3HDZLCdI9+Bb2ByrTaNJDL5VEm9LqaiNaxljsvoaExSLEXe1/r6n2Z06SCzW3/Q=="
|
||||||
|
},
|
||||||
"cmd-shim@8.0.0": {
|
"cmd-shim@8.0.0": {
|
||||||
"integrity": "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="
|
"integrity": "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="
|
||||||
},
|
},
|
||||||
@@ -508,8 +512,8 @@
|
|||||||
"signal-exit@4.1.0": {
|
"signal-exit@4.1.0": {
|
||||||
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
|
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
|
||||||
},
|
},
|
||||||
"supabase@2.72.6": {
|
"supabase@2.75.0": {
|
||||||
"integrity": "sha512-axO1MkZgwMIxj78vKiGosnuXwzOaQq0Kz0I8jheNMwJH9dKGf3q/arivYT44z8u3t5FjGUxQWOuQoJetzcmm/A==",
|
"integrity": "sha512-Xaai8Wp7F03OMkOWSyS1OMMdk5DxkauJxcMMesj4mO6jDGEZpWBwgo/gIUb4hsckexmr/RXYdpDpTbUIMXahbw==",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
"bin-links",
|
"bin-links",
|
||||||
"https-proxy-agent",
|
"https-proxy-agent",
|
||||||
@@ -519,15 +523,16 @@
|
|||||||
"scripts": true,
|
"scripts": true,
|
||||||
"bin": true
|
"bin": true
|
||||||
},
|
},
|
||||||
"tar@7.5.2": {
|
"tar@7.5.7": {
|
||||||
"integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==",
|
"integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
"@isaacs/fs-minipass",
|
"@isaacs/fs-minipass",
|
||||||
"chownr",
|
"chownr",
|
||||||
"minipass",
|
"minipass",
|
||||||
"minizlib",
|
"minizlib",
|
||||||
"yallist"
|
"yallist"
|
||||||
]
|
],
|
||||||
|
"deprecated": true
|
||||||
},
|
},
|
||||||
"tr46@0.0.3": {
|
"tr46@0.0.3": {
|
||||||
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
||||||
@@ -572,6 +577,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"remote": {
|
"remote": {
|
||||||
|
"https://deno.land/std@0.224.0/dotenv/mod.ts": "0180eaeedaaf88647318811cdaa418cc64dc51fb08354f91f5f480d0a1309f7d",
|
||||||
|
"https://deno.land/std@0.224.0/dotenv/parse.ts": "09977ff88dfd1f24f9973a338f0f91bbdb9307eb5ff6085446e7c423e4c7ba0c",
|
||||||
|
"https://deno.land/std@0.224.0/dotenv/stringify.ts": "275da322c409170160440836342eaa7cf012a1d11a7e700d8ca4e7f2f8aa4615",
|
||||||
"https://deno.land/x/zod@v3.22.4/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea",
|
"https://deno.land/x/zod@v3.22.4/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea",
|
||||||
"https://deno.land/x/zod@v3.22.4/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef",
|
"https://deno.land/x/zod@v3.22.4/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef",
|
||||||
"https://deno.land/x/zod@v3.22.4/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe",
|
"https://deno.land/x/zod@v3.22.4/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe",
|
||||||
@@ -600,10 +608,11 @@
|
|||||||
"npm:@supabase/supabase-js@^2.90.1",
|
"npm:@supabase/supabase-js@^2.90.1",
|
||||||
"npm:@toon-format/toon@^2.1.0",
|
"npm:@toon-format/toon@^2.1.0",
|
||||||
"npm:@types/bun@^1.3.5",
|
"npm:@types/bun@^1.3.5",
|
||||||
|
"npm:citeproc@^2.4.63",
|
||||||
"npm:deno@^2.6.4",
|
"npm:deno@^2.6.4",
|
||||||
"npm:jwt-decode@4",
|
"npm:jwt-decode@4",
|
||||||
"npm:openai@^6.16.0",
|
"npm:openai@^6.16.0",
|
||||||
"npm:supabase@^2.72.6"
|
"npm:supabase@2.75.0"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2273
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -38,14 +38,722 @@
|
|||||||
"execution_count": 2,
|
"execution_count": 2,
|
||||||
"id": "89b3fffb",
|
"id": "89b3fffb",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"url http://host.docker.internal:54321\n",
|
||||||
|
"anon eyJhbGciOiJFUzI1NiIsImtpZCI6ImI4MTI2OWYxLTIxZDgtNGYyZS1iNzE5LWMyMjQwYTg0MGQ5MCIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjIwODQ0NjczNTB9.m2CCND9Ei3-snNczQomvXfCAAchI1S-csdv1pz0r_U5ONS329AYHf4Ihcxi7lPySk13c3UV2J7xbVe4CDtFCzA\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
|
"import {\n",
|
||||||
|
" FunctionsFetchError,\n",
|
||||||
|
" FunctionsHttpError,\n",
|
||||||
|
" FunctionsRelayError,\n",
|
||||||
|
"} from \"@supabase/supabase-js\";\n",
|
||||||
"import { createClient } from \"@supabase/supabase-js\";\n",
|
"import { createClient } from \"@supabase/supabase-js\";\n",
|
||||||
"const supabaseUrl = Deno.env.get(\"SUPABASE_URL\") || env.SUPABASE_URL;\n",
|
"console.log(\"url\", Deno.env.get(\"SUPABASE_URL\"));\n",
|
||||||
"const supabaseKey = Deno.env.get(\"SUPABASE_ANON_KEY\") || env.SUPABASE_ANON_KEY;\n",
|
"console.log(\"anon\", Deno.env.get(\"SUPABASE_ANON_KEY\"));\n",
|
||||||
|
"const supabaseUrl = Deno.env.get(\"SUPABASE_URL\");\n",
|
||||||
|
"const supabaseKey = Deno.env.get(\"SUPABASE_ANON_KEY\");\n",
|
||||||
"const supabase = createClient(supabaseUrl, supabaseKey);\n"
|
"const supabase = createClient(supabaseUrl, supabaseKey);\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 3,
|
||||||
|
"id": "5e7f628e",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"EX2LNkSqViUC\",\n",
|
||||||
|
" etag: \"a5FKnhILr0U\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/EX2LNkSqViUC\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"CUDA Programming\",\n",
|
||||||
|
" subtitle: \"A Developer's Guide to Parallel Computing with GPUs\",\n",
|
||||||
|
" authors: [ \"Shane Cook\" ],\n",
|
||||||
|
" publisher: \"Newnes\",\n",
|
||||||
|
" publishedDate: \"2012-12-28\",\n",
|
||||||
|
" description: \"If you need to learn CUDA but don't have experience with parallel computing, CUDA Programming: A Developer's Introduction offers a detailed guide to CUDA with a grounding in parallel fundamentals. It starts by introducing CUDA and bringing you up to speed on GPU parallelism and hardware, then delving into CUDA installation. Chapters on core concepts including threads, blocks, grids, and memory focus on both parallel and CUDA-specific issues. Later, the book demonstrates CUDA in practice for optimizing applications, adjusting to new hardware, and solving common problems. - Comprehensive introduction to parallel programming with CUDA, for readers new to both - Detailed instructions help readers optimize the CUDA software development kit - Practical techniques illustrate working with memory, threads, algorithms, resources, and more - Covers CUDA on multiple hardware platforms: Mac, Linux and Windows with several NVIDIA chipsets - Each chapter includes exercises to test reader knowledge\",\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9780124159884\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"0124159885\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: true, image: true },\n",
|
||||||
|
" pageCount: 591,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" averageRating: 1,\n",
|
||||||
|
" ratingsCount: 1,\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: true,\n",
|
||||||
|
" contentVersion: \"1.5.5.0.preview.3\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=EX2LNkSqViUC&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=EX2LNkSqViUC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=EX2LNkSqViUC&printsec=frontcover&dq=CUDA+Programming&hl=&cd=1&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=EX2LNkSqViUC&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=EX2LNkSqViUC\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 664, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 664, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=EX2LNkSqViUC&rdid=book-EX2LNkSqViUC&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/CUDA_Programming-sample-epub.acsm?id=EX2LNkSqViUC&format=epub&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" pdf: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/CUDA_Programming-sample-pdf.acsm?id=EX2LNkSqViUC&format=pdf&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=EX2LNkSqViUC&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"Later, the book demonstrates CUDA in practice for optimizing applications, adjusting to new hardware, and solving common problems.\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"BkAyEAAAQBAJ\",\n",
|
||||||
|
" etag: \"ZPDBktuk3rY\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/BkAyEAAAQBAJ\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"Multicore and GPU Programming\",\n",
|
||||||
|
" subtitle: \"An Integrated Approach\",\n",
|
||||||
|
" authors: [ \"Gerassimos Barlas\" ],\n",
|
||||||
|
" publisher: \"Morgan Kaufmann\",\n",
|
||||||
|
" publishedDate: \"2022-02-09\",\n",
|
||||||
|
" description: `Multicore and GPU Programming: An Integrated Approach, Second Edition offers broad coverage of key parallel computing tools, essential for multi-core CPU programming and many-core \"massively parallel\" computing. Using threads, OpenMP, MPI, CUDA and other state-of-the-art tools, the book teaches the design and development of software capable of taking advantage of modern computing platforms that incorporate CPUs, GPUs and other accelerators. Presenting material refined over more than two decades of teaching parallel computing, author Gerassimos Barlas minimizes the challenge of transitioning from sequential programming to mastering parallel platforms with multiple examples, extensive case studies, and full source code. By using this book, readers will better understand how to develop programs that run over distributed memory machines using MPI, create multi-threaded applications with either libraries or directives, write optimized applications that balance the workload between available computing resources, and profile and debug programs targeting parallel machines. - Includes comprehensive coverage of all major multi-core and many-core programming tools and platforms, including threads, OpenMP, MPI, CUDA, OpenCL and Thrust - Covers the most recent versions of the above at the time of publication - Demonstrates parallel programming design patterns and examples of how different tools and paradigms can be integrated for superior performance - Updates in the second edition include the use of the C++17 standard for all sample code, a new chapter on concurrent data structures, a new chapter on OpenCL, and the latest research on load balancing - Includes downloadable source code, examples and instructor support materials on the book's companion website`,\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9780128141212\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"0128141212\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: true, image: true },\n",
|
||||||
|
" pageCount: 1026,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: false,\n",
|
||||||
|
" contentVersion: \"2.5.5.0.preview.3\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=BkAyEAAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=BkAyEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=BkAyEAAAQBAJ&pg=PA392&dq=CUDA+Programming&hl=&cd=2&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=BkAyEAAAQBAJ&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=BkAyEAAAQBAJ\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 1170, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 1170, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=BkAyEAAAQBAJ&rdid=book-BkAyEAAAQBAJ&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Multicore_and_GPU_Programming-sample-epub.acsm?id=BkAyEAAAQBAJ&format=epub&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" pdf: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Multicore_and_GPU_Programming-sample-pdf.acsm?id=BkAyEAAAQBAJ&format=pdf&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=BkAyEAAAQBAJ&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"... programming. Since the OpenMP 4.0 specification published in 2013, it can also target GPUs. OpenMP is covered in Chapter 8. • OpenACC: An open ... <b>GPU programming</b>: CUDA 6.2 <b>CUDA's programming</b> model: threads, blocks, and grids.\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"hI14CgAAQBAJ\",\n",
|
||||||
|
" etag: \"qO57zyAywhQ\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/hI14CgAAQBAJ\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"GPU Programming in MATLAB\",\n",
|
||||||
|
" authors: [ \"Nikolaos Ploskas\", \"Nikolaos Samaras\" ],\n",
|
||||||
|
" publisher: \"Morgan Kaufmann\",\n",
|
||||||
|
" publishedDate: \"2016-08-25\",\n",
|
||||||
|
" description: \"GPU programming in MATLAB is intended for scientists, engineers, or students who develop or maintain applications in MATLAB and would like to accelerate their codes using GPU programming without losing the many benefits of MATLAB. The book starts with coverage of the Parallel Computing Toolbox and other MATLAB toolboxes for GPU computing, which allow applications to be ported straightforwardly onto GPUs without extensive knowledge of GPU programming. The next part covers built-in, GPU-enabled features of MATLAB, including options to leverage GPUs across multicore or different computer systems. Finally, advanced material includes CUDA code in MATLAB and optimizing existing GPU applications. Throughout the book, examples and source codes illustrate every concept so that readers can immediately apply them to their own development. - Provides in-depth, comprehensive coverage of GPUs with MATLAB, including the parallel computing toolbox and built-in features for other MATLAB toolboxes - Explains how to accelerate computationally heavy applications in MATLAB without the need to re-write them in another language - Presents case studies illustrating key concepts across multiple fields - Includes source code, sample datasets, and lecture slides\",\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9780128051337\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"0128051337\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: true, image: true },\n",
|
||||||
|
" pageCount: 320,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: false,\n",
|
||||||
|
" contentVersion: \"1.3.3.0.preview.3\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=hI14CgAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=hI14CgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=hI14CgAAQBAJ&pg=PA199&dq=CUDA+Programming&hl=&cd=3&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=hI14CgAAQBAJ&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=hI14CgAAQBAJ\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 797, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 797, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=hI14CgAAQBAJ&rdid=book-hI14CgAAQBAJ&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/GPU_Programming_in_MATLAB-sample-epub.acsm?id=hI14CgAAQBAJ&format=epub&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" pdf: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/GPU_Programming_in_MATLAB-sample-pdf.acsm?id=hI14CgAAQBAJ&format=pdf&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=hI14CgAAQBAJ&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"Nikolaos Ploskas, Nikolaos Samaras. Run. <b>CUDA</b>. or. PTX. code. CHAPTER. 7. CHAPTER. OBJECTIVES. This Chapter explains how to create an executable kernel for a <b>CUDA</b> C code or PTX code and run that kernel on a <b>GPU</b> by calling it through MATLAB ...\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"PHS1wwEACAAJ\",\n",
|
||||||
|
" etag: \"uAvN2b0VfsA\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/PHS1wwEACAAJ\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"Hands-On GPU Programming with CUDA\",\n",
|
||||||
|
" authors: [ \"Jaegeun Han\", \"Bharatkumar Sharma\" ],\n",
|
||||||
|
" publishedDate: \"2019-09-27\",\n",
|
||||||
|
" description: \"Explore different GPU programming methods using libraries and directives, such as OpenACC, with extension to languages such as C, C++, and Python Key Features Learn parallel programming principles and practices and performance analysis in GPU computing Get to grips with distributed multi GPU programming and other approaches to GPU programming Understand how GPU acceleration in deep learning models can improve their performance Book Description Compute Unified Device Architecture (CUDA) is NVIDIA's GPU computing platform and application programming interface. It's designed to work with programming languages such as C, C++, and Python. With CUDA, you can leverage a GPU's parallel computing power for a range of high-performance computing applications in the fields of science, healthcare, and deep learning. Learn CUDA Programming will help you learn GPU parallel programming and understand its modern applications. In this book, you'll discover CUDA programming approaches for modern GPU architectures. You'll not only be guided through GPU features, tools, and APIs, you'll also learn how to analyze performance with sample parallel programming algorithms. This book will help you optimize the performance of your apps by giving insights into CUDA programming platforms with various libraries, compiler directives (OpenACC), and other languages. As you progress, you'll learn how additional computing power can be generated using multiple GPUs in a box or in multiple boxes. Finally, you'll explore how CUDA accelerates deep learning algorithms, including convolutional neural networks (CNNs) and recurrent neural networks (RNNs). By the end of this CUDA book, you'll be equipped with the skills you need to integrate the power of GPU computing in your applications. What you will learn Understand general GPU operations and programming patterns in CUDA Uncover the difference between GPU programming and CPU programming Analyze GPU application performance and implement optimization strategies Explore GPU programming, profiling, and debugging tools Grasp parallel programming algorithms and how to implement them Scale GPU-accelerated applications with multi-GPU and multi-nodes Delve into GPU programming platforms with accelerated libraries, Python, and OpenACC Gain insights into deep learning accelerators in CNNs and RNNs using GPUs Who this book is for This beginner-level book is for programmers who want to delve into parallel computing, become part of the high-performance computing community and build modern applications. Basic C and C++ programming experience is assumed. For deep learning enthusiasts, this book covers Python InterOps, DL libraries, and practical examples on performance estimation.\",\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"1788996240\" },\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9781788996242\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: false, image: false },\n",
|
||||||
|
" pageCount: 508,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: false,\n",
|
||||||
|
" contentVersion: \"preview-1.0.0\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=PHS1wwEACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=PHS1wwEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=PHS1wwEACAAJ&dq=CUDA+Programming&hl=&cd=4&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"http://books.google.com.mx/books?id=PHS1wwEACAAJ&dq=CUDA+Programming&hl=&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://books.google.com/books/about/Hands_On_GPU_Programming_with_CUDA.html?hl=&id=PHS1wwEACAAJ\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: { country: \"MX\", saleability: \"NOT_FOR_SALE\", isEbook: false },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"NO_PAGES\",\n",
|
||||||
|
" embeddable: false,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: { isAvailable: false },\n",
|
||||||
|
" pdf: { isAvailable: false },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=PHS1wwEACAAJ&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"NONE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"Learn CUDA Programming will help you learn GPU parallel programming and understand its modern applications. In this book, you'll discover CUDA programming approaches for modern GPU architectures.\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"3b63x-0P3_UC\",\n",
|
||||||
|
" etag: \"t61uTD2OgFc\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/3b63x-0P3_UC\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"Computer Organization and Design\",\n",
|
||||||
|
" subtitle: \"The Hardware/Software Interface\",\n",
|
||||||
|
" authors: [ \"David A. Patterson\", \"John L. Hennessy\" ],\n",
|
||||||
|
" publisher: \"Morgan Kaufmann\",\n",
|
||||||
|
" publishedDate: \"2008-11-17\",\n",
|
||||||
|
" description: \"Computer Organization and Design, Fourth Edition, provides a new focus on the revolutionary change taking place in industry today: the switch from uniprocessor to multicore microprocessors. This new emphasis on parallelism is supported by updates reflecting the newest technologies with examples highlighting the latest processor designs, benchmarking standards, languages and tools. As with previous editions, a MIPS processor is the core used to present the fundamentals of hardware technologies, assembly language, computer arithmetic, pipelining, memory hierarchies and I/O. Along with its increased coverage of parallelism, this new edition offers new content on Flash memory and virtual machines as well as a new and important appendix written by industry experts covering the emergence and importance of the modern GPU (graphics processing unit), the highly parallel, highly multithreaded multiprocessor optimized for visual computing. This book contains a new exercise paradigm that allows instructors to reconfigure the 600 exercises included in the book to generate new exercises and solutions of their own. The companion CD provides a toolkit of simulators and compilers along with tutorials for using them as well as advanced content for further study and a search utility for finding content on the CD and in the printed text. This text is designed for professional digital system designers, programmers, application developers, and system software developers as well as undergraduate students in Computer Science, Computer Engineering and Electrical Engineering courses in Computer Organization, Computer Design. A new exercise paradigm allows instructors to reconfigure the 600 exercises included in the book to easily generate new exercises and solutions of their own. The companion CD provides a toolkit of simulators and compilers along with tutorials for using them, as well as advanced content for further study and a search utility for finding content on the CD and in the printed text. For the convenience of readers who have purchased an ebook edition or who may have misplaced the CD-ROM, all CD content is available as a download at http://bit.ly/12XinUx.\",\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9780080922812\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"0080922813\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: false, image: true },\n",
|
||||||
|
" pageCount: 913,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" averageRating: 3.5,\n",
|
||||||
|
" ratingsCount: 4,\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: true,\n",
|
||||||
|
" contentVersion: \"2.3.1.0.preview.1\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=3b63x-0P3_UC&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=3b63x-0P3_UC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=3b63x-0P3_UC&pg=SL1-PA17&dq=CUDA+Programming&hl=&cd=5&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=3b63x-0P3_UC&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=3b63x-0P3_UC\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 1196, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 1196, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=3b63x-0P3_UC&rdid=book-3b63x-0P3_UC&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: { isAvailable: false },\n",
|
||||||
|
" pdf: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Computer_Organization_and_Design-sample-pdf.acsm?id=3b63x-0P3_UC&format=pdf&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=3b63x-0P3_UC&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"... <b>CUDA programming</b> model has provided a far easier way to exploit the scalable high-performance floating-point and memory bandwidth of GPUs with the C programming language. Programming Parallel Computing Applications CUDA, Brook, and CAL ...\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"Jgx_BAAAQBAJ\",\n",
|
||||||
|
" etag: \"X/opG42tNjY\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/Jgx_BAAAQBAJ\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"Professional CUDA C Programming\",\n",
|
||||||
|
" authors: [ \"John Cheng\", \"Max Grossman\", \"Ty McKercher\" ],\n",
|
||||||
|
" publisher: \"John Wiley & Sons\",\n",
|
||||||
|
" publishedDate: \"2014-09-08\",\n",
|
||||||
|
" description: 'Break into the powerful world of parallel GPU programming with this down-to-earth, practical guide Designed for professionals across multiple industrial sectors, Professional CUDA C Programming presents CUDA -- a parallel computing platform and programming model designed to ease the development of GPU programming -- fundamentals in an easy-to-follow format, and teaches readers how to think in parallel and implement parallel algorithms on GPUs. Each chapter covers a specific topic, and includes workable examples that demonstrate the development process, allowing readers to explore both the \"hard\" and \"soft\" aspects of GPU programming. Computing architectures are experiencing a fundamental shift toward scalable parallel computing motivated by application requirements in industry and science. This book demonstrates the challenges of efficiently utilizing compute resources at peak performance, presents modern techniques for tackling these challenges, while increasing accessibility for professionals who are not necessarily parallel programming experts. The CUDA programming model and tools empower developers to write high-performance applications on a scalable, parallel computing platform: the GPU. However, CUDA itself can be difficult to learn without extensive programming experience. Recognized CUDA authorities John Cheng, Max Grossman, and Ty McKercher guide readers through essential GPU programming skills and best practices in Professional CUDA C Programming, including: CUDA Programming Model GPU Execution Model GPU Memory model Streams, Event and Concurrency Multi-GPU Programming CUDA Domain-Specific Libraries Profiling and Performance Tuning The book makes complex CUDA concepts easy to understand for anyone with knowledge of basic software development with exercises designed to be both readable and high-performance. For the professional seeking entrance to parallel computing and the high-performance computing community, Professional CUDA C Programming is an invaluable resource, with the most current information available on the market.',\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9781118739310\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"1118739310\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: true, image: true },\n",
|
||||||
|
" pageCount: 528,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: true,\n",
|
||||||
|
" contentVersion: \"1.14.9.0.preview.3\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=Jgx_BAAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=Jgx_BAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=Jgx_BAAAQBAJ&printsec=frontcover&dq=CUDA+Programming&hl=&cd=6&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=Jgx_BAAAQBAJ&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=Jgx_BAAAQBAJ\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 639, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 639, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=Jgx_BAAAQBAJ&rdid=book-Jgx_BAAAQBAJ&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Professional_CUDA_C_Programming-sample-epub.acsm?id=Jgx_BAAAQBAJ&format=epub&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" pdf: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Professional_CUDA_C_Programming-sample-pdf.acsm?id=Jgx_BAAAQBAJ&format=pdf&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=Jgx_BAAAQBAJ&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"Professional CUDA C Programming: Focuses on GPU programming skills and best practices that deliver outstanding performance Shows you how to think in parallel Turns complex subjects into easy-to-understand concepts Makes information ...\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"c-64EQAAQBAJ\",\n",
|
||||||
|
" etag: \"CVz3HI8ANnw\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/c-64EQAAQBAJ\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"Learning CUDA Programming with Modern C++\",\n",
|
||||||
|
" subtitle: \"A Hands-On Guide to Building High-Performance, GPU-Accelerated Applications\",\n",
|
||||||
|
" authors: [ \"CORWAN MARR\" ],\n",
|
||||||
|
" publisher: \"Oladosun Mopelola Opeyemi\",\n",
|
||||||
|
" publishedDate: \"2026-01-28\",\n",
|
||||||
|
" description: 'Are you ready to harness the full power of your computer’s graphics card? Do you want to accelerate your applications and enhance your programming skills with GPU computing? In \"Learning CUDA Programming with Modern C++,\" you’ll learn how to leverage the power of NVIDIA GPUs to create high-performance, GPU-accelerated applications. Whether you’re a C++ developer, a beginner programmer, or someone looking to boost your skills, this book provides a clear, practical guide to writing efficient GPU code. What you’ll learn: l Hands-on techniques: Build real-world projects that teach you how to write and optimize CUDA code for modern GPUs. l Understand CUDA programming: Learn about GPU architecture, memory management, and how to organize threads efficiently with Modern C++. l Maximize performance: Gain insight into profiling, debugging, and optimizing code for faster execution. l Complete projects: From image processing pipelines to Monte Carlo simulations, the projects in this book help you apply what you’ve learned in practical ways. This book is designed to help you write powerful, maintainable code that runs on GPUs, offering you the skills needed to tackle complex problems and build applications that perform at scale. Don’t just read about high-performance programming — start writing your own GPU-accelerated applications today. Buy your copy now and begin mastering CUDA programming!',\n",
|
||||||
|
" readingModes: { text: true, image: true },\n",
|
||||||
|
" pageCount: 244,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: false,\n",
|
||||||
|
" contentVersion: \"2.3.3.0.preview.3\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=c-64EQAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=c-64EQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=c-64EQAAQBAJ&printsec=frontcover&dq=CUDA+Programming&hl=&cd=7&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=c-64EQAAQBAJ&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=c-64EQAAQBAJ\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 109, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 109, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=c-64EQAAQBAJ&rdid=book-c-64EQAAQBAJ&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Learning_CUDA_Programming_with_Modern_C+-sample-epub.acsm?id=c-64EQAAQBAJ&format=epub&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" pdf: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Learning_CUDA_Programming_with_Modern_C+-sample-pdf.acsm?id=c-64EQAAQBAJ&format=pdf&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=c-64EQAAQBAJ&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"This book is designed to help you write powerful, maintainable code that runs on GPUs, offering you the skills needed to tackle complex problems and build applications that perform at scale.\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"WWMNAAAAQBAJ\",\n",
|
||||||
|
" etag: \"JpA5i0aBAWk\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/WWMNAAAAQBAJ\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"Proceedings of 2013 Chinese Intelligent Automation Conference\",\n",
|
||||||
|
" subtitle: \"Intelligent Automation & Intelligent Technology and Systems\",\n",
|
||||||
|
" authors: [ \"Zengqi Sun\", \"Zhidong Deng\" ],\n",
|
||||||
|
" publisher: \"Springer Science & Business Media\",\n",
|
||||||
|
" publishedDate: \"2013-07-10\",\n",
|
||||||
|
" description: \"Proceedings of the 2013 Chinese Intelligent Automation Conference presents selected research papers from the CIAC’13, held in Yangzhou, China. The topics include e.g. adaptive control, fuzzy control, neural network based control, knowledge based control, hybrid intelligent control, learning control, evolutionary mechanism based control, multi-sensor integration, failure diagnosis, and reconfigurable control. Engineers and researchers from academia, industry, and government can gain an inside view of new solutions combining ideas from multiple disciplines in the field of intelligent automation. Zengqi Sun and Zhidong Deng are professors at the Department of Computer Science, Tsinghua University, China.\",\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9783642384608\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"3642384609\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: true, image: true },\n",
|
||||||
|
" pageCount: 840,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Technology & Engineering\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: false,\n",
|
||||||
|
" contentVersion: \"1.12.10.0.preview.3\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=WWMNAAAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=WWMNAAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=WWMNAAAAQBAJ&pg=PA253&dq=CUDA+Programming&hl=&cd=8&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=WWMNAAAAQBAJ&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=WWMNAAAAQBAJ\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 4229.91, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 4229.91, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=WWMNAAAAQBAJ&rdid=book-WWMNAAAAQBAJ&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Proceedings_of_2013_Chinese_Intelligent-sample-epub.acsm?id=WWMNAAAAQBAJ&format=epub&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" pdf: {\n",
|
||||||
|
" isAvailable: true,\n",
|
||||||
|
" acsTokenLink: \"http://books.google.com.mx/books/download/Proceedings_of_2013_Chinese_Intelligent-sample-pdf.acsm?id=WWMNAAAAQBAJ&format=pdf&output=acs4_fulfillment_token&dl_type=sample&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=WWMNAAAAQBAJ&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"... CUDA Main Memory CPU • Copy data • Copy result Memory for GPU • Instruct the processing • GPU:Execute parallel in each core code that runs on the GPU (usually ... <b>CUDA Programming</b> in Mathematica 28.4...<b>CUDA Programming</b> in MATLAB.\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"KUxsAQAAQBAJ\",\n",
|
||||||
|
" etag: \"64FtqjyzOz8\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/KUxsAQAAQBAJ\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"The CUDA Handbook\",\n",
|
||||||
|
" subtitle: \"A Comprehensive Guide to GPU Programming\",\n",
|
||||||
|
" authors: [ \"Nicholas Wilt\" ],\n",
|
||||||
|
" publisher: \"Pearson Education\",\n",
|
||||||
|
" publishedDate: \"2013\",\n",
|
||||||
|
" description: \"'The CUDA Handbook' begins where 'CUDA by Example' leaves off, discussing both CUDA hardware and software in detail that will engage any CUDA developer, from the casual to the most hardcore. Newer CUDA developers will see how the hardware processes commands and the driver checks progress; hardcore CUDA developers will appreciate topics such as the driver API, context migration, and how best to structure CPU/GPU data interchange and synchronization. The book is partly a reference resource and partly a cookbook.\",\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9780321809469\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"0321809467\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: false, image: false },\n",
|
||||||
|
" pageCount: 526,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: false,\n",
|
||||||
|
" contentVersion: \"0.2.2.0.preview.0\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=KUxsAQAAQBAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=KUxsAQAAQBAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=KUxsAQAAQBAJ&dq=CUDA+Programming&hl=&cd=9&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"http://books.google.com.mx/books?id=KUxsAQAAQBAJ&dq=CUDA+Programming&hl=&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://books.google.com/books/about/The_CUDA_Handbook.html?hl=&id=KUxsAQAAQBAJ\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: { country: \"MX\", saleability: \"NOT_FOR_SALE\", isEbook: false },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"NO_PAGES\",\n",
|
||||||
|
" embeddable: false,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED\",\n",
|
||||||
|
" epub: { isAvailable: false },\n",
|
||||||
|
" pdf: { isAvailable: true },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=KUxsAQAAQBAJ&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"NONE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"'The CUDA Handbook' begins where 'CUDA by Example' leaves off, discussing both CUDA hardware and software in detail that will engage any CUDA developer, from the casual to the most hardcore.\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" kind: \"books#volume\",\n",
|
||||||
|
" id: \"49OmnOmTEtQC\",\n",
|
||||||
|
" etag: \"PkMJKeDmDrU\",\n",
|
||||||
|
" selfLink: \"https://www.googleapis.com/books/v1/volumes/49OmnOmTEtQC\",\n",
|
||||||
|
" volumeInfo: {\n",
|
||||||
|
" title: \"CUDA by Example\",\n",
|
||||||
|
" subtitle: \"An Introduction to General-Purpose GPU Programming\",\n",
|
||||||
|
" authors: [ \"Jason Sanders\", \"Edward Kandrot\" ],\n",
|
||||||
|
" publisher: \"Addison-Wesley Professional\",\n",
|
||||||
|
" publishedDate: \"2010-07-19\",\n",
|
||||||
|
" description: \"CUDA is a computing architecture designed to facilitate the development of parallel programs. In conjunction with a comprehensive software platform, the CUDA Architecture enables programmers to draw on the immense power of graphics processing units (GPUs) when building high-performance applications. GPUs, of course, have long been available for demanding graphics and game applications. CUDA now brings this valuable resource to programmers working on applications in other domains, including science, engineering, and finance. No knowledge of graphics programming is required—just the ability to program in a modestly extended version of C. CUDA by Example, written by two senior members of the CUDA software platform team, shows programmers how to employ this new technology. The authors introduce each area of CUDA development through working examples. After a concise introduction to the CUDA platform and architecture, as well as a quick-start guide to CUDA C, the book details the techniques and trade-offs associated with each key CUDA feature. You’ll discover when to use each CUDA C extension and how to write CUDA software that delivers truly outstanding performance. Major topics covered include Parallel programming Thread cooperation Constant memory and events Texture memory Graphics interoperability Atomics Streams CUDA C on multiple GPUs Advanced atomics Additional CUDA resources All the CUDA software tools you’ll need are freely available for download from NVIDIA. http://developer.nvidia.com/object/cuda-by-example.html\",\n",
|
||||||
|
" industryIdentifiers: [\n",
|
||||||
|
" { type: \"ISBN_13\", identifier: \"9780132180139\" },\n",
|
||||||
|
" { type: \"ISBN_10\", identifier: \"0132180138\" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" readingModes: { text: true, image: true },\n",
|
||||||
|
" pageCount: 524,\n",
|
||||||
|
" printType: \"BOOK\",\n",
|
||||||
|
" categories: [ \"Computers\" ],\n",
|
||||||
|
" maturityRating: \"NOT_MATURE\",\n",
|
||||||
|
" allowAnonLogging: true,\n",
|
||||||
|
" contentVersion: \"1.13.10.0.preview.3\",\n",
|
||||||
|
" panelizationSummary: { containsEpubBubbles: false, containsImageBubbles: false },\n",
|
||||||
|
" imageLinks: {\n",
|
||||||
|
" smallThumbnail: \"http://books.google.com/books/content?id=49OmnOmTEtQC&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api\",\n",
|
||||||
|
" thumbnail: \"http://books.google.com/books/content?id=49OmnOmTEtQC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api\"\n",
|
||||||
|
" },\n",
|
||||||
|
" language: \"en\",\n",
|
||||||
|
" previewLink: \"http://books.google.com.mx/books?id=49OmnOmTEtQC&printsec=frontcover&dq=CUDA+Programming&hl=&cd=10&source=gbs_api\",\n",
|
||||||
|
" infoLink: \"https://play.google.com/store/books/details?id=49OmnOmTEtQC&source=gbs_api\",\n",
|
||||||
|
" canonicalVolumeLink: \"https://play.google.com/store/books/details?id=49OmnOmTEtQC\"\n",
|
||||||
|
" },\n",
|
||||||
|
" saleInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" saleability: \"FOR_SALE\",\n",
|
||||||
|
" isEbook: true,\n",
|
||||||
|
" listPrice: { amount: 567.79, currencyCode: \"MXN\" },\n",
|
||||||
|
" retailPrice: { amount: 567.79, currencyCode: \"MXN\" },\n",
|
||||||
|
" buyLink: \"https://play.google.com/store/books/details?id=49OmnOmTEtQC&rdid=book-49OmnOmTEtQC&rdot=1&source=gbs_api\",\n",
|
||||||
|
" offers: [\n",
|
||||||
|
" {\n",
|
||||||
|
" finskyOfferType: 1,\n",
|
||||||
|
" listPrice: [Object],\n",
|
||||||
|
" retailPrice: [Object],\n",
|
||||||
|
" giftable: true\n",
|
||||||
|
" }\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" accessInfo: {\n",
|
||||||
|
" country: \"MX\",\n",
|
||||||
|
" viewability: \"PARTIAL\",\n",
|
||||||
|
" embeddable: true,\n",
|
||||||
|
" publicDomain: false,\n",
|
||||||
|
" textToSpeechPermission: \"ALLOWED_FOR_ACCESSIBILITY\",\n",
|
||||||
|
" epub: { isAvailable: false },\n",
|
||||||
|
" pdf: { isAvailable: false },\n",
|
||||||
|
" webReaderLink: \"http://play.google.com/books/reader?id=49OmnOmTEtQC&hl=&source=gbs_api\",\n",
|
||||||
|
" accessViewStatus: \"SAMPLE\",\n",
|
||||||
|
" quoteSharingAllowed: false\n",
|
||||||
|
" },\n",
|
||||||
|
" searchInfo: {\n",
|
||||||
|
" textSnippet: \"After a concise introduction to the CUDA platform and architecture, as well as a quick-start guide to CUDA C, the book details the techniques and trade-offs associated with each key CUDA feature.\"\n",
|
||||||
|
" }\n",
|
||||||
|
" }\n",
|
||||||
|
"]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"const { data, error } = await supabase.functions.invoke(\"buscar-bibliografia\", {\n",
|
||||||
|
" body: {\n",
|
||||||
|
" searchTerms: {\n",
|
||||||
|
" q: \"CUDA Programming\",\n",
|
||||||
|
" maxResults: 10,\n",
|
||||||
|
" orderBy: \"relevance\", // opcional: \"newest\" | \"relevance\"\n",
|
||||||
|
" },\n",
|
||||||
|
" },\n",
|
||||||
|
"});\n",
|
||||||
|
"\n",
|
||||||
|
"if (error instanceof FunctionsHttpError) {\n",
|
||||||
|
" const errorMessage = await error.context.json();\n",
|
||||||
|
" console.log(\"Function returned an error\", errorMessage);\n",
|
||||||
|
"} else if (error instanceof FunctionsRelayError) {\n",
|
||||||
|
" console.log(\"Relay error:\", error.message);\n",
|
||||||
|
"} else if (error instanceof FunctionsFetchError) {\n",
|
||||||
|
" console.log(\"Fetch error:\", error.message);\n",
|
||||||
|
"}\n",
|
||||||
|
"console.log(data); // array de volumes (items[])\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 3,
|
"execution_count": 3,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,519 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="sort-only">
|
||||||
|
<info>
|
||||||
|
<title>IEEE Reference Guide version 11.29.2023</title>
|
||||||
|
<title-short>Institute of Electrical and Electronics Engineers</title-short>
|
||||||
|
<id>http://www.zotero.org/styles/ieee</id>
|
||||||
|
<link href="http://www.zotero.org/styles/ieee" rel="self"/>
|
||||||
|
<link href="https://journals.ieeeauthorcenter.ieee.org/your-role-in-article-production/ieee-editorial-style-manual/" rel="documentation"/>
|
||||||
|
<author>
|
||||||
|
<name>Michael Berkowitz</name>
|
||||||
|
<email>mberkowi@gmu.edu</email>
|
||||||
|
</author>
|
||||||
|
<contributor>
|
||||||
|
<name>Julian Onions</name>
|
||||||
|
<email>julian.onions@gmail.com</email>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Rintze Zelle</name>
|
||||||
|
<uri>http://twitter.com/rintzezelle</uri>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Stephen Frank</name>
|
||||||
|
<uri>http://www.zotero.org/sfrank</uri>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Sebastian Karcher</name>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Giuseppe Silano</name>
|
||||||
|
<email>g.silano89@gmail.com</email>
|
||||||
|
<uri>http://giuseppesilano.net</uri>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Patrick O'Brien</name>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Brenton M. Wiernik</name>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Oliver Couch</name>
|
||||||
|
<email>oliver.couch@gmail.com</email>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Andrew Dunning</name>
|
||||||
|
<uri>https://orcid.org/0000-0003-0464-5036</uri>
|
||||||
|
</contributor>
|
||||||
|
<category citation-format="numeric"/>
|
||||||
|
<category field="engineering"/>
|
||||||
|
<category field="generic-base"/>
|
||||||
|
<summary>IEEE style as per the 2023 guidelines.</summary>
|
||||||
|
<updated>2024-03-27T11:41:27+00:00</updated>
|
||||||
|
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
|
||||||
|
</info>
|
||||||
|
<locale xml:lang="en">
|
||||||
|
<date form="text">
|
||||||
|
<date-part name="month" form="short" suffix=" "/>
|
||||||
|
<date-part name="day" form="numeric-leading-zeros" suffix=", "/>
|
||||||
|
<date-part name="year"/>
|
||||||
|
</date>
|
||||||
|
<terms>
|
||||||
|
<term name="chapter" form="short">ch.</term>
|
||||||
|
<term name="chapter-number" form="short">ch.</term>
|
||||||
|
<term name="presented at">presented at the</term>
|
||||||
|
<term name="available at">available</term>
|
||||||
|
<!-- always use three-letter abbreviations for months -->
|
||||||
|
<term name="month-06" form="short">Jun.</term>
|
||||||
|
<term name="month-07" form="short">Jul.</term>
|
||||||
|
<term name="month-09" form="short">Sep.</term>
|
||||||
|
</terms>
|
||||||
|
</locale>
|
||||||
|
<!-- Macros -->
|
||||||
|
<macro name="status">
|
||||||
|
<choose>
|
||||||
|
<if variable="page issue volume" match="none">
|
||||||
|
<text variable="status" text-case="capitalize-first" suffix="" font-weight="bold"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="edition">
|
||||||
|
<choose>
|
||||||
|
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference report song" match="any">
|
||||||
|
<choose>
|
||||||
|
<if is-numeric="edition">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<number variable="edition" form="ordinal"/>
|
||||||
|
<text term="edition" form="short"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text variable="edition" text-case="capitalize-first" suffix="."/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="issued">
|
||||||
|
<choose>
|
||||||
|
<if type="article-journal report" match="any">
|
||||||
|
<date variable="issued">
|
||||||
|
<date-part name="month" form="short" suffix=" "/>
|
||||||
|
<date-part name="year" form="long"/>
|
||||||
|
</date>
|
||||||
|
</if>
|
||||||
|
<else-if type="bill book chapter graphic legal_case legislation song thesis" match="any">
|
||||||
|
<date variable="issued">
|
||||||
|
<date-part name="year" form="long"/>
|
||||||
|
</date>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="paper-conference" match="any">
|
||||||
|
<date variable="issued">
|
||||||
|
<date-part name="month" form="short"/>
|
||||||
|
<date-part name="year" prefix=" "/>
|
||||||
|
</date>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="motion_picture" match="any">
|
||||||
|
<date variable="issued" form="text" prefix="(" suffix=")"/>
|
||||||
|
</else-if>
|
||||||
|
<else>
|
||||||
|
<date variable="issued" form="text"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="author">
|
||||||
|
<names variable="author">
|
||||||
|
<name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/>
|
||||||
|
<label form="short" prefix=", " text-case="capitalize-first"/>
|
||||||
|
<et-al font-style="italic"/>
|
||||||
|
<substitute>
|
||||||
|
<names variable="editor"/>
|
||||||
|
<names variable="translator"/>
|
||||||
|
<text macro="director"/>
|
||||||
|
</substitute>
|
||||||
|
</names>
|
||||||
|
</macro>
|
||||||
|
<macro name="editor">
|
||||||
|
<names variable="editor">
|
||||||
|
<name initialize-with=". " delimiter=", " and="text"/>
|
||||||
|
<label form="short" prefix=", " text-case="capitalize-first"/>
|
||||||
|
</names>
|
||||||
|
</macro>
|
||||||
|
<macro name="director">
|
||||||
|
<names variable="director">
|
||||||
|
<name and="text" et-al-min="7" et-al-use-first="1" initialize-with=". "/>
|
||||||
|
<et-al font-style="italic"/>
|
||||||
|
</names>
|
||||||
|
</macro>
|
||||||
|
<macro name="locators">
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text macro="edition"/>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text term="volume" form="short"/>
|
||||||
|
<number variable="volume" form="numeric"/>
|
||||||
|
</group>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<number variable="number-of-volumes" form="numeric"/>
|
||||||
|
<text term="volume" form="short" plural="true"/>
|
||||||
|
</group>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text term="issue" form="short"/>
|
||||||
|
<number variable="issue" form="numeric"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="title">
|
||||||
|
<choose>
|
||||||
|
<if type="bill book graphic legal_case legislation motion_picture song standard software" match="any">
|
||||||
|
<text variable="title" font-style="italic"/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text variable="title" quotes="true"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="publisher">
|
||||||
|
<choose>
|
||||||
|
<if type="bill book chapter graphic legal_case legislation motion_picture paper-conference song" match="any">
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text variable="publisher-place"/>
|
||||||
|
<text variable="publisher"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text variable="publisher"/>
|
||||||
|
<text variable="publisher-place"/>
|
||||||
|
</group>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="event">
|
||||||
|
<choose>
|
||||||
|
<!-- Published Conference Paper -->
|
||||||
|
<if type="paper-conference speech" match="any">
|
||||||
|
<choose>
|
||||||
|
<if variable="container-title" match="any">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text term="in"/>
|
||||||
|
<text variable="container-title" font-style="italic"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
<!-- Unpublished Conference Paper -->
|
||||||
|
<else>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text term="presented at"/>
|
||||||
|
<text variable="event"/>
|
||||||
|
</group>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="access">
|
||||||
|
<choose>
|
||||||
|
<if type="webpage post post-weblog" match="any">
|
||||||
|
<!-- https://url.com/ (accessed Mon. DD, YYYY). -->
|
||||||
|
<choose>
|
||||||
|
<if variable="URL">
|
||||||
|
<group delimiter=". " prefix=" ">
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text term="accessed" text-case="capitalize-first"/>
|
||||||
|
<date variable="accessed" form="text"/>
|
||||||
|
</group>
|
||||||
|
<text term="online" prefix="[" suffix="]" text-case="capitalize-first"/>
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text term="available at" text-case="capitalize-first"/>
|
||||||
|
<text variable="URL"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<else-if match="any" variable="DOI">
|
||||||
|
<!-- doi: 10.1000/xyz123. -->
|
||||||
|
<text variable="DOI" prefix=" doi: " suffix="."/>
|
||||||
|
</else-if>
|
||||||
|
<else-if variable="URL">
|
||||||
|
<!-- Accessed: Mon. DD, YYYY. [Medium]. Available: https://URL.com/ -->
|
||||||
|
<group delimiter=". " prefix=" " suffix=". ">
|
||||||
|
<!-- Accessed: Mon. DD, YYYY. -->
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text term="accessed" text-case="capitalize-first"/>
|
||||||
|
<date variable="accessed" form="text"/>
|
||||||
|
</group>
|
||||||
|
<!-- [Online Video]. -->
|
||||||
|
<group prefix="[" suffix="]" delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if variable="medium" match="any">
|
||||||
|
<text variable="medium" text-case="capitalize-first"/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text term="online" text-case="capitalize-first"/>
|
||||||
|
<choose>
|
||||||
|
<if type="motion_picture">
|
||||||
|
<text term="video" text-case="capitalize-first"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<!-- Available: https://URL.com/ -->
|
||||||
|
<group delimiter=": " prefix=" ">
|
||||||
|
<text term="available at" text-case="capitalize-first"/>
|
||||||
|
<text variable="URL"/>
|
||||||
|
</group>
|
||||||
|
</else-if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="page">
|
||||||
|
<choose>
|
||||||
|
<if type="article-journal" variable="number" match="all">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text value="Art."/>
|
||||||
|
<text term="issue" form="short"/>
|
||||||
|
<text variable="number"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<label variable="page" form="short"/>
|
||||||
|
<text variable="page"/>
|
||||||
|
</group>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="citation-locator">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if locator="page">
|
||||||
|
<label variable="locator" form="short"/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<label variable="locator" form="short" text-case="capitalize-first"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
<text variable="locator"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="geographic-location">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<choose>
|
||||||
|
<if variable="publisher-place">
|
||||||
|
<text variable="publisher-place" text-case="title"/>
|
||||||
|
</if>
|
||||||
|
<else-if variable="event-place">
|
||||||
|
<text variable="event-place" text-case="title"/>
|
||||||
|
</else-if>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<!-- Series -->
|
||||||
|
<macro name="collection">
|
||||||
|
<choose>
|
||||||
|
<if variable="collection-title" match="any">
|
||||||
|
<text term="in" suffix=" "/>
|
||||||
|
<group delimiter=", " suffix=". ">
|
||||||
|
<text variable="collection-title"/>
|
||||||
|
<text variable="collection-number" prefix="no. "/>
|
||||||
|
<text variable="volume" prefix="vol. "/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<!-- Citation -->
|
||||||
|
<citation>
|
||||||
|
<sort>
|
||||||
|
<key variable="citation-number"/>
|
||||||
|
</sort>
|
||||||
|
<layout delimiter=", ">
|
||||||
|
<group prefix="[" suffix="]" delimiter=", ">
|
||||||
|
<text variable="citation-number"/>
|
||||||
|
<text macro="citation-locator"/>
|
||||||
|
</group>
|
||||||
|
</layout>
|
||||||
|
</citation>
|
||||||
|
<!-- Bibliography -->
|
||||||
|
<bibliography entry-spacing="0" second-field-align="flush">
|
||||||
|
<layout>
|
||||||
|
<!-- Citation Number -->
|
||||||
|
<text variable="citation-number" prefix="[" suffix="]"/>
|
||||||
|
<!-- Author(s) -->
|
||||||
|
<text macro="author" suffix=", "/>
|
||||||
|
<!-- Rest of Citation -->
|
||||||
|
<choose>
|
||||||
|
<!-- Specific Formats -->
|
||||||
|
<if type="article-journal">
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text variable="container-title" font-style="italic" form="short"/>
|
||||||
|
<text macro="locators"/>
|
||||||
|
<text macro="page"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
<text macro="status"/>
|
||||||
|
</group>
|
||||||
|
<choose>
|
||||||
|
<if variable="URL DOI" match="none">
|
||||||
|
<text value="."/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text value=","/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
<text macro="access"/>
|
||||||
|
</if>
|
||||||
|
<else-if type="paper-conference speech" match="any">
|
||||||
|
<group delimiter=", " suffix=", ">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text macro="event"/>
|
||||||
|
<text macro="editor"/>
|
||||||
|
</group>
|
||||||
|
<text macro="collection"/>
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
<text macro="page"/>
|
||||||
|
<text macro="status"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="chapter">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text term="in" suffix=" "/>
|
||||||
|
<text variable="container-title" font-style="italic"/>
|
||||||
|
</group>
|
||||||
|
<text macro="locators"/>
|
||||||
|
<text macro="editor"/>
|
||||||
|
<text macro="collection"/>
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<label variable="chapter-number" form="short"/>
|
||||||
|
<text variable="chapter-number"/>
|
||||||
|
</group>
|
||||||
|
<text macro="page"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="report">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text variable="genre"/>
|
||||||
|
<text variable="number"/>
|
||||||
|
</group>
|
||||||
|
<text macro="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="thesis">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text variable="genre"/>
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="software">
|
||||||
|
<group delimiter=". " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text macro="issued" prefix="(" suffix=")"/>
|
||||||
|
<text variable="genre"/>
|
||||||
|
<text macro="publisher"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="article">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text macro="publisher" font-style="italic"/>
|
||||||
|
<text variable="number"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="webpage post-weblog post" match="any">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text variable="container-title"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="patent">
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text variable="number"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<!-- Online Video -->
|
||||||
|
<else-if type="motion_picture">
|
||||||
|
<text macro="geographic-location" suffix=". "/>
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="standard">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text variable="genre"/>
|
||||||
|
<text variable="number"/>
|
||||||
|
</group>
|
||||||
|
<text macro="geographic-location"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<!-- Generic/Fallback Formats -->
|
||||||
|
<else-if type="bill book graphic legal_case legislation report song" match="any">
|
||||||
|
<group delimiter=", " suffix=". ">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text macro="locators"/>
|
||||||
|
</group>
|
||||||
|
<text macro="collection"/>
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
<text macro="page"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="article-magazine article-newspaper broadcast interview manuscript map patent personal_communication song speech thesis webpage" match="any">
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text variable="container-title" font-style="italic"/>
|
||||||
|
<text macro="locators"/>
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<text macro="page"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else-if>
|
||||||
|
<else>
|
||||||
|
<group delimiter=", " suffix=". ">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text variable="container-title" font-style="italic"/>
|
||||||
|
<text macro="locators"/>
|
||||||
|
</group>
|
||||||
|
<text macro="collection"/>
|
||||||
|
<group delimiter=", " suffix=".">
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<text macro="page"/>
|
||||||
|
<text macro="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="access"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</layout>
|
||||||
|
</bibliography>
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,757 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<locale xmlns="http://purl.org/net/xbiblio/csl" version="1.0" xml:lang="es-MX">
|
||||||
|
<info>
|
||||||
|
<translator>
|
||||||
|
<name>Juan Ignacio Flores Salgado</name>
|
||||||
|
<uri>https://www.mendeley.com/profiles/juan-ignacio-flores-salgado/</uri>
|
||||||
|
</translator>
|
||||||
|
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
|
||||||
|
<updated>2025-10-16T03:24:00+00:00</updated>
|
||||||
|
</info>
|
||||||
|
<style-options punctuation-in-quote="false"/>
|
||||||
|
<date form="text">
|
||||||
|
<date-part name="day" prefix="el " suffix=" de "/>
|
||||||
|
<date-part name="month" suffix=" de "/>
|
||||||
|
<date-part name="year"/>
|
||||||
|
</date>
|
||||||
|
<date form="numeric">
|
||||||
|
<date-part name="day" form="numeric-leading-zeros" suffix="/"/>
|
||||||
|
<date-part name="month" form="numeric-leading-zeros" suffix="/"/>
|
||||||
|
<date-part name="year"/>
|
||||||
|
</date>
|
||||||
|
<terms>
|
||||||
|
<!-- LONG GENERAL TERMS -->
|
||||||
|
<term name="accessed">consultado</term>
|
||||||
|
<term name="advance-online-publication">advance online publication</term>
|
||||||
|
<term name="album">album</term>
|
||||||
|
<term name="and">y</term>
|
||||||
|
<term name="and others">et al.</term>
|
||||||
|
<term name="anonymous">anónimo</term>
|
||||||
|
<term name="at">en</term>
|
||||||
|
<term name="audio-recording">audio recording</term>
|
||||||
|
<term name="available at">disponible en</term>
|
||||||
|
<term name="by">de</term>
|
||||||
|
<term name="circa">circa</term>
|
||||||
|
<term name="cited">citado</term>
|
||||||
|
<term name="et-al">et al.</term>
|
||||||
|
<term name="film">film</term>
|
||||||
|
<term name="forthcoming">en preparación</term>
|
||||||
|
<term name="from">a partir de</term>
|
||||||
|
<term name="henceforth">henceforth</term>
|
||||||
|
<term name="ibid">ibid.</term>
|
||||||
|
<term name="in">en</term>
|
||||||
|
<term name="in press">en imprenta</term>
|
||||||
|
<term name="internet">internet</term>
|
||||||
|
<term name="letter">carta</term>
|
||||||
|
<term name="loc-cit">loc. cit.</term> <!-- like ibid., the abbreviated form is the regular form -->
|
||||||
|
<term name="no date">sin fecha</term>
|
||||||
|
<term name="no-place">no place</term>
|
||||||
|
<term name="no-publisher">no publisher</term> <!-- sine nomine -->
|
||||||
|
<term name="on">on</term>
|
||||||
|
<term name="online">en línea</term>
|
||||||
|
<term name="op-cit">op. cit.</term> <!-- like ibid., the abbreviated form is the regular form -->
|
||||||
|
<term name="original-work-published">obra original publicada en</term>
|
||||||
|
<term name="personal-communication">comunicación personal</term>
|
||||||
|
<term name="podcast">podcast</term>
|
||||||
|
<term name="podcast-episode">podcast episode</term>
|
||||||
|
<term name="preprint">preprint</term>
|
||||||
|
<term name="presented at">presentado en</term>
|
||||||
|
<term name="radio-broadcast">radio broadcast</term>
|
||||||
|
<term name="radio-series">radio series</term>
|
||||||
|
<term name="radio-series-episode">radio series episode</term>
|
||||||
|
<term name="reference">
|
||||||
|
<single>referencia</single>
|
||||||
|
<multiple>referencias</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="retrieved">recuperado</term>
|
||||||
|
<term name="review-of">review of</term>
|
||||||
|
<term name="scale">escala</term>
|
||||||
|
<term name="special-issue">special issue</term>
|
||||||
|
<term name="special-section">special section</term>
|
||||||
|
<term name="television-broadcast">television broadcast</term>
|
||||||
|
<term name="television-series">television series</term>
|
||||||
|
<term name="television-series-episode">television series episode</term>
|
||||||
|
<term name="video">video</term>
|
||||||
|
<term name="working-paper">working paper</term>
|
||||||
|
|
||||||
|
<!-- SHORT GENERAL TERMS -->
|
||||||
|
<term name="anonymous" form="short">anón.</term>
|
||||||
|
<term name="circa" form="short">c.</term>
|
||||||
|
<term name="no date" form="short">s/f</term>
|
||||||
|
<term name="no-place" form="short">n.p.</term>
|
||||||
|
<term name="no-publisher" form="short">n.p.</term>
|
||||||
|
<term name="reference" form="short">
|
||||||
|
<single>ref.</single>
|
||||||
|
<multiple>refs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="review-of" form="short">rev. of</term>
|
||||||
|
|
||||||
|
<!-- SYMBOLIC GENERAL FORMS -->
|
||||||
|
|
||||||
|
<!-- LONG ITEM TYPE FORMS -->
|
||||||
|
<term name="article">preprint</term>
|
||||||
|
<term name="article-journal">journal article</term>
|
||||||
|
<term name="article-magazine">magazine article</term>
|
||||||
|
<term name="article-newspaper">newspaper article</term>
|
||||||
|
<term name="bill">bill</term>
|
||||||
|
<!-- book is in the list of locator terms -->
|
||||||
|
<term name="broadcast">broadcast</term>
|
||||||
|
<!-- chapter is in the list of locator terms -->
|
||||||
|
<term name="classic">classic</term>
|
||||||
|
<term name="collection">collection</term>
|
||||||
|
<term name="dataset">dataset</term>
|
||||||
|
<term name="document">document</term>
|
||||||
|
<term name="entry">entry</term>
|
||||||
|
<term name="entry-dictionary">dictionary entry</term>
|
||||||
|
<term name="entry-encyclopedia">encyclopedia entry</term>
|
||||||
|
<term name="event">event</term>
|
||||||
|
<!-- figure is in the list of locator terms -->
|
||||||
|
<term name="graphic">graphic</term>
|
||||||
|
<term name="hearing">hearing</term>
|
||||||
|
<term name="interview">entrevista</term>
|
||||||
|
<term name="legal_case">legal case</term>
|
||||||
|
<term name="legislation">legislation</term>
|
||||||
|
<term name="manuscript">manuscript</term>
|
||||||
|
<term name="map">map</term>
|
||||||
|
<term name="motion_picture">video recording</term>
|
||||||
|
<term name="musical_score">musical score</term>
|
||||||
|
<term name="pamphlet">pamphlet</term>
|
||||||
|
<term name="paper-conference">conference paper</term>
|
||||||
|
<term name="patent">patent</term>
|
||||||
|
<term name="performance">performance</term>
|
||||||
|
<term name="periodical">periodical</term>
|
||||||
|
<term name="personal_communication">comunicación personal</term>
|
||||||
|
<term name="post">post</term>
|
||||||
|
<term name="post-weblog">blog post</term>
|
||||||
|
<term name="regulation">regulation</term>
|
||||||
|
<term name="report">report</term>
|
||||||
|
<term name="review">review</term>
|
||||||
|
<term name="review-book">book review</term>
|
||||||
|
<term name="software">software</term>
|
||||||
|
<term name="song">audio recording</term>
|
||||||
|
<term name="speech">presentation</term>
|
||||||
|
<term name="standard">standard</term>
|
||||||
|
<term name="thesis">thesis</term>
|
||||||
|
<term name="treaty">treaty</term>
|
||||||
|
<term name="webpage">webpage</term>
|
||||||
|
|
||||||
|
<!-- SHORT ITEM TYPE FORMS -->
|
||||||
|
<term name="article-journal" form="short">journal art.</term>
|
||||||
|
<term name="article-magazine" form="short">mag. art.</term>
|
||||||
|
<term name="article-newspaper" form="short">newspaper art.</term>
|
||||||
|
<!-- book is in the list of locator terms -->
|
||||||
|
<!-- chapter is in the list of locator terms -->
|
||||||
|
<term name="document" form="short">doc.</term>
|
||||||
|
<!-- figure is in the list of locator terms -->
|
||||||
|
<term name="graphic" form="short">graph.</term>
|
||||||
|
<term name="interview" form="short">interv.</term>
|
||||||
|
<term name="manuscript" form="short">MS</term>
|
||||||
|
<term name="motion_picture" form="short">video rec.</term>
|
||||||
|
<term name="report" form="short">rep.</term>
|
||||||
|
<term name="review" form="short">rev.</term>
|
||||||
|
<term name="review-book" form="short">bk. rev.</term>
|
||||||
|
<term name="song" form="short">audio rec.</term>
|
||||||
|
|
||||||
|
<!-- LONG VERB ITEM TYPE FORMS -->
|
||||||
|
<!-- Only where applicable -->
|
||||||
|
<term name="hearing" form="verb">testimony of</term>
|
||||||
|
<term name="review" form="verb">review of</term>
|
||||||
|
<term name="review-book" form="verb">review of the book</term>
|
||||||
|
|
||||||
|
<!-- SHORT VERB ITEM TYPE FORMS -->
|
||||||
|
|
||||||
|
<!-- HISTORICAL ERA TERMS -->
|
||||||
|
<term name="ad">d. C.</term>
|
||||||
|
<term name="bc">a. C.</term>
|
||||||
|
<term name="bce">BCE</term>
|
||||||
|
<term name="ce">CE</term>
|
||||||
|
|
||||||
|
<!-- PUNCTUATION -->
|
||||||
|
<term name="open-quote">“</term>
|
||||||
|
<term name="close-quote">”</term>
|
||||||
|
<term name="open-inner-quote">‘</term>
|
||||||
|
<term name="close-inner-quote">’</term>
|
||||||
|
<term name="page-range-delimiter">–</term>
|
||||||
|
<term name="colon">:</term>
|
||||||
|
<term name="comma">,</term>
|
||||||
|
<term name="semicolon">;</term>
|
||||||
|
|
||||||
|
<!-- ORDINALS -->
|
||||||
|
<term name="ordinal">a</term>
|
||||||
|
<term name="ordinal-01" gender-form="feminine" match="whole-number">a</term>
|
||||||
|
<term name="ordinal-01" gender-form="masculine" match="whole-number">o</term>
|
||||||
|
|
||||||
|
<!-- LONG ORDINALS -->
|
||||||
|
<term name="long-ordinal-01">primera</term>
|
||||||
|
<term name="long-ordinal-02">segunda</term>
|
||||||
|
<term name="long-ordinal-03">tercera</term>
|
||||||
|
<term name="long-ordinal-04">cuarta</term>
|
||||||
|
<term name="long-ordinal-05">quinta</term>
|
||||||
|
<term name="long-ordinal-06">sexta</term>
|
||||||
|
<term name="long-ordinal-07">séptima</term>
|
||||||
|
<term name="long-ordinal-08">octava</term>
|
||||||
|
<term name="long-ordinal-09">novena</term>
|
||||||
|
<term name="long-ordinal-10">décima</term>
|
||||||
|
|
||||||
|
<!-- LONG LOCATOR FORMS -->
|
||||||
|
<term name="act">
|
||||||
|
<single>act</single>
|
||||||
|
<multiple>acts</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="appendix">
|
||||||
|
<single>appendix</single>
|
||||||
|
<multiple>appendices</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="article-locator">
|
||||||
|
<single>article</single>
|
||||||
|
<multiple>articles</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="book">
|
||||||
|
<single>libro</single>
|
||||||
|
<multiple>libros</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="canon">
|
||||||
|
<single>canon</single>
|
||||||
|
<multiple>canons</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="chapter">
|
||||||
|
<single>capítulo</single>
|
||||||
|
<multiple>capítulos</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="column">
|
||||||
|
<single>columna</single>
|
||||||
|
<multiple>columnas</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="elocation">
|
||||||
|
<single>location</single>
|
||||||
|
<multiple>locations</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="equation">
|
||||||
|
<single>equation</single>
|
||||||
|
<multiple>equations</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="figure">
|
||||||
|
<single>figura</single>
|
||||||
|
<multiple>figuras</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="folio">
|
||||||
|
<single>folio</single>
|
||||||
|
<multiple>folios</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="issue">
|
||||||
|
<single>número</single>
|
||||||
|
<multiple>números</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="line">
|
||||||
|
<single>línea</single>
|
||||||
|
<multiple>líneas</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="note">
|
||||||
|
<single>nota</single>
|
||||||
|
<multiple>notas</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="opus">
|
||||||
|
<single>opus</single>
|
||||||
|
<multiple>opera</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="page">
|
||||||
|
<single>página</single>
|
||||||
|
<multiple>páginas</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="paragraph">
|
||||||
|
<single>párrafo</single>
|
||||||
|
<multiple>párrafos</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="part">
|
||||||
|
<single>parte</single>
|
||||||
|
<multiple>partes</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="rule">
|
||||||
|
<single>rule</single>
|
||||||
|
<multiple>rules</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="scene">
|
||||||
|
<single>scene</single>
|
||||||
|
<multiple>scenes</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="section">
|
||||||
|
<single>sección</single>
|
||||||
|
<multiple>secciones</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="sub-verbo">
|
||||||
|
<single>sub voce</single>
|
||||||
|
<multiple>sub vocibus</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="supplement">
|
||||||
|
<single>supplement</single>
|
||||||
|
<multiple>supplements</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="table">
|
||||||
|
<single>table</single>
|
||||||
|
<multiple>tables</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="timestamp"> <!-- generally blank -->
|
||||||
|
<single/>
|
||||||
|
<multiple/>
|
||||||
|
</term>
|
||||||
|
<term name="title-locator">
|
||||||
|
<single>title</single>
|
||||||
|
<multiple>titles</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="verse">
|
||||||
|
<single>verso</single>
|
||||||
|
<multiple>versos</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="volume">
|
||||||
|
<single>volumen</single>
|
||||||
|
<multiple>volúmenes</multiple>
|
||||||
|
</term>
|
||||||
|
|
||||||
|
<!-- SHORT LOCATOR FORMS -->
|
||||||
|
<term name="appendix" form="short">
|
||||||
|
<single>app.</single>
|
||||||
|
<multiple>apps.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="article-locator" form="short">
|
||||||
|
<single>art.</single>
|
||||||
|
<multiple>arts.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="book" form="short">
|
||||||
|
<single>lib.</single>
|
||||||
|
<multiple>libs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="chapter" form="short">
|
||||||
|
<single>cap.</single>
|
||||||
|
<multiple>caps.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="column" form="short">
|
||||||
|
<single>col.</single>
|
||||||
|
<multiple>cols.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="elocation" form="short">
|
||||||
|
<single>loc.</single>
|
||||||
|
<multiple>locs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="equation" form="short">
|
||||||
|
<single>eq.</single>
|
||||||
|
<multiple>eqs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="figure" form="short">
|
||||||
|
<single>fig.</single>
|
||||||
|
<multiple>figs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="folio" form="short">
|
||||||
|
<single>f.</single>
|
||||||
|
<multiple>ff.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="issue" form="short">
|
||||||
|
<single>núm.</single>
|
||||||
|
<multiple>núms.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="line" form="short">
|
||||||
|
<single>l.</single>
|
||||||
|
<multiple>ls.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="note" form="short">
|
||||||
|
<single>n.</single>
|
||||||
|
<multiple>nn.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="opus" form="short">
|
||||||
|
<single>op.</single>
|
||||||
|
<multiple>opp.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="page" form="short">
|
||||||
|
<single>p.</single>
|
||||||
|
<multiple>pp.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="paragraph" form="short">
|
||||||
|
<single>párr.</single>
|
||||||
|
<multiple>párrs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="part" form="short">
|
||||||
|
<single>pt.</single>
|
||||||
|
<multiple>pts.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="rule" form="short">
|
||||||
|
<single>r.</single>
|
||||||
|
<multiple>rr.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="scene" form="short">
|
||||||
|
<single>sc.</single>
|
||||||
|
<multiple>scs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="section" form="short">
|
||||||
|
<single>sec.</single>
|
||||||
|
<multiple>secs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="sub-verbo" form="short">
|
||||||
|
<single>s. v.</single>
|
||||||
|
<multiple>s. vv.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="supplement" form="short">
|
||||||
|
<single>supp.</single>
|
||||||
|
<multiple>supps.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="table" form="short">
|
||||||
|
<single>tbl.</single>
|
||||||
|
<multiple>tbls.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="timestamp" form="short"> <!-- generally blank -->
|
||||||
|
<single/>
|
||||||
|
<multiple/>
|
||||||
|
</term>
|
||||||
|
<term name="title-locator" form="short">
|
||||||
|
<single>tit.</single>
|
||||||
|
<multiple>tits.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="verse" form="short">
|
||||||
|
<single>v.</single>
|
||||||
|
<multiple>vv.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="volume" form="short">
|
||||||
|
<single>vol.</single>
|
||||||
|
<multiple>vols.</multiple>
|
||||||
|
</term>
|
||||||
|
|
||||||
|
<!-- SYMBOLIC LOCATOR FORMS -->
|
||||||
|
<term name="paragraph" form="symbol">
|
||||||
|
<single>¶</single>
|
||||||
|
<multiple>¶</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="section" form="symbol">
|
||||||
|
<single>§</single>
|
||||||
|
<multiple>§</multiple>
|
||||||
|
</term>
|
||||||
|
|
||||||
|
<!-- LONG NUMBER VARIABLE FORMS -->
|
||||||
|
<term name="chapter-number">
|
||||||
|
<single>chapter</single>
|
||||||
|
<multiple>chapters</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="citation-number">
|
||||||
|
<single>citation</single>
|
||||||
|
<multiple>citations</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="collection-number">
|
||||||
|
<single>número</single>
|
||||||
|
<multiple>números</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="edition">
|
||||||
|
<single>edición</single>
|
||||||
|
<multiple>ediciones</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="first-reference-note-number">
|
||||||
|
<single>reference</single>
|
||||||
|
<multiple>references</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="number">
|
||||||
|
<single>number</single>
|
||||||
|
<multiple>numbers</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="number-of-pages">
|
||||||
|
<single>página</single>
|
||||||
|
<multiple>páginas</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="number-of-volumes">
|
||||||
|
<single>volume</single>
|
||||||
|
<multiple>volumes</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="page-first">
|
||||||
|
<single>page</single>
|
||||||
|
<multiple>pages</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="printing">
|
||||||
|
<single>printing</single>
|
||||||
|
<multiple>printings</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="version">versión</term>
|
||||||
|
|
||||||
|
<!-- SHORT NUMBER VARIABLE FORMS -->
|
||||||
|
<term name="chapter-number" form="short">
|
||||||
|
<single>chap.</single>
|
||||||
|
<multiple>chaps.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="citation-number" form="short">
|
||||||
|
<single>cit.</single>
|
||||||
|
<multiple>cits.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="collection-number" form="short">
|
||||||
|
<single>núm.</single>
|
||||||
|
<multiple>núms.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="edition" form="short">
|
||||||
|
<single>ed.</single>
|
||||||
|
<multiple>eds.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="first-reference-note-number" form="short">
|
||||||
|
<single>ref.</single>
|
||||||
|
<multiple>refs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="number" form="short">
|
||||||
|
<single>no.</single>
|
||||||
|
<multiple>nos.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="number-of-pages" form="short">
|
||||||
|
<single>p.</single>
|
||||||
|
<multiple>pp.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="number-of-volumes" form="short">
|
||||||
|
<single>vol.</single>
|
||||||
|
<multiple>vols.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="page-first" form="short">
|
||||||
|
<single>p.</single>
|
||||||
|
<multiple>pp.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="printing" form="short">
|
||||||
|
<single>print.</single>
|
||||||
|
<multiple>prints.</multiple>
|
||||||
|
</term>
|
||||||
|
|
||||||
|
<!-- LONG ROLE FORMS -->
|
||||||
|
<term name="author"/> <!-- generally blank -->
|
||||||
|
<term name="chair">
|
||||||
|
<single>chair</single>
|
||||||
|
<multiple>chairs</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="collection-editor">
|
||||||
|
<single>ed.</single>
|
||||||
|
<multiple>eds.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="compiler">
|
||||||
|
<single>compiler</single>
|
||||||
|
<multiple>compilers</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="composer"/> <!-- generally blank -->
|
||||||
|
<term name="container-author"/> <!-- generally blank -->
|
||||||
|
<term name="contributor">
|
||||||
|
<single>contributor</single>
|
||||||
|
<multiple>contributors</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="curator">
|
||||||
|
<single>curator</single>
|
||||||
|
<multiple>curators</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="director">
|
||||||
|
<single>director</single>
|
||||||
|
<multiple>directores</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editor">
|
||||||
|
<single>editor</single>
|
||||||
|
<multiple>editores</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editor-translator">
|
||||||
|
<single>editor y traductor</single>
|
||||||
|
<multiple>editores y traductores</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editortranslator">
|
||||||
|
<single>editor y traductor</single>
|
||||||
|
<multiple>editores y traductores</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editorial-director">
|
||||||
|
<single>coordinador</single>
|
||||||
|
<multiple>coordinadores</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="executive-producer">
|
||||||
|
<single>executive producer</single>
|
||||||
|
<multiple>executive producers</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="guest">
|
||||||
|
<single>guest</single>
|
||||||
|
<multiple>guests</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="host">
|
||||||
|
<single>host</single>
|
||||||
|
<multiple>hosts</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="illustrator">
|
||||||
|
<single>ilustrador</single>
|
||||||
|
<multiple>ilustradores</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="interviewer"/> <!-- generally blank -->
|
||||||
|
<term name="narrator">
|
||||||
|
<single>narrator</single>
|
||||||
|
<multiple>narrators</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="organizer">
|
||||||
|
<single>organizer</single>
|
||||||
|
<multiple>organizers</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="original-author"/> <!-- generally blank -->
|
||||||
|
<term name="performer">
|
||||||
|
<single>performer</single>
|
||||||
|
<multiple>performers</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="producer">
|
||||||
|
<single>producer</single>
|
||||||
|
<multiple>producers</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="recipient"/> <!-- generally blank -->
|
||||||
|
<term name="reviewed-author"/> <!-- generally blank -->
|
||||||
|
<term name="script-writer">
|
||||||
|
<single>writer</single>
|
||||||
|
<multiple>writers</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="series-creator">
|
||||||
|
<single>series creator</single>
|
||||||
|
<multiple>series creators</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="translator">
|
||||||
|
<single>traductor</single>
|
||||||
|
<multiple>traductores</multiple>
|
||||||
|
</term>
|
||||||
|
|
||||||
|
<!-- SHORT ROLE FORMS -->
|
||||||
|
<term name="compiler" form="short">
|
||||||
|
<single>comp.</single>
|
||||||
|
<multiple>comps.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="contributor" form="short">
|
||||||
|
<single>contrib.</single>
|
||||||
|
<multiple>contribs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="curator" form="short">
|
||||||
|
<single>cur.</single>
|
||||||
|
<multiple>curs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="director" form="short">
|
||||||
|
<single>dir.</single>
|
||||||
|
<multiple>dirs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editor" form="short">
|
||||||
|
<single>ed.</single>
|
||||||
|
<multiple>eds.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editor-translator" form="short">
|
||||||
|
<single>ed. y trad.</single>
|
||||||
|
<multiple>eds. y trads.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editortranslator" form="short">
|
||||||
|
<single>ed. y trad.</single>
|
||||||
|
<multiple>eds. y trads.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="editorial-director" form="short">
|
||||||
|
<single>coord.</single>
|
||||||
|
<multiple>coords.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="executive-producer" form="short">
|
||||||
|
<single>exec. prod.</single>
|
||||||
|
<multiple>exec. prods.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="illustrator" form="short">
|
||||||
|
<single>ilust.</single>
|
||||||
|
<multiple>ilusts.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="narrator" form="short">
|
||||||
|
<single>narr.</single>
|
||||||
|
<multiple>narrs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="organizer" form="short">
|
||||||
|
<single>org.</single>
|
||||||
|
<multiple>orgs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="performer" form="short">
|
||||||
|
<single>perf.</single>
|
||||||
|
<multiple>perfs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="producer" form="short">
|
||||||
|
<single>prod.</single>
|
||||||
|
<multiple>prods.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="script-writer" form="short">
|
||||||
|
<single>writ.</single>
|
||||||
|
<multiple>writs.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="series-creator" form="short">
|
||||||
|
<single>cre.</single>
|
||||||
|
<multiple>cres.</multiple>
|
||||||
|
</term>
|
||||||
|
<term name="translator" form="short">
|
||||||
|
<single>trad.</single>
|
||||||
|
<multiple>trads.</multiple>
|
||||||
|
</term>
|
||||||
|
|
||||||
|
<!-- VERB ROLE FORMS -->
|
||||||
|
<term name="chair" form="verb">chaired by</term>
|
||||||
|
<term name="collection-editor" form="verb">edited by</term>
|
||||||
|
<term name="compiler" form="verb">compiled by</term>
|
||||||
|
<term name="container-author" form="verb">de</term>
|
||||||
|
<term name="contributor" form="verb">with</term>
|
||||||
|
<term name="curator" form="verb">curated by</term>
|
||||||
|
<term name="director" form="verb">dirigido por</term>
|
||||||
|
<term name="editor" form="verb">editado por</term>
|
||||||
|
<term name="editor-translator" form="verb">editado y traducido por</term>
|
||||||
|
<term name="editortranslator" form="verb">editado y traducido por</term>
|
||||||
|
<term name="editorial-director" form="verb">coordinado por</term>
|
||||||
|
<term name="executive-producer" form="verb">executive produced by</term>
|
||||||
|
<term name="guest" form="verb">with guest</term>
|
||||||
|
<term name="host" form="verb">hosted by</term>
|
||||||
|
<term name="illustrator" form="verb">ilustrado por</term>
|
||||||
|
<term name="interviewer" form="verb">entrevistado por</term>
|
||||||
|
<term name="narrator" form="verb">narrated by</term>
|
||||||
|
<term name="organizer" form="verb">organized by</term>
|
||||||
|
<term name="performer" form="verb">performed by</term>
|
||||||
|
<term name="producer" form="verb">produced by</term>
|
||||||
|
<term name="recipient" form="verb">a</term>
|
||||||
|
<term name="reviewed-author" form="verb">por</term>
|
||||||
|
<term name="script-writer" form="verb">written by</term>
|
||||||
|
<term name="series-creator" form="verb">created by</term>
|
||||||
|
<term name="translator" form="verb">traducido por</term>
|
||||||
|
|
||||||
|
<!-- SHORT VERB ROLE FORMS -->
|
||||||
|
<term name="collection-editor" form="verb-short">ed. by</term>
|
||||||
|
<term name="compiler" form="verb-short">comp. by</term>
|
||||||
|
<term name="contributor" form="verb-short">w.</term>
|
||||||
|
<term name="curator" form="verb-short">cur. by</term>
|
||||||
|
<term name="director" form="verb-short">dir.</term>
|
||||||
|
<term name="editor" form="verb-short">ed.</term>
|
||||||
|
<term name="editor-translator" form="verb-short">ed. y trad.</term>
|
||||||
|
<term name="editortranslator" form="verb-short">ed. y trad.</term>
|
||||||
|
<term name="editorial-director" form="verb-short">coord.</term>
|
||||||
|
<term name="executive-producer" form="verb-short">exec. prod. by</term>
|
||||||
|
<term name="guest" form="verb-short">w. guest</term>
|
||||||
|
<term name="host" form="verb-short">hosted by</term>
|
||||||
|
<term name="illustrator" form="verb-short">ilust.</term>
|
||||||
|
<term name="narrator" form="verb-short">narr. by</term>
|
||||||
|
<term name="organizer" form="verb-short">org. by</term>
|
||||||
|
<term name="performer" form="verb-short">perf. by</term>
|
||||||
|
<term name="producer" form="verb-short">prod. by</term>
|
||||||
|
<term name="script-writer" form="verb-short">writ. by</term>
|
||||||
|
<term name="series-creator" form="verb-short">cre. by</term>
|
||||||
|
<term name="translator" form="verb-short">trad.</term>
|
||||||
|
|
||||||
|
<!-- LONG MONTH FORMS -->
|
||||||
|
<term name="month-01">enero</term>
|
||||||
|
<term name="month-02">febrero</term>
|
||||||
|
<term name="month-03">marzo</term>
|
||||||
|
<term name="month-04">abril</term>
|
||||||
|
<term name="month-05">mayo</term>
|
||||||
|
<term name="month-06">junio</term>
|
||||||
|
<term name="month-07">julio</term>
|
||||||
|
<term name="month-08">agosto</term>
|
||||||
|
<term name="month-09">septiembre</term>
|
||||||
|
<term name="month-10">octubre</term>
|
||||||
|
<term name="month-11">noviembre</term>
|
||||||
|
<term name="month-12">diciembre</term>
|
||||||
|
|
||||||
|
<!-- SHORT MONTH FORMS -->
|
||||||
|
<term name="month-01" form="short">ene.</term>
|
||||||
|
<term name="month-02" form="short">feb.</term>
|
||||||
|
<term name="month-03" form="short">mar.</term>
|
||||||
|
<term name="month-04" form="short">abr.</term>
|
||||||
|
<term name="month-05" form="short">may</term>
|
||||||
|
<term name="month-06" form="short">jun.</term>
|
||||||
|
<term name="month-07" form="short">jul.</term>
|
||||||
|
<term name="month-08" form="short">ago.</term>
|
||||||
|
<term name="month-09" form="short">sep.</term>
|
||||||
|
<term name="month-10" form="short">oct.</term>
|
||||||
|
<term name="month-11" form="short">nov.</term>
|
||||||
|
<term name="month-12" form="short">dic.</term>
|
||||||
|
|
||||||
|
<!-- SEASONS -->
|
||||||
|
<term name="season-01">primavera</term>
|
||||||
|
<term name="season-02">verano</term>
|
||||||
|
<term name="season-03">otoño</term>
|
||||||
|
<term name="season-04">invierno</term>
|
||||||
|
</terms>
|
||||||
|
</locale>
|
||||||
@@ -0,0 +1,520 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" delimiter-precedes-last="always" demote-non-dropping-particle="sort-only" initialize-with="" initialize-with-hyphen="false" name-as-sort-order="all" name-delimiter=", " names-delimiter=", " page-range-format="minimal" sort-separator=" " version="1.0">
|
||||||
|
<!-- This file was generated by the Style Variant Builder <https://github.com/citation-style-language/style-variant-builder>. To contribute changes, modify the template and regenerate variants. -->
|
||||||
|
<info>
|
||||||
|
<title>NLM/Vancouver: Citing Medicine 2nd edition (citation-sequence)</title>
|
||||||
|
<title-short>National Library of Medicine, ANSI/NISO Z39.29-2005 (R2010), ICMJE Recommendations/URMs (C-S)</title-short>
|
||||||
|
<id>http://www.zotero.org/styles/nlm-citation-sequence</id>
|
||||||
|
<link href="http://www.zotero.org/styles/nlm-citation-sequence" rel="self"/>
|
||||||
|
<link href="https://www.nlm.nih.gov/citingmedicine" rel="documentation"/>
|
||||||
|
<link href="https://www.nlm.nih.gov/bsd/uniform_requirements.html" rel="documentation"/>
|
||||||
|
<link href="https://www.icmje.org/recommendations/" rel="documentation"/>
|
||||||
|
<author>
|
||||||
|
<name>Michael Berkowitz</name>
|
||||||
|
<email>mberkowi@gmu.edu</email>
|
||||||
|
</author>
|
||||||
|
<author>
|
||||||
|
<name>Andrew Dunning</name>
|
||||||
|
<uri>https://orcid.org/0000-0003-0464-5036</uri>
|
||||||
|
</author>
|
||||||
|
<contributor>
|
||||||
|
<name>Petr Hlustik</name>
|
||||||
|
<uri>https://orcid.org/0000-0002-1951-0671</uri>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Sebastian Karcher</name>
|
||||||
|
<uri>https://orcid.org/0000-0001-8249-7388</uri>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Charles Parnot</name>
|
||||||
|
<uri>https://orcid.org/0000-0002-7346-5883</uri>
|
||||||
|
</contributor>
|
||||||
|
<contributor>
|
||||||
|
<name>Sean Takats</name>
|
||||||
|
<uri>https://orcid.org/0000-0002-7851-5069</uri>
|
||||||
|
</contributor>
|
||||||
|
<category citation-format="numeric"/>
|
||||||
|
<category field="generic-base"/>
|
||||||
|
<category field="medicine"/>
|
||||||
|
<category field="science"/>
|
||||||
|
<summary>Citing Medicine: The NLM Style Guide for Authors, Editors, and Publishers, 2nd edition (2015), based on ANSI/NISO Z39.29-2005 (R2010); citation-sequence system.</summary>
|
||||||
|
<updated>2026-02-18T15:24:08+00:00</updated>
|
||||||
|
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
|
||||||
|
</info>
|
||||||
|
<locale xml:lang="en">
|
||||||
|
<date delimiter=" " form="text">
|
||||||
|
<date-part name="year"/>
|
||||||
|
<date-part form="short" name="month" strip-periods="true"/>
|
||||||
|
<date-part name="day"/>
|
||||||
|
</date>
|
||||||
|
<terms>
|
||||||
|
<term name="available at">available from</term>
|
||||||
|
<term name="collection-editor">
|
||||||
|
<single>editor</single>
|
||||||
|
<multiple>editors</multiple>
|
||||||
|
</term>
|
||||||
|
<term form="short" name="month-06">Jun.</term>
|
||||||
|
<term form="short" name="month-07">Jul.</term>
|
||||||
|
<term form="short" name="month-09">Sep.</term>
|
||||||
|
<term name="presented at">presented at</term>
|
||||||
|
<term form="short" name="section">
|
||||||
|
<single>sect.</single>
|
||||||
|
<multiple>sects.</multiple>
|
||||||
|
</term>
|
||||||
|
<term form="short" name="supplement">
|
||||||
|
<single>suppl.</single>
|
||||||
|
<multiple>suppls.</multiple>
|
||||||
|
</term>
|
||||||
|
</terms>
|
||||||
|
</locale>
|
||||||
|
<locale xml:lang="fr">
|
||||||
|
<date delimiter=" " form="text">
|
||||||
|
<date-part name="day"/>
|
||||||
|
<date-part form="short" name="month" strip-periods="true"/>
|
||||||
|
<date-part name="year"/>
|
||||||
|
</date>
|
||||||
|
</locale>
|
||||||
|
<!-- Variable labels -->
|
||||||
|
<macro name="label-collection-number">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if is-numeric="collection-number">
|
||||||
|
<label form="short" variable="collection-number"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
<text variable="collection-number"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="label-edition">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if is-numeric="edition">
|
||||||
|
<number form="ordinal" variable="edition"/>
|
||||||
|
<label form="short" variable="edition"/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text variable="edition"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="label-number-of-pages">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text variable="number-of-pages"/>
|
||||||
|
<choose>
|
||||||
|
<if is-numeric="number-of-pages">
|
||||||
|
<label form="short" plural="never" variable="number-of-pages"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="label-page">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<label form="short" plural="never" variable="page"/>
|
||||||
|
<text variable="page"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="label-part-number-capitalized">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if is-numeric="part-number">
|
||||||
|
<!-- TODO: Replace with `part-number` label when CSL provides one -->
|
||||||
|
<text form="short" term="part" text-case="capitalize-first"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
<text variable="part-number"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="label-supplement-number">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if is-numeric="supplement-number">
|
||||||
|
<!-- TODO: Replace with `supplement-number` label when CSL provides one -->
|
||||||
|
<text form="short" strip-periods="true" term="supplement" text-case="capitalize-first"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
<text text-case="capitalize-first" variable="supplement-number"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="label-volume-capitalized">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if is-numeric="volume">
|
||||||
|
<label form="short" text-case="capitalize-first" variable="volume"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
<text variable="volume"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="author">
|
||||||
|
<names variable="author">
|
||||||
|
<label prefix=", "/>
|
||||||
|
<substitute>
|
||||||
|
<names variable="editor-translator"/>
|
||||||
|
<names variable="editor translator"/>
|
||||||
|
<names variable="editor"/>
|
||||||
|
<names variable="collection-editor"/>
|
||||||
|
</substitute>
|
||||||
|
</names>
|
||||||
|
</macro>
|
||||||
|
<macro name="title">
|
||||||
|
<choose>
|
||||||
|
<if type="webpage" variable="container-title">
|
||||||
|
<!-- `webpage` listed under `container-title` (Citing Medicine, ch. 25) -->
|
||||||
|
<text variable="container-title"/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text variable="title"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="content-type">
|
||||||
|
<text variable="genre"/>
|
||||||
|
</macro>
|
||||||
|
<macro name="type-of-medium">
|
||||||
|
<choose>
|
||||||
|
<if variable="medium">
|
||||||
|
<text text-case="capitalize-first" variable="medium"/>
|
||||||
|
</if>
|
||||||
|
<else-if match="any" type="chapter entry-dictionary entry-encyclopedia paper-conference"/>
|
||||||
|
<else-if variable="URL">
|
||||||
|
<text term="internet" text-case="capitalize-first"/>
|
||||||
|
</else-if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="container-preposition">
|
||||||
|
<choose>
|
||||||
|
<if match="any" type="chapter paper-conference entry-dictionary entry-encyclopedia">
|
||||||
|
<text term="in" text-case="capitalize-first"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="secondary-authors">
|
||||||
|
<names variable="editor">
|
||||||
|
<label prefix=", "/>
|
||||||
|
</names>
|
||||||
|
</macro>
|
||||||
|
<macro name="container-title">
|
||||||
|
<group delimiter=", ">
|
||||||
|
<choose>
|
||||||
|
<if type="webpage"/>
|
||||||
|
<else-if variable="container-title">
|
||||||
|
<group delimiter=". ">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if match="any" type="article-journal review review-book">
|
||||||
|
<text form="short" strip-periods="true" variable="container-title"/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text variable="container-title"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
<choose>
|
||||||
|
<if type="article-journal" variable="DOI"/>
|
||||||
|
<else-if type="article-journal" variable="PMID"/>
|
||||||
|
<else-if type="article-journal" variable="PMCID"/>
|
||||||
|
<else-if variable="URL">
|
||||||
|
<text prefix="[" suffix="]" term="internet" text-case="capitalize-first"/>
|
||||||
|
</else-if>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
<text macro="label-edition"/>
|
||||||
|
</group>
|
||||||
|
</else-if>
|
||||||
|
<!-- TODO: add `event-name` and `event-place` -->
|
||||||
|
<else-if match="any" type="bill legislation">
|
||||||
|
<group delimiter=". ">
|
||||||
|
<text variable="container-title"/>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text form="short" term="section" text-case="capitalize-first"/>
|
||||||
|
<text variable="section"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<text variable="number"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="speech">
|
||||||
|
<group delimiter=": ">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text text-case="capitalize-first" variable="genre"/>
|
||||||
|
<text term="presented at"/>
|
||||||
|
</group>
|
||||||
|
<text variable="event"/>
|
||||||
|
</group>
|
||||||
|
</else-if>
|
||||||
|
<else>
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text macro="label-volume-capitalized"/>
|
||||||
|
<text variable="volume-title"/>
|
||||||
|
</group>
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text macro="label-part-number-capitalized"/>
|
||||||
|
<text variable="part-title"/>
|
||||||
|
</group>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="place-of-publication">
|
||||||
|
<choose>
|
||||||
|
<if type="thesis">
|
||||||
|
<text prefix="[" suffix="]" variable="publisher-place"/>
|
||||||
|
</if>
|
||||||
|
<else-if type="speech"/>
|
||||||
|
<else>
|
||||||
|
<text variable="publisher-place"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="publisher">
|
||||||
|
<choose>
|
||||||
|
<!-- discard publisher for serial publications -->
|
||||||
|
<if match="none" type="article-journal article-magazine article-newspaper periodical post-weblog review review-book">
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text macro="place-of-publication"/>
|
||||||
|
<text variable="publisher"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="date">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if match="any" type="article-journal article-magazine article-newspaper periodical post-weblog review review-book">
|
||||||
|
<group delimiter=":">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<date form="text" variable="issued"/>
|
||||||
|
<choose>
|
||||||
|
<if type="article-journal" variable="DOI"/>
|
||||||
|
<else-if type="article-journal" variable="PMID"/>
|
||||||
|
<else-if type="article-journal" variable="PMCID"/>
|
||||||
|
<else>
|
||||||
|
<text macro="date-of-citation"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
<choose>
|
||||||
|
<if type="article-newspaper">
|
||||||
|
<text variable="page"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
<else-if match="any" type="bill legislation">
|
||||||
|
<date form="text" variable="issued"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="report">
|
||||||
|
<date date-parts="year-month" form="text" variable="issued"/>
|
||||||
|
<text macro="date-of-citation"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="patent">
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text variable="number"/>
|
||||||
|
<date date-parts="year" form="numeric" variable="issued"/>
|
||||||
|
</group>
|
||||||
|
<text macro="date-of-citation"/>
|
||||||
|
</else-if>
|
||||||
|
<else-if type="speech">
|
||||||
|
<group delimiter="; ">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<date form="text" variable="issued"/>
|
||||||
|
<text macro="date-of-citation"/>
|
||||||
|
</group>
|
||||||
|
<text variable="event-place"/>
|
||||||
|
</group>
|
||||||
|
</else-if>
|
||||||
|
<else>
|
||||||
|
<date date-parts="year" form="numeric" variable="issued"/>
|
||||||
|
<text macro="date-of-citation"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="identifier-serial">
|
||||||
|
<choose>
|
||||||
|
<if match="any" type="article-journal article-magazine periodical post-weblog review review-book">
|
||||||
|
<group delimiter=":">
|
||||||
|
<group>
|
||||||
|
<text variable="collection-title"/>
|
||||||
|
<text variable="volume"/>
|
||||||
|
<group delimiter=" " prefix="(" suffix=")">
|
||||||
|
<text variable="issue"/>
|
||||||
|
<text macro="label-supplement-number"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<text macro="location-pagination-serial"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="date-of-citation">
|
||||||
|
<choose>
|
||||||
|
<if variable="URL">
|
||||||
|
<group delimiter=" " prefix="[" suffix="]">
|
||||||
|
<text term="cited"/>
|
||||||
|
<date form="text" variable="accessed"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="location-pagination-monographic">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if match="any" type="article-journal article-magazine article-newspaper review review-book"/>
|
||||||
|
<else-if type="book">
|
||||||
|
<text macro="label-number-of-pages"/>
|
||||||
|
</else-if>
|
||||||
|
<else>
|
||||||
|
<text macro="label-page"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="location-pagination-serial">
|
||||||
|
<choose>
|
||||||
|
<if variable="number">
|
||||||
|
<text variable="number"/>
|
||||||
|
</if>
|
||||||
|
<else>
|
||||||
|
<text variable="page"/>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="webpage-part">
|
||||||
|
<choose>
|
||||||
|
<if type="webpage" variable="container-title">
|
||||||
|
<text variable="title"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="series">
|
||||||
|
<choose>
|
||||||
|
<if match="any" type="article-journal article-magazine article-newspaper periodical post-weblog review review-book"/>
|
||||||
|
<else-if variable="collection-title">
|
||||||
|
<group delimiter=". " prefix="(" suffix=")">
|
||||||
|
<names variable="collection-editor">
|
||||||
|
<label prefix=", "/>
|
||||||
|
</names>
|
||||||
|
<group delimiter="; ">
|
||||||
|
<text variable="collection-title"/>
|
||||||
|
<text macro="label-collection-number"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</else-if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="report-number">
|
||||||
|
<choose>
|
||||||
|
<if type="report">
|
||||||
|
<group delimiter=": ">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text term="report" text-case="capitalize-first"/>
|
||||||
|
<label form="short" text-case="capitalize-first" variable="number"/>
|
||||||
|
</group>
|
||||||
|
<text variable="number"/>
|
||||||
|
</group>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
</macro>
|
||||||
|
<macro name="availability">
|
||||||
|
<group delimiter=". ">
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text text-case="capitalize-first" value="located at"/>
|
||||||
|
<group delimiter="; ">
|
||||||
|
<group delimiter=", ">
|
||||||
|
<text variable="archive_collection"/>
|
||||||
|
<text variable="archive"/>
|
||||||
|
<text variable="archive-place"/>
|
||||||
|
</group>
|
||||||
|
<text variable="archive_location"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<choose>
|
||||||
|
<if type="article-journal" variable="DOI"/>
|
||||||
|
<else-if type="article-journal" variable="PMID"/>
|
||||||
|
<else-if type="article-journal" variable="PMCID"/>
|
||||||
|
<else>
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text term="available at" text-case="capitalize-first"/>
|
||||||
|
<text variable="URL"/>
|
||||||
|
</group>
|
||||||
|
</else>
|
||||||
|
</choose>
|
||||||
|
<text prefix="doi:" variable="DOI"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<macro name="notes">
|
||||||
|
<group delimiter=". " suffix=".">
|
||||||
|
<group delimiter="; ">
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text value="PubMed PMID"/>
|
||||||
|
<text variable="PMID"/>
|
||||||
|
</group>
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text value="PubMed Central PMCID"/>
|
||||||
|
<text variable="PMCID"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<text variable="references"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<citation collapse="citation-number">
|
||||||
|
<sort>
|
||||||
|
<key variable="citation-number"/>
|
||||||
|
</sort>
|
||||||
|
<layout delimiter="," prefix="(" suffix=")">
|
||||||
|
<text variable="citation-number"/>
|
||||||
|
</layout>
|
||||||
|
</citation>
|
||||||
|
<macro name="bibliography">
|
||||||
|
<group delimiter=" ">
|
||||||
|
<group delimiter=". " suffix=".">
|
||||||
|
<text macro="author"/>
|
||||||
|
<group delimiter=" ">
|
||||||
|
<text macro="title"/>
|
||||||
|
<text macro="content-type" prefix="[" suffix="]"/>
|
||||||
|
<choose>
|
||||||
|
<if type="webpage" variable="container-title">
|
||||||
|
<text macro="type-of-medium" prefix="[" suffix="]"/>
|
||||||
|
</if>
|
||||||
|
<else-if match="none" variable="container-title">
|
||||||
|
<text macro="type-of-medium" prefix="[" suffix="]"/>
|
||||||
|
</else-if>
|
||||||
|
</choose>
|
||||||
|
</group>
|
||||||
|
<choose>
|
||||||
|
<if match="none" variable="container-title">
|
||||||
|
<text macro="label-edition"/>
|
||||||
|
</if>
|
||||||
|
</choose>
|
||||||
|
<group delimiter=": ">
|
||||||
|
<text macro="container-preposition"/>
|
||||||
|
<group delimiter=". ">
|
||||||
|
<text macro="secondary-authors"/>
|
||||||
|
<text macro="container-title"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group delimiter="; ">
|
||||||
|
<text macro="publisher"/>
|
||||||
|
<group delimiter=";">
|
||||||
|
<text macro="date"/>
|
||||||
|
<text macro="identifier-serial"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<text macro="location-pagination-monographic"/>
|
||||||
|
<text macro="webpage-part"/>
|
||||||
|
<text macro="series"/>
|
||||||
|
<text macro="report-number"/>
|
||||||
|
</group>
|
||||||
|
<text macro="availability"/>
|
||||||
|
<text macro="notes"/>
|
||||||
|
</group>
|
||||||
|
</macro>
|
||||||
|
<bibliography et-al-min="7" et-al-use-first="6" second-field-align="flush">
|
||||||
|
<layout>
|
||||||
|
<text suffix="." variable="citation-number"/>
|
||||||
|
<text macro="bibliography"/>
|
||||||
|
</layout>
|
||||||
|
</bibliography>
|
||||||
|
</style>
|
||||||
+2
-1
@@ -2,10 +2,11 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@supabase/supabase-js": "^2.90.1",
|
"@supabase/supabase-js": "^2.90.1",
|
||||||
"@toon-format/toon": "^2.1.0",
|
"@toon-format/toon": "^2.1.0",
|
||||||
|
"citeproc": "^2.4.63",
|
||||||
"deno": "^2.6.4",
|
"deno": "^2.6.4",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
"openai": "^6.16.0",
|
"openai": "^6.16.0",
|
||||||
"supabase": "^2.72.6"
|
"supabase": "2.75.0"
|
||||||
},
|
},
|
||||||
"name": "genesis-2",
|
"name": "genesis-2",
|
||||||
"module": "index.ts",
|
"module": "index.ts",
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
postgresql://postgres.bxkskdxwppdlplrkidcz@aws-1-us-east-2.pooler.supabase.com:5432/postgres
|
postgresql://postgres.exdkssurzmjnnhgtiama@aws-0-us-west-1.pooler.supabase.com:5432/postgres
|
||||||
@@ -1 +1 @@
|
|||||||
17.6.1.063
|
15.8.1.085
|
||||||
@@ -1 +1 @@
|
|||||||
bxkskdxwppdlplrkidcz
|
exdkssurzmjnnhgtiama
|
||||||
@@ -1 +1 @@
|
|||||||
v14.1
|
v12.2.3
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
[db]
|
||||||
|
major_version = 15
|
||||||
|
|
||||||
[functions.ai-generate-plan]
|
[functions.ai-generate-plan]
|
||||||
enabled = true
|
enabled = true
|
||||||
@@ -63,3 +65,14 @@ entrypoint = "./functions/openai-webhook-responses/index.ts"
|
|||||||
# Specifies static files to be bundled with the function. Supports glob patterns.
|
# Specifies static files to be bundled with the function. Supports glob patterns.
|
||||||
# For example, if you want to serve static HTML pages in your function:
|
# For example, if you want to serve static HTML pages in your function:
|
||||||
# static_files = [ "./functions/openai-webhook-responses/*.html" ]
|
# static_files = [ "./functions/openai-webhook-responses/*.html" ]
|
||||||
|
|
||||||
|
[functions.buscar-bibliografia]
|
||||||
|
enabled = true
|
||||||
|
verify_jwt = true
|
||||||
|
import_map = "./functions/buscar-bibliografia/deno.json"
|
||||||
|
# Uncomment to specify a custom file path to the entrypoint.
|
||||||
|
# Supported file extensions are: .ts, .js, .mjs, .jsx, .tsx
|
||||||
|
entrypoint = "./functions/buscar-bibliografia/index.ts"
|
||||||
|
# Specifies static files to be bundled with the function. Supports glob patterns.
|
||||||
|
# For example, if you want to serve static HTML pages in your function:
|
||||||
|
# static_files = [ "./functions/buscar-bibliografia/*.html" ]
|
||||||
|
|||||||
@@ -81,6 +81,56 @@ export type Database = {
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
asignatura_mensajes_ia: {
|
||||||
|
Row: {
|
||||||
|
campos: string[]
|
||||||
|
conversacion_asignatura_id: string
|
||||||
|
enviado_por: string
|
||||||
|
estado: Database["public"]["Enums"]["estado_mensaje_ia"]
|
||||||
|
fecha_actualizacion: string
|
||||||
|
fecha_creacion: string
|
||||||
|
id: string
|
||||||
|
is_refusal: boolean
|
||||||
|
mensaje: string
|
||||||
|
propuesta: Json | null
|
||||||
|
respuesta: string | null
|
||||||
|
}
|
||||||
|
Insert: {
|
||||||
|
campos?: string[]
|
||||||
|
conversacion_asignatura_id: string
|
||||||
|
enviado_por?: string
|
||||||
|
estado?: Database["public"]["Enums"]["estado_mensaje_ia"]
|
||||||
|
fecha_actualizacion?: string
|
||||||
|
fecha_creacion?: string
|
||||||
|
id?: string
|
||||||
|
is_refusal?: boolean
|
||||||
|
mensaje: string
|
||||||
|
propuesta?: Json | null
|
||||||
|
respuesta?: string | null
|
||||||
|
}
|
||||||
|
Update: {
|
||||||
|
campos?: string[]
|
||||||
|
conversacion_asignatura_id?: string
|
||||||
|
enviado_por?: string
|
||||||
|
estado?: Database["public"]["Enums"]["estado_mensaje_ia"]
|
||||||
|
fecha_actualizacion?: string
|
||||||
|
fecha_creacion?: string
|
||||||
|
id?: string
|
||||||
|
is_refusal?: boolean
|
||||||
|
mensaje?: string
|
||||||
|
propuesta?: Json | null
|
||||||
|
respuesta?: string | null
|
||||||
|
}
|
||||||
|
Relationships: [
|
||||||
|
{
|
||||||
|
foreignKeyName: "asignatura_mensajes_ia_conversacion_asignatura_id_fkey"
|
||||||
|
columns: ["conversacion_asignatura_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "conversaciones_asignatura"
|
||||||
|
referencedColumns: ["id"]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
asignaturas: {
|
asignaturas: {
|
||||||
Row: {
|
Row: {
|
||||||
actualizado_en: string
|
actualizado_en: string
|
||||||
@@ -91,6 +141,7 @@ export type Database = {
|
|||||||
creado_en: string
|
creado_en: string
|
||||||
creado_por: string | null
|
creado_por: string | null
|
||||||
creditos: number
|
creditos: number
|
||||||
|
criterios_de_evaluacion: Json
|
||||||
datos: Json
|
datos: Json
|
||||||
estado: Database["public"]["Enums"]["estado_asignatura"]
|
estado: Database["public"]["Enums"]["estado_asignatura"]
|
||||||
estructura_id: string | null
|
estructura_id: string | null
|
||||||
@@ -115,6 +166,7 @@ export type Database = {
|
|||||||
creado_en?: string
|
creado_en?: string
|
||||||
creado_por?: string | null
|
creado_por?: string | null
|
||||||
creditos: number
|
creditos: number
|
||||||
|
criterios_de_evaluacion?: Json
|
||||||
datos?: Json
|
datos?: Json
|
||||||
estado?: Database["public"]["Enums"]["estado_asignatura"]
|
estado?: Database["public"]["Enums"]["estado_asignatura"]
|
||||||
estructura_id?: string | null
|
estructura_id?: string | null
|
||||||
@@ -139,6 +191,7 @@ export type Database = {
|
|||||||
creado_en?: string
|
creado_en?: string
|
||||||
creado_por?: string | null
|
creado_por?: string | null
|
||||||
creditos?: number
|
creditos?: number
|
||||||
|
criterios_de_evaluacion?: Json
|
||||||
datos?: Json
|
datos?: Json
|
||||||
estado?: Database["public"]["Enums"]["estado_asignatura"]
|
estado?: Database["public"]["Enums"]["estado_asignatura"]
|
||||||
estructura_id?: string | null
|
estructura_id?: string | null
|
||||||
@@ -176,6 +229,13 @@ export type Database = {
|
|||||||
referencedRelation: "estructuras_asignatura"
|
referencedRelation: "estructuras_asignatura"
|
||||||
referencedColumns: ["id"]
|
referencedColumns: ["id"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
foreignKeyName: "asignaturas_estructura_id_fkey"
|
||||||
|
columns: ["estructura_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "plantilla_asignatura"
|
||||||
|
referencedColumns: ["estructura_id"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
foreignKeyName: "asignaturas_linea_plan_fk_compuesta"
|
foreignKeyName: "asignaturas_linea_plan_fk_compuesta"
|
||||||
columns: ["linea_plan_id", "plan_estudio_id"]
|
columns: ["linea_plan_id", "plan_estudio_id"]
|
||||||
@@ -241,6 +301,13 @@ export type Database = {
|
|||||||
referencedRelation: "asignaturas"
|
referencedRelation: "asignaturas"
|
||||||
referencedColumns: ["id"]
|
referencedColumns: ["id"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
foreignKeyName: "bibliografia_asignatura_asignatura_id_fkey"
|
||||||
|
columns: ["asignatura_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "plantilla_asignatura"
|
||||||
|
referencedColumns: ["asignatura_id"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
foreignKeyName: "bibliografia_asignatura_creado_por_fkey"
|
foreignKeyName: "bibliografia_asignatura_creado_por_fkey"
|
||||||
columns: ["creado_por"]
|
columns: ["creado_por"]
|
||||||
@@ -295,6 +362,13 @@ export type Database = {
|
|||||||
referencedRelation: "asignaturas"
|
referencedRelation: "asignaturas"
|
||||||
referencedColumns: ["id"]
|
referencedColumns: ["id"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
foreignKeyName: "cambios_asignatura_asignatura_id_fkey"
|
||||||
|
columns: ["asignatura_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "plantilla_asignatura"
|
||||||
|
referencedColumns: ["asignatura_id"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
foreignKeyName: "cambios_asignatura_cambiado_por_fkey"
|
foreignKeyName: "cambios_asignatura_cambiado_por_fkey"
|
||||||
columns: ["cambiado_por"]
|
columns: ["cambiado_por"]
|
||||||
@@ -441,6 +515,13 @@ export type Database = {
|
|||||||
referencedRelation: "asignaturas"
|
referencedRelation: "asignaturas"
|
||||||
referencedColumns: ["id"]
|
referencedColumns: ["id"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
foreignKeyName: "conversaciones_asignatura_asignatura_id_fkey"
|
||||||
|
columns: ["asignatura_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "plantilla_asignatura"
|
||||||
|
referencedColumns: ["asignatura_id"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
foreignKeyName: "conversaciones_asignatura_creado_por_fkey"
|
foreignKeyName: "conversaciones_asignatura_creado_por_fkey"
|
||||||
columns: ["creado_por"]
|
columns: ["creado_por"]
|
||||||
@@ -552,7 +633,8 @@ export type Database = {
|
|||||||
definicion: Json
|
definicion: Json
|
||||||
id: string
|
id: string
|
||||||
nombre: string
|
nombre: string
|
||||||
version: string | null
|
template_id: string | null
|
||||||
|
tipo: Database["public"]["Enums"]["tipo_estructura_plan"] | null
|
||||||
}
|
}
|
||||||
Insert: {
|
Insert: {
|
||||||
actualizado_en?: string
|
actualizado_en?: string
|
||||||
@@ -560,7 +642,8 @@ export type Database = {
|
|||||||
definicion?: Json
|
definicion?: Json
|
||||||
id?: string
|
id?: string
|
||||||
nombre: string
|
nombre: string
|
||||||
version?: string | null
|
template_id?: string | null
|
||||||
|
tipo?: Database["public"]["Enums"]["tipo_estructura_plan"] | null
|
||||||
}
|
}
|
||||||
Update: {
|
Update: {
|
||||||
actualizado_en?: string
|
actualizado_en?: string
|
||||||
@@ -568,7 +651,8 @@ export type Database = {
|
|||||||
definicion?: Json
|
definicion?: Json
|
||||||
id?: string
|
id?: string
|
||||||
nombre?: string
|
nombre?: string
|
||||||
version?: string | null
|
template_id?: string | null
|
||||||
|
tipo?: Database["public"]["Enums"]["tipo_estructura_plan"] | null
|
||||||
}
|
}
|
||||||
Relationships: []
|
Relationships: []
|
||||||
}
|
}
|
||||||
@@ -692,6 +776,13 @@ export type Database = {
|
|||||||
referencedRelation: "asignaturas"
|
referencedRelation: "asignaturas"
|
||||||
referencedColumns: ["id"]
|
referencedColumns: ["id"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
foreignKeyName: "interacciones_ia_asignatura_id_fkey"
|
||||||
|
columns: ["asignatura_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "plantilla_asignatura"
|
||||||
|
referencedColumns: ["asignatura_id"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
foreignKeyName: "interacciones_ia_plan_estudio_id_fkey"
|
foreignKeyName: "interacciones_ia_plan_estudio_id_fkey"
|
||||||
columns: ["plan_estudio_id"]
|
columns: ["plan_estudio_id"]
|
||||||
@@ -798,6 +889,56 @@ export type Database = {
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
plan_mensajes_ia: {
|
||||||
|
Row: {
|
||||||
|
campos: string[]
|
||||||
|
conversacion_plan_id: string
|
||||||
|
enviado_por: string
|
||||||
|
estado: Database["public"]["Enums"]["estado_mensaje_ia"]
|
||||||
|
fecha_actualizacion: string
|
||||||
|
fecha_creacion: string
|
||||||
|
id: string
|
||||||
|
is_refusal: boolean
|
||||||
|
mensaje: string
|
||||||
|
propuesta: Json | null
|
||||||
|
respuesta: string | null
|
||||||
|
}
|
||||||
|
Insert: {
|
||||||
|
campos?: string[]
|
||||||
|
conversacion_plan_id: string
|
||||||
|
enviado_por?: string
|
||||||
|
estado?: Database["public"]["Enums"]["estado_mensaje_ia"]
|
||||||
|
fecha_actualizacion?: string
|
||||||
|
fecha_creacion?: string
|
||||||
|
id?: string
|
||||||
|
is_refusal?: boolean
|
||||||
|
mensaje: string
|
||||||
|
propuesta?: Json | null
|
||||||
|
respuesta?: string | null
|
||||||
|
}
|
||||||
|
Update: {
|
||||||
|
campos?: string[]
|
||||||
|
conversacion_plan_id?: string
|
||||||
|
enviado_por?: string
|
||||||
|
estado?: Database["public"]["Enums"]["estado_mensaje_ia"]
|
||||||
|
fecha_actualizacion?: string
|
||||||
|
fecha_creacion?: string
|
||||||
|
id?: string
|
||||||
|
is_refusal?: boolean
|
||||||
|
mensaje?: string
|
||||||
|
propuesta?: Json | null
|
||||||
|
respuesta?: string | null
|
||||||
|
}
|
||||||
|
Relationships: [
|
||||||
|
{
|
||||||
|
foreignKeyName: "plan_mensajes_ia_conversacion_plan_id_fkey"
|
||||||
|
columns: ["conversacion_plan_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "conversaciones_plan"
|
||||||
|
referencedColumns: ["id"]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
planes_estudio: {
|
planes_estudio: {
|
||||||
Row: {
|
Row: {
|
||||||
activo: boolean
|
activo: boolean
|
||||||
@@ -934,6 +1075,13 @@ export type Database = {
|
|||||||
referencedRelation: "asignaturas"
|
referencedRelation: "asignaturas"
|
||||||
referencedColumns: ["id"]
|
referencedColumns: ["id"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
foreignKeyName: "responsables_asignatura_asignatura_id_fkey"
|
||||||
|
columns: ["asignatura_id"]
|
||||||
|
isOneToOne: false
|
||||||
|
referencedRelation: "plantilla_asignatura"
|
||||||
|
referencedColumns: ["asignatura_id"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
foreignKeyName: "responsables_asignatura_usuario_id_fkey"
|
foreignKeyName: "responsables_asignatura_usuario_id_fkey"
|
||||||
columns: ["usuario_id"]
|
columns: ["usuario_id"]
|
||||||
@@ -1199,6 +1347,14 @@ export type Database = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Views: {
|
Views: {
|
||||||
|
plantilla_asignatura: {
|
||||||
|
Row: {
|
||||||
|
asignatura_id: string | null
|
||||||
|
estructura_id: string | null
|
||||||
|
template_id: string | null
|
||||||
|
}
|
||||||
|
Relationships: []
|
||||||
|
}
|
||||||
plantilla_plan: {
|
plantilla_plan: {
|
||||||
Row: {
|
Row: {
|
||||||
estructura_id: string | null
|
estructura_id: string | null
|
||||||
@@ -1221,13 +1377,9 @@ export type Database = {
|
|||||||
unaccent_immutable: { Args: { "": string }; Returns: string }
|
unaccent_immutable: { Args: { "": string }; Returns: string }
|
||||||
}
|
}
|
||||||
Enums: {
|
Enums: {
|
||||||
estado_asignatura:
|
estado_asignatura: "borrador" | "revisada" | "aprobada" | "generando"
|
||||||
| "borrador"
|
|
||||||
| "revisada"
|
|
||||||
| "aprobada"
|
|
||||||
| "generando"
|
|
||||||
| "fallida"
|
|
||||||
estado_conversacion: "ACTIVA" | "ARCHIVANDO" | "ARCHIVADA" | "ERROR"
|
estado_conversacion: "ACTIVA" | "ARCHIVANDO" | "ARCHIVADA" | "ERROR"
|
||||||
|
estado_mensaje_ia: "PROCESANDO" | "COMPLETADO" | "ERROR"
|
||||||
estado_tarea_revision: "PENDIENTE" | "COMPLETADA" | "OMITIDA"
|
estado_tarea_revision: "PENDIENTE" | "COMPLETADA" | "OMITIDA"
|
||||||
fuente_cambio: "HUMANO" | "IA"
|
fuente_cambio: "HUMANO" | "IA"
|
||||||
nivel_plan_estudio:
|
nivel_plan_estudio:
|
||||||
@@ -1400,14 +1552,9 @@ export const Constants = {
|
|||||||
},
|
},
|
||||||
public: {
|
public: {
|
||||||
Enums: {
|
Enums: {
|
||||||
estado_asignatura: [
|
estado_asignatura: ["borrador", "revisada", "aprobada", "generando"],
|
||||||
"borrador",
|
|
||||||
"revisada",
|
|
||||||
"aprobada",
|
|
||||||
"generando",
|
|
||||||
"fallida",
|
|
||||||
],
|
|
||||||
estado_conversacion: ["ACTIVA", "ARCHIVANDO", "ARCHIVADA", "ERROR"],
|
estado_conversacion: ["ACTIVA", "ARCHIVANDO", "ARCHIVADA", "ERROR"],
|
||||||
|
estado_mensaje_ia: ["PROCESANDO", "COMPLETADO", "ERROR"],
|
||||||
estado_tarea_revision: ["PENDIENTE", "COMPLETADA", "OMITIDA"],
|
estado_tarea_revision: ["PENDIENTE", "COMPLETADA", "OMITIDA"],
|
||||||
fuente_cambio: ["HUMANO", "IA"],
|
fuente_cambio: ["HUMANO", "IA"],
|
||||||
nivel_plan_estudio: [
|
nivel_plan_estudio: [
|
||||||
|
|||||||
@@ -414,10 +414,9 @@ Deno.serve(async (req: Request): Promise<Response> => {
|
|||||||
estructura_id: resolved.estructura_id as string,
|
estructura_id: resolved.estructura_id as string,
|
||||||
nombre: resolved.nombre as string,
|
nombre: resolved.nombre as string,
|
||||||
codigo: resolved.codigo ?? null,
|
codigo: resolved.codigo ?? null,
|
||||||
tipo:
|
tipo: (resolved.tipo ?? undefined) as Database["public"]["Tables"][
|
||||||
(resolved.tipo ?? undefined) as Database["public"]["Tables"][
|
"asignaturas"
|
||||||
"asignaturas"
|
]["Insert"]["tipo"],
|
||||||
]["Insert"]["tipo"],
|
|
||||||
creditos: resolved.creditos as number,
|
creditos: resolved.creditos as number,
|
||||||
horas_academicas: resolved.horas_academicas ?? null,
|
horas_academicas: resolved.horas_academicas ?? null,
|
||||||
horas_independientes: resolved.horas_independientes ?? null,
|
horas_independientes: resolved.horas_independientes ?? null,
|
||||||
@@ -509,10 +508,11 @@ Deno.serve(async (req: Request): Promise<Response> => {
|
|||||||
iaConfig.instruccionesAdicionalesIA ?? "(ninguna)"
|
iaConfig.instruccionesAdicionalesIA ?? "(ninguna)"
|
||||||
}` +
|
}` +
|
||||||
archivosAdjuntosTexto +
|
archivosAdjuntosTexto +
|
||||||
`\n\nREGLA ESTRICTA MATEMÁTICA:\n` +
|
`\n\nREGLAS ESTRICTAS MATEMÁTICAS:\n` +
|
||||||
`Si generas el 'contenido_tematico', la suma total de las 'horasEstimadas' de todos los temas en todas las unidades DEBE coincidir exactamente con el total de Horas académicas indicadas arriba (${
|
`- Si generas el 'contenido_tematico', la suma total de las 'horasEstimadas' de todos los temas en todas las unidades DEBE coincidir exactamente con el total de Horas académicas indicadas arriba (${
|
||||||
resolved.horas_academicas ?? 0
|
resolved.horas_academicas ?? 0
|
||||||
}). No te pases ni te falten horas.`;
|
}). No te pases ni te falten horas.\n` +
|
||||||
|
`- Si generas los 'criterios_de_evaluacion', la suma total de los 'porcentajes' de todos los criterios DEBE ser exactamente 100%. No te pases ni te falten porcentajes.`;
|
||||||
|
|
||||||
const schemaDef: Record<string, unknown> =
|
const schemaDef: Record<string, unknown> =
|
||||||
typeof estructura?.definicion === "object" &&
|
typeof estructura?.definicion === "object" &&
|
||||||
@@ -658,4 +658,39 @@ const definicionesDeEstructurasDeColumnas = {
|
|||||||
],
|
],
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
},
|
},
|
||||||
|
criterios_de_evaluacion: {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"x-column": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"criterios_de_evaluacion",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"x-definicion": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"criterio": {
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"porcentaje": {
|
||||||
|
"type": "integer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"criterio",
|
||||||
|
"porcentaje",
|
||||||
|
],
|
||||||
|
"additionalProperties": false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"x-column",
|
||||||
|
"x-definicion",
|
||||||
|
],
|
||||||
|
"additionalProperties": false,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Configuration for private npm package dependencies
|
||||||
|
# For more information on using private registries with Edge Functions, see:
|
||||||
|
# https://supabase.com/docs/guides/functions/import-maps#importing-from-private-registries
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"imports": {
|
||||||
|
"zod": "https://deno.land/x/zod@v3.22.4/mod.ts",
|
||||||
|
"@supabase/functions-js": "jsr:@supabase/functions-js@^2"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
import "@supabase/functions-js/edge-runtime.d.ts";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { corsHeaders } from "../_shared/cors.ts";
|
||||||
|
import { HttpError, sendError, sendSuccess } from "../_shared/utils.ts";
|
||||||
|
|
||||||
|
console.log("Starting buscar-bibliografia function");
|
||||||
|
|
||||||
|
type GoogleBooksVolume = Record<string, unknown>;
|
||||||
|
|
||||||
|
interface GoogleBooksVolumesListResponse {
|
||||||
|
kind?: string;
|
||||||
|
totalItems?: number;
|
||||||
|
items?: GoogleBooksVolume[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const SearchTermsSchema = z
|
||||||
|
.object({
|
||||||
|
q: z.string().min(1, "q es requerido"),
|
||||||
|
maxResults: z.number().int().min(0).max(40),
|
||||||
|
orderBy: z.enum(["newest", "relevance"]).optional(),
|
||||||
|
})
|
||||||
|
.passthrough();
|
||||||
|
|
||||||
|
const BodySchema = z
|
||||||
|
.object({
|
||||||
|
searchTerms: SearchTermsSchema,
|
||||||
|
})
|
||||||
|
.strict();
|
||||||
|
|
||||||
|
type BuscarBibliografiaRequest = z.infer<typeof BodySchema>;
|
||||||
|
|
||||||
|
function formatZodIssues(issues: z.ZodIssue[]): string {
|
||||||
|
return issues
|
||||||
|
.map((issue, i) => {
|
||||||
|
const path = issue.path.length ? issue.path.join(".") : "(root)";
|
||||||
|
return `${i + 1}. ${path}: ${issue.message}`;
|
||||||
|
})
|
||||||
|
.join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildUrlWithSearchTerms(
|
||||||
|
baseUrl: string,
|
||||||
|
searchTerms: Record<string, unknown>,
|
||||||
|
): string {
|
||||||
|
const url = new URL(baseUrl);
|
||||||
|
for (const [key, value] of Object.entries(searchTerms)) {
|
||||||
|
if (value === undefined || value === null) continue;
|
||||||
|
if (Array.isArray(value)) {
|
||||||
|
for (const v of value) {
|
||||||
|
if (v === undefined || v === null) continue;
|
||||||
|
url.searchParams.append(key, String(v));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
url.searchParams.set(key, String(value));
|
||||||
|
}
|
||||||
|
return url.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
Deno.serve(async (req: Request): Promise<Response> => {
|
||||||
|
const url = new URL(req.url);
|
||||||
|
const functionName = url.pathname.split("/").pop();
|
||||||
|
console.log(
|
||||||
|
`[${new Date().toISOString()}][${functionName}]: Request received`,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (req.method === "OPTIONS") {
|
||||||
|
return new Response(null, { status: 204, headers: corsHeaders });
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (req.method !== "POST") {
|
||||||
|
throw new HttpError(405, "Método no permitido.", "METHOD_NOT_ALLOWED", {
|
||||||
|
method: req.method,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const contentType = (req.headers.get("content-type") || "").toLowerCase();
|
||||||
|
if (!contentType.includes("application/json")) {
|
||||||
|
throw new HttpError(
|
||||||
|
415,
|
||||||
|
"Content-Type no soportado.",
|
||||||
|
"UNSUPPORTED_MEDIA_TYPE",
|
||||||
|
{ contentType, expected: "application/json" },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let rawBody: unknown;
|
||||||
|
try {
|
||||||
|
rawBody = await req.json();
|
||||||
|
} catch (e) {
|
||||||
|
throw new HttpError(400, "Body JSON inválido.", "INVALID_JSON", {
|
||||||
|
cause: e,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsed = BodySchema.safeParse(rawBody);
|
||||||
|
if (!parsed.success) {
|
||||||
|
throw new HttpError(
|
||||||
|
422,
|
||||||
|
formatZodIssues(parsed.error.issues),
|
||||||
|
"VALIDATION_ERROR",
|
||||||
|
parsed.error,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const body: BuscarBibliografiaRequest = parsed.data;
|
||||||
|
|
||||||
|
const GOOGLE_API_KEY = Deno.env.get("GOOGLE_API_KEY");
|
||||||
|
if (!GOOGLE_API_KEY) {
|
||||||
|
throw new HttpError(
|
||||||
|
500,
|
||||||
|
"Configuración del servidor incompleta.",
|
||||||
|
"MISSING_ENV",
|
||||||
|
{ missing: ["GOOGLE_API_KEY"] },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseUrl = "https://www.googleapis.com/books/v1/volumes";
|
||||||
|
const requestUrl = buildUrlWithSearchTerms(baseUrl, {
|
||||||
|
...body.searchTerms,
|
||||||
|
key: GOOGLE_API_KEY,
|
||||||
|
});
|
||||||
|
|
||||||
|
const googleResp = await fetch(requestUrl, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!googleResp.ok) {
|
||||||
|
const text = await googleResp.text().catch(() => "");
|
||||||
|
throw new HttpError(
|
||||||
|
502,
|
||||||
|
"Error al consultar Google Books.",
|
||||||
|
"GOOGLE_BOOKS_REQUEST_FAILED",
|
||||||
|
{
|
||||||
|
status: googleResp.status,
|
||||||
|
statusText: googleResp.statusText,
|
||||||
|
body: text || null,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = (await googleResp.json()) as GoogleBooksVolumesListResponse;
|
||||||
|
const items = Array.isArray(data?.items) ? data.items : [];
|
||||||
|
|
||||||
|
return sendSuccess(items);
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof HttpError) {
|
||||||
|
console.error(
|
||||||
|
`[${new Date().toISOString()}][${functionName}] ⚠️ Handled Error:`,
|
||||||
|
{
|
||||||
|
message: error.message,
|
||||||
|
code: error.code,
|
||||||
|
internalDetails: error.internalDetails || "N/A",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return sendError(error.status, error.message, error.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
const unexpectedError = error instanceof Error
|
||||||
|
? error
|
||||||
|
: new Error(String(error));
|
||||||
|
|
||||||
|
console.error(
|
||||||
|
`[${
|
||||||
|
new Date().toISOString()
|
||||||
|
}][${functionName}] 💥 CRITICAL UNHANDLED ERROR:`,
|
||||||
|
unexpectedError.stack || unexpectedError.message,
|
||||||
|
);
|
||||||
|
|
||||||
|
return sendError(
|
||||||
|
500,
|
||||||
|
"Ocurrió un error inesperado en el servidor.",
|
||||||
|
"INTERNAL_SERVER_ERROR",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* To invoke locally:
|
||||||
|
|
||||||
|
1. Run `supabase start` (see: https://supabase.com/docs/reference/cli/supabase-start)
|
||||||
|
2. Make an HTTP request:
|
||||||
|
|
||||||
|
curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/buscar-bibliografia' \
|
||||||
|
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0' \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data '{"name":"Functions"}'
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
alter table "public"."asignaturas" add column "criterios_de_evaluacion" jsonb not null default '[]'::jsonb;
|
||||||
+108
-3
@@ -108,6 +108,16 @@ CREATE TYPE "public"."estado_conversacion" AS ENUM (
|
|||||||
ALTER TYPE "public"."estado_conversacion" OWNER TO "postgres";
|
ALTER TYPE "public"."estado_conversacion" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TYPE "public"."estado_mensaje_ia" AS ENUM (
|
||||||
|
'PROCESANDO',
|
||||||
|
'COMPLETADO',
|
||||||
|
'ERROR'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TYPE "public"."estado_mensaje_ia" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
CREATE TYPE "public"."estado_tarea_revision" AS ENUM (
|
CREATE TYPE "public"."estado_tarea_revision" AS ENUM (
|
||||||
'PENDIENTE',
|
'PENDIENTE',
|
||||||
'COMPLETADA',
|
'COMPLETADA',
|
||||||
@@ -523,6 +533,24 @@ CREATE TABLE IF NOT EXISTS "public"."archivos" (
|
|||||||
ALTER TABLE "public"."archivos" OWNER TO "postgres";
|
ALTER TABLE "public"."archivos" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."asignatura_mensajes_ia" (
|
||||||
|
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
||||||
|
"enviado_por" "uuid" DEFAULT "auth"."uid"() NOT NULL,
|
||||||
|
"mensaje" "text" NOT NULL,
|
||||||
|
"campos" "text"[] DEFAULT '{}'::"text"[] NOT NULL,
|
||||||
|
"respuesta" "text",
|
||||||
|
"is_refusal" boolean DEFAULT false NOT NULL,
|
||||||
|
"propuesta" "jsonb",
|
||||||
|
"estado" "public"."estado_mensaje_ia" DEFAULT 'PROCESANDO'::"public"."estado_mensaje_ia" NOT NULL,
|
||||||
|
"fecha_creacion" timestamp without time zone DEFAULT "now"() NOT NULL,
|
||||||
|
"fecha_actualizacion" timestamp without time zone DEFAULT "now"() NOT NULL,
|
||||||
|
"conversacion_asignatura_id" "uuid" NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE "public"."asignatura_mensajes_ia" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS "public"."asignaturas" (
|
CREATE TABLE IF NOT EXISTS "public"."asignaturas" (
|
||||||
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
||||||
"plan_estudio_id" "uuid" NOT NULL,
|
"plan_estudio_id" "uuid" NOT NULL,
|
||||||
@@ -546,6 +574,7 @@ CREATE TABLE IF NOT EXISTS "public"."asignaturas" (
|
|||||||
"horas_academicas" integer,
|
"horas_academicas" integer,
|
||||||
"horas_independientes" integer,
|
"horas_independientes" integer,
|
||||||
"estado" "public"."estado_asignatura" DEFAULT 'borrador'::"public"."estado_asignatura" NOT NULL,
|
"estado" "public"."estado_asignatura" DEFAULT 'borrador'::"public"."estado_asignatura" NOT NULL,
|
||||||
|
"criterios_de_evaluacion" "jsonb" DEFAULT '[]'::"jsonb" NOT NULL,
|
||||||
CONSTRAINT "asignaturas_ciclo_chk" CHECK ((("numero_ciclo" IS NULL) OR ("numero_ciclo" > 0))),
|
CONSTRAINT "asignaturas_ciclo_chk" CHECK ((("numero_ciclo" IS NULL) OR ("numero_ciclo" > 0))),
|
||||||
CONSTRAINT "asignaturas_creditos_check" CHECK (("creditos" >= (0)::numeric)),
|
CONSTRAINT "asignaturas_creditos_check" CHECK (("creditos" >= (0)::numeric)),
|
||||||
CONSTRAINT "asignaturas_horas_academicas_check" CHECK ((("horas_academicas" IS NULL) OR ("horas_academicas" >= 0))),
|
CONSTRAINT "asignaturas_horas_academicas_check" CHECK ((("horas_academicas" IS NULL) OR ("horas_academicas" >= 0))),
|
||||||
@@ -675,10 +704,11 @@ ALTER TABLE "public"."estados_plan" OWNER TO "postgres";
|
|||||||
CREATE TABLE IF NOT EXISTS "public"."estructuras_asignatura" (
|
CREATE TABLE IF NOT EXISTS "public"."estructuras_asignatura" (
|
||||||
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
||||||
"nombre" "text" NOT NULL,
|
"nombre" "text" NOT NULL,
|
||||||
"version" "text",
|
|
||||||
"definicion" "jsonb" DEFAULT '{}'::"jsonb" NOT NULL,
|
"definicion" "jsonb" DEFAULT '{}'::"jsonb" NOT NULL,
|
||||||
"creado_en" timestamp with time zone DEFAULT "now"() NOT NULL,
|
"creado_en" timestamp with time zone DEFAULT "now"() NOT NULL,
|
||||||
"actualizado_en" timestamp with time zone DEFAULT "now"() NOT NULL
|
"actualizado_en" timestamp with time zone DEFAULT "now"() NOT NULL,
|
||||||
|
"template_id" "text",
|
||||||
|
"tipo" "public"."tipo_estructura_plan"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@@ -763,6 +793,24 @@ CREATE TABLE IF NOT EXISTS "public"."notificaciones" (
|
|||||||
ALTER TABLE "public"."notificaciones" OWNER TO "postgres";
|
ALTER TABLE "public"."notificaciones" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."plan_mensajes_ia" (
|
||||||
|
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
||||||
|
"enviado_por" "uuid" DEFAULT "auth"."uid"() NOT NULL,
|
||||||
|
"mensaje" "text" NOT NULL,
|
||||||
|
"campos" "text"[] DEFAULT '{}'::"text"[] NOT NULL,
|
||||||
|
"respuesta" "text",
|
||||||
|
"is_refusal" boolean DEFAULT false NOT NULL,
|
||||||
|
"propuesta" "jsonb",
|
||||||
|
"estado" "public"."estado_mensaje_ia" DEFAULT 'PROCESANDO'::"public"."estado_mensaje_ia" NOT NULL,
|
||||||
|
"fecha_creacion" timestamp without time zone DEFAULT "now"() NOT NULL,
|
||||||
|
"fecha_actualizacion" timestamp without time zone DEFAULT "now"() NOT NULL,
|
||||||
|
"conversacion_plan_id" "uuid" NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE "public"."plan_mensajes_ia" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS "public"."planes_estudio" (
|
CREATE TABLE IF NOT EXISTS "public"."planes_estudio" (
|
||||||
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
"id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
|
||||||
"carrera_id" "uuid" NOT NULL,
|
"carrera_id" "uuid" NOT NULL,
|
||||||
@@ -789,7 +837,18 @@ CREATE TABLE IF NOT EXISTS "public"."planes_estudio" (
|
|||||||
ALTER TABLE "public"."planes_estudio" OWNER TO "postgres";
|
ALTER TABLE "public"."planes_estudio" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE VIEW "public"."plantilla_plan" AS
|
CREATE OR REPLACE VIEW "public"."plantilla_asignatura" AS
|
||||||
|
SELECT "asignaturas"."id" AS "asignatura_id",
|
||||||
|
"struct"."id" AS "estructura_id",
|
||||||
|
"struct"."template_id"
|
||||||
|
FROM ("public"."asignaturas"
|
||||||
|
JOIN "public"."estructuras_asignatura" "struct" ON (("asignaturas"."estructura_id" = "struct"."id")));
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE "public"."plantilla_asignatura" OWNER TO "postgres";
|
||||||
|
|
||||||
|
|
||||||
|
CREATE OR REPLACE VIEW "public"."plantilla_plan" WITH ("security_invoker"='on') AS
|
||||||
SELECT "plan"."id" AS "plan_estudio_id",
|
SELECT "plan"."id" AS "plan_estudio_id",
|
||||||
"struct"."id" AS "estructura_id",
|
"struct"."id" AS "estructura_id",
|
||||||
"struct"."template_id"
|
"struct"."template_id"
|
||||||
@@ -896,6 +955,11 @@ ALTER TABLE ONLY "public"."archivos"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."asignatura_mensajes_ia"
|
||||||
|
ADD CONSTRAINT "asignatura_mensajes_ia_pkey" PRIMARY KEY ("id");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE ONLY "public"."asignaturas"
|
ALTER TABLE ONLY "public"."asignaturas"
|
||||||
ADD CONSTRAINT "asignaturas_pkey" PRIMARY KEY ("id");
|
ADD CONSTRAINT "asignaturas_pkey" PRIMARY KEY ("id");
|
||||||
|
|
||||||
@@ -991,6 +1055,11 @@ ALTER TABLE ONLY "public"."notificaciones"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."plan_mensajes_ia"
|
||||||
|
ADD CONSTRAINT "plan_mensajes_ia_pkey" PRIMARY KEY ("id");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE ONLY "public"."planes_estudio"
|
ALTER TABLE ONLY "public"."planes_estudio"
|
||||||
ADD CONSTRAINT "planes_estudio_pkey" PRIMARY KEY ("id");
|
ADD CONSTRAINT "planes_estudio_pkey" PRIMARY KEY ("id");
|
||||||
|
|
||||||
@@ -1136,6 +1205,11 @@ ALTER TABLE ONLY "public"."archivos"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."asignatura_mensajes_ia"
|
||||||
|
ADD CONSTRAINT "asignatura_mensajes_ia_conversacion_asignatura_id_fkey" FOREIGN KEY ("conversacion_asignatura_id") REFERENCES "public"."conversaciones_asignatura"("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE ONLY "public"."asignaturas"
|
ALTER TABLE ONLY "public"."asignaturas"
|
||||||
ADD CONSTRAINT "asignaturas_actualizado_por_fkey" FOREIGN KEY ("actualizado_por") REFERENCES "public"."usuarios_app"("id") ON DELETE SET NULL;
|
ADD CONSTRAINT "asignaturas_actualizado_por_fkey" FOREIGN KEY ("actualizado_por") REFERENCES "public"."usuarios_app"("id") ON DELETE SET NULL;
|
||||||
|
|
||||||
@@ -1246,6 +1320,11 @@ ALTER TABLE ONLY "public"."notificaciones"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."plan_mensajes_ia"
|
||||||
|
ADD CONSTRAINT "plan_mensajes_ia_conversacion_plan_id_fkey" FOREIGN KEY ("conversacion_plan_id") REFERENCES "public"."conversaciones_plan"("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE ONLY "public"."planes_estudio"
|
ALTER TABLE ONLY "public"."planes_estudio"
|
||||||
ADD CONSTRAINT "planes_estudio_actualizado_por_fkey" FOREIGN KEY ("actualizado_por") REFERENCES "public"."usuarios_app"("id") ON DELETE SET NULL;
|
ADD CONSTRAINT "planes_estudio_actualizado_por_fkey" FOREIGN KEY ("actualizado_por") REFERENCES "public"."usuarios_app"("id") ON DELETE SET NULL;
|
||||||
|
|
||||||
@@ -1350,6 +1429,14 @@ ALTER PUBLICATION "supabase_realtime" OWNER TO "postgres";
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER PUBLICATION "supabase_realtime" ADD TABLE ONLY "public"."asignaturas";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER PUBLICATION "supabase_realtime" ADD TABLE ONLY "public"."planes_estudio";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1688,6 +1775,12 @@ GRANT ALL ON TABLE "public"."archivos" TO "service_role";
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."asignatura_mensajes_ia" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."asignatura_mensajes_ia" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."asignatura_mensajes_ia" TO "service_role";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GRANT ALL ON TABLE "public"."asignaturas" TO "anon";
|
GRANT ALL ON TABLE "public"."asignaturas" TO "anon";
|
||||||
GRANT ALL ON TABLE "public"."asignaturas" TO "authenticated";
|
GRANT ALL ON TABLE "public"."asignaturas" TO "authenticated";
|
||||||
GRANT ALL ON TABLE "public"."asignaturas" TO "service_role";
|
GRANT ALL ON TABLE "public"."asignaturas" TO "service_role";
|
||||||
@@ -1772,12 +1865,24 @@ GRANT ALL ON TABLE "public"."notificaciones" TO "service_role";
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."plan_mensajes_ia" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."plan_mensajes_ia" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."plan_mensajes_ia" TO "service_role";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GRANT ALL ON TABLE "public"."planes_estudio" TO "anon";
|
GRANT ALL ON TABLE "public"."planes_estudio" TO "anon";
|
||||||
GRANT ALL ON TABLE "public"."planes_estudio" TO "authenticated";
|
GRANT ALL ON TABLE "public"."planes_estudio" TO "authenticated";
|
||||||
GRANT ALL ON TABLE "public"."planes_estudio" TO "service_role";
|
GRANT ALL ON TABLE "public"."planes_estudio" TO "service_role";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."plantilla_asignatura" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."plantilla_asignatura" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."plantilla_asignatura" TO "service_role";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GRANT ALL ON TABLE "public"."plantilla_plan" TO "anon";
|
GRANT ALL ON TABLE "public"."plantilla_plan" TO "anon";
|
||||||
GRANT ALL ON TABLE "public"."plantilla_plan" TO "authenticated";
|
GRANT ALL ON TABLE "public"."plantilla_plan" TO "authenticated";
|
||||||
GRANT ALL ON TABLE "public"."plantilla_plan" TO "service_role";
|
GRANT ALL ON TABLE "public"."plantilla_plan" TO "service_role";
|
||||||
|
|||||||
+217
-26
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user